UI: Add notification setting
This commit is contained in:
parent
73472753d0
commit
6ac0024944
@ -115,7 +115,7 @@ export class MenuService {
|
|||||||
name: 'admin.system-settings',
|
name: 'admin.system-settings',
|
||||||
type: 'toggle',
|
type: 'toggle',
|
||||||
path: '/settings',
|
path: '/settings',
|
||||||
height: '320px',
|
height: '360px',
|
||||||
icon: 'settings',
|
icon: 'settings',
|
||||||
pages: [
|
pages: [
|
||||||
{
|
{
|
||||||
@ -139,6 +139,13 @@ export class MenuService {
|
|||||||
path: '/settings/sms-provider',
|
path: '/settings/sms-provider',
|
||||||
icon: 'sms'
|
icon: 'sms'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: guid(),
|
||||||
|
name: 'notification.notification',
|
||||||
|
type: 'link',
|
||||||
|
path: '/settings/notification',
|
||||||
|
icon: 'notifications'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: guid(),
|
id: guid(),
|
||||||
name: 'admin.security-settings',
|
name: 'admin.security-settings',
|
||||||
@ -238,6 +245,11 @@ export class MenuService {
|
|||||||
icon: 'sms',
|
icon: 'sms',
|
||||||
path: '/settings/sms-provider'
|
path: '/settings/sms-provider'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'notification.notification',
|
||||||
|
icon: 'notifications',
|
||||||
|
path: '/settings/notification'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'admin.security-settings',
|
name: 'admin.security-settings',
|
||||||
icon: 'security',
|
icon: 'security',
|
||||||
@ -425,7 +437,7 @@ export class MenuService {
|
|||||||
name: 'admin.system-settings',
|
name: 'admin.system-settings',
|
||||||
type: 'toggle',
|
type: 'toggle',
|
||||||
path: '/settings',
|
path: '/settings',
|
||||||
height: '160px',
|
height: '200px',
|
||||||
icon: 'settings',
|
icon: 'settings',
|
||||||
pages: [
|
pages: [
|
||||||
{
|
{
|
||||||
@ -435,6 +447,13 @@ export class MenuService {
|
|||||||
path: '/settings/home',
|
path: '/settings/home',
|
||||||
icon: 'settings_applications'
|
icon: 'settings_applications'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: guid(),
|
||||||
|
name: 'notification.notification',
|
||||||
|
type: 'link',
|
||||||
|
path: '/settings/notification',
|
||||||
|
icon: 'notifications'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: guid(),
|
id: guid(),
|
||||||
name: 'resource.resources-library',
|
name: 'resource.resources-library',
|
||||||
@ -611,6 +630,11 @@ export class MenuService {
|
|||||||
icon: 'settings_applications',
|
icon: 'settings_applications',
|
||||||
path: '/settings/home'
|
path: '/settings/home'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'notification.notification',
|
||||||
|
icon: 'notifications',
|
||||||
|
path: '/settings/notification'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'resource.resources-library',
|
name: 'resource.resources-library',
|
||||||
icon: 'folder',
|
icon: 'folder',
|
||||||
|
|||||||
@ -36,6 +36,7 @@ import { QueuesTableConfigResolver } from '@home/pages/admin/queue/queues-table-
|
|||||||
import { RepositoryAdminSettingsComponent } from '@home/pages/admin/repository-admin-settings.component';
|
import { RepositoryAdminSettingsComponent } from '@home/pages/admin/repository-admin-settings.component';
|
||||||
import { AutoCommitAdminSettingsComponent } from '@home/pages/admin/auto-commit-admin-settings.component';
|
import { AutoCommitAdminSettingsComponent } from '@home/pages/admin/auto-commit-admin-settings.component';
|
||||||
import { TwoFactorAuthSettingsComponent } from '@home/pages/admin/two-factor-auth-settings.component';
|
import { TwoFactorAuthSettingsComponent } from '@home/pages/admin/two-factor-auth-settings.component';
|
||||||
|
import { NotificationSettingsComponent } from '@home/pages/admin/notification-settings.component';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class OAuth2LoginProcessingUrlResolver implements Resolve<string> {
|
export class OAuth2LoginProcessingUrlResolver implements Resolve<string> {
|
||||||
@ -150,6 +151,19 @@ const routes: Routes = [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'notification',
|
||||||
|
component: NotificationSettingsComponent,
|
||||||
|
canDeactivate: [ConfirmOnExitGuard],
|
||||||
|
data: {
|
||||||
|
auth: [Authority.TENANT_ADMIN, Authority.SYS_ADMIN],
|
||||||
|
title: 'admin.notification.notification-settings',
|
||||||
|
breadcrumb: {
|
||||||
|
label: 'admin.notification.notification-settings',
|
||||||
|
icon: 'notifications'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'resources-library',
|
path: 'resources-library',
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@ -32,6 +32,7 @@ import { QueueComponent} from '@home/pages/admin/queue/queue.component';
|
|||||||
import { RepositoryAdminSettingsComponent } from '@home/pages/admin/repository-admin-settings.component';
|
import { RepositoryAdminSettingsComponent } from '@home/pages/admin/repository-admin-settings.component';
|
||||||
import { AutoCommitAdminSettingsComponent } from '@home/pages/admin/auto-commit-admin-settings.component';
|
import { AutoCommitAdminSettingsComponent } from '@home/pages/admin/auto-commit-admin-settings.component';
|
||||||
import { TwoFactorAuthSettingsComponent } from '@home/pages/admin/two-factor-auth-settings.component';
|
import { TwoFactorAuthSettingsComponent } from '@home/pages/admin/two-factor-auth-settings.component';
|
||||||
|
import { NotificationSettingsComponent } from '@home/pages/admin/notification-settings.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations:
|
declarations:
|
||||||
@ -47,7 +48,8 @@ import { TwoFactorAuthSettingsComponent } from '@home/pages/admin/two-factor-aut
|
|||||||
QueueComponent,
|
QueueComponent,
|
||||||
RepositoryAdminSettingsComponent,
|
RepositoryAdminSettingsComponent,
|
||||||
AutoCommitAdminSettingsComponent,
|
AutoCommitAdminSettingsComponent,
|
||||||
TwoFactorAuthSettingsComponent
|
TwoFactorAuthSettingsComponent,
|
||||||
|
NotificationSettingsComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
|||||||
@ -0,0 +1,47 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright © 2016-2022 The Thingsboard Authors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<div>
|
||||||
|
<mat-card class="settings-card">
|
||||||
|
<mat-card-title>
|
||||||
|
<div fxLayout="row">
|
||||||
|
<span class="mat-headline" translate>admin.notification.notification-settings</span>
|
||||||
|
</div>
|
||||||
|
</mat-card-title>
|
||||||
|
<mat-progress-bar color="warn" mode="indeterminate" *ngIf="isLoading$ | async">
|
||||||
|
</mat-progress-bar>
|
||||||
|
<div style="height: 4px;" *ngIf="!(isLoading$ | async)"></div>
|
||||||
|
<mat-card-content style="padding-top: 16px;">
|
||||||
|
<form [formGroup]="notificationSettingsForm" (ngSubmit)="save()">
|
||||||
|
<fieldset [disabled]="isLoading$ | async" formGroupName="deliveryMethodsConfigs">
|
||||||
|
<fieldset class="fields-group" formGroupName="SLACK">
|
||||||
|
<legend class="group-title" translate>admin.notification.slack</legend>
|
||||||
|
<mat-form-field class="mat-block">
|
||||||
|
<mat-label translate>admin.notification.slack-api-token</mat-label>
|
||||||
|
<input matInput formControlName="botToken" />
|
||||||
|
</mat-form-field>
|
||||||
|
</fieldset>
|
||||||
|
<div fxLayout="row" fxLayoutAlign="end center" class="layout-wrap">
|
||||||
|
<button mat-button mat-raised-button color="primary" [disabled]="(isLoading$ | async) || notificationSettingsForm.invalid || !notificationSettingsForm.dirty"
|
||||||
|
type="submit">{{'action.save' | translate}}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</mat-card-content>
|
||||||
|
</mat-card>
|
||||||
|
</div>
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
///
|
||||||
|
/// Copyright © 2016-2022 The Thingsboard Authors
|
||||||
|
///
|
||||||
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
/// you may not use this file except in compliance with the License.
|
||||||
|
/// You may obtain a copy of the License at
|
||||||
|
///
|
||||||
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
///
|
||||||
|
/// Unless required by applicable law or agreed to in writing, software
|
||||||
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
/// See the License for the specific language governing permissions and
|
||||||
|
/// limitations under the License.
|
||||||
|
///
|
||||||
|
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
import { AppState } from '@core/core.state';
|
||||||
|
import { PageComponent } from '@shared/components/page.component';
|
||||||
|
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||||
|
import { HasConfirmForm } from '@core/guards/confirm-on-exit.guard';
|
||||||
|
import { NotificationService } from '@core/http/notification.service';
|
||||||
|
import { NotificationSettings } from '@shared/models/notification.models';
|
||||||
|
import { deepTrim, isEmptyStr } from '@core/utils';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'tb-notification-settings',
|
||||||
|
templateUrl: './notification-settings.component.html',
|
||||||
|
styleUrls: ['./settings-card.scss']
|
||||||
|
})
|
||||||
|
export class NotificationSettingsComponent extends PageComponent implements OnInit, HasConfirmForm {
|
||||||
|
|
||||||
|
notificationSettingsForm: FormGroup;
|
||||||
|
private notificationSettings: NotificationSettings;
|
||||||
|
|
||||||
|
constructor(protected store: Store<AppState>,
|
||||||
|
private notificationService: NotificationService,
|
||||||
|
public fb: FormBuilder) {
|
||||||
|
super(store);
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.buildGeneralServerSettingsForm();
|
||||||
|
this.notificationService.getNotificationSettings().subscribe(
|
||||||
|
(settings) => {
|
||||||
|
this.notificationSettings = settings;
|
||||||
|
this.notificationSettingsForm.reset(this.notificationSettings);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
buildGeneralServerSettingsForm() {
|
||||||
|
this.notificationSettingsForm = this.fb.group({
|
||||||
|
deliveryMethodsConfigs: this.fb.group({
|
||||||
|
SLACK: this.fb.group({
|
||||||
|
botToken: ['']
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
save(): void {
|
||||||
|
this.notificationSettings = deepTrim({
|
||||||
|
...this.notificationSettings,
|
||||||
|
...this.notificationSettingsForm.value
|
||||||
|
});
|
||||||
|
for (const method in this.notificationSettings.deliveryMethodsConfigs) {
|
||||||
|
const keys = Object.keys(this.notificationSettings.deliveryMethodsConfigs[method]);
|
||||||
|
if (keys.some(item => isEmptyStr(this.notificationSettings.deliveryMethodsConfigs[method][item]))) {
|
||||||
|
delete this.notificationSettings.deliveryMethodsConfigs[method];
|
||||||
|
} else {
|
||||||
|
this.notificationSettings.deliveryMethodsConfigs[method].method = method;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.notificationService.saveNotificationSettings(this.notificationSettings).subscribe(setting => {
|
||||||
|
this.notificationSettings = setting;
|
||||||
|
this.notificationSettingsForm.reset(this.notificationSettings);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
confirmForm(): FormGroup {
|
||||||
|
return this.notificationSettingsForm;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -19,6 +19,17 @@
|
|||||||
mat-card.settings-card {
|
mat-card.settings-card {
|
||||||
margin: 8px;
|
margin: 8px;
|
||||||
|
|
||||||
|
.fields-group {
|
||||||
|
padding: 8px 16px 0;
|
||||||
|
margin: 10px 0;
|
||||||
|
border: 1px groove rgba(0, 0, 0, .25);
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
legend {
|
||||||
|
color: rgba(0, 0, 0, .7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media #{$mat-md} {
|
@media #{$mat-md} {
|
||||||
width: 80%;
|
width: 80%;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -208,12 +208,12 @@
|
|||||||
required
|
required
|
||||||
formControlName="targets"
|
formControlName="targets"
|
||||||
[entityType]="entityType.NOTIFICATION_TARGET"
|
[entityType]="entityType.NOTIFICATION_TARGET"
|
||||||
placeholderText="notification.target">
|
placeholderText="{{ 'notification.target' | translate }}">
|
||||||
</tb-entity-list>
|
</tb-entity-list>
|
||||||
</section>
|
</section>
|
||||||
</form>
|
</form>
|
||||||
<form [formGroup]="ruleNotificationForm">
|
<form [formGroup]="ruleNotificationForm">
|
||||||
<section formGroupName="additionalConfig">
|
<section formGroupName="additionalConfig">;
|
||||||
<mat-form-field class="mat-block">
|
<mat-form-field class="mat-block">
|
||||||
<mat-label translate>notification.description</mat-label>
|
<mat-label translate>notification.description</mat-label>
|
||||||
<input matInput formControlName="description">
|
<input matInput formControlName="description">
|
||||||
|
|||||||
@ -407,6 +407,11 @@
|
|||||||
"generate-key": "Generate key",
|
"generate-key": "Generate key",
|
||||||
"info-header": "All users will be to re-logined",
|
"info-header": "All users will be to re-logined",
|
||||||
"info-message": "Change of the JWT Signing Key will cause all issued tokens to be invalid. All users will need to re-login. This will also affect scripts that use Rest API/Websockets."
|
"info-message": "Change of the JWT Signing Key will cause all issued tokens to be invalid. All users will need to re-login. This will also affect scripts that use Rest API/Websockets."
|
||||||
|
},
|
||||||
|
"notification": {
|
||||||
|
"notification-settings": "Notification settings",
|
||||||
|
"slack-api-token": "Slack api token",
|
||||||
|
"slack": "Slack"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alarm": {
|
"alarm": {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user