From 937124fa61a023f79763091c28115ec387d16cd5 Mon Sep 17 00:00:00 2001 From: Dmitriymush Date: Tue, 13 Feb 2024 14:09:38 +0200 Subject: [PATCH 01/22] UI: added workaround for matChipInputAddOnBlur selection bug in tb-entity-subtype-list input --- .../components/entity/entity-subtype-list.component.html | 3 ++- .../components/entity/entity-subtype-list.component.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html index 89c9b2ace8..26fb757c42 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html +++ b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html @@ -31,9 +31,10 @@ style="max-width: 200px;" #entitySubtypeInput (focusin)="onFocus()" + (blur)="addOnBlur($event)" formControlName="entitySubtype" matAutocompleteOrigin - matChipInputAddOnBlur + matChipInputAddOnBlur="false" #origin="matAutocompleteOrigin" [matAutocompleteConnectedTo]="origin" [matAutocomplete]="entitySubtypeAutocomplete" diff --git a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts index 9b49241d50..bc3cde24f5 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts +++ b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts @@ -262,6 +262,15 @@ export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, this.clear(''); } } + + addOnBlur(event: FocusEvent) { + if (!event.relatedTarget) { + return; + } + const value = this.entitySubtypeInput.nativeElement.value; + this.chipAdd({value} as MatChipInputEvent); + } + remove(entitySubtype: string) { const index = this.entitySubtypeList.indexOf(entitySubtype); if (index >= 0) { From eae3d9cdb94b42b3814b2055330f50a36e0e5c4b Mon Sep 17 00:00:00 2001 From: Dmitriymush Date: Tue, 13 Feb 2024 21:12:14 +0200 Subject: [PATCH 02/22] UI: fixed onDashboardStateInputFocus --- .../lib/settings/common/action/widget-action.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts index 6c2cd3fb8f..3fa353623f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts @@ -186,7 +186,7 @@ export class WidgetActionComponent implements ControlValueAccessor, OnInit, Vali } onDashboardStateInputFocus(): void { - this.actionTypeFormGroup.get('targetDashboardStateId').updateValueAndValidity({onlySelf: true, emitEvent: true}); + this.actionTypeFormGroup.get('targetDashboardId').updateValueAndValidity({onlySelf: true, emitEvent: true}); } stateDisplayTypeName(displayType: stateDisplayType): string { From 0bfdd9b27c176768d65a6521be2250a265493f59 Mon Sep 17 00:00:00 2001 From: okolesnyk Date: Tue, 16 May 2023 12:26:10 +0300 Subject: [PATCH 03/22] UI. Device profile > Alarm rules (captions)(PROD-3051) --- .../profile/alarm/device-profile-alarm.component.html | 1 - ui-ngx/src/assets/locale/locale.constant-en_US.json | 2 +- ui-ngx/src/assets/locale/locale.constant-ko_KR.json | 2 +- ui-ngx/src/assets/locale/locale.constant-sl_SI.json | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.html b/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.html index 96494faecd..502d80fb31 100644 --- a/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.html +++ b/ui-ngx/src/app/modules/home/components/profile/alarm/device-profile-alarm.component.html @@ -73,7 +73,6 @@ close Date: Fri, 26 Jan 2024 14:50:30 +0200 Subject: [PATCH 04/22] UI. Signal Strength widget (PROD-2773) --- .../data/json/system/widget_types/signal_strength.json | 2 +- .../indicator/signal-strength-basic-config.component.html | 7 +++++++ .../indicator/signal-strength-basic-config.component.ts | 2 ++ .../lib/indicator/signal-strength-widget.component.ts | 4 +--- .../widget/lib/indicator/signal-strength-widget.models.ts | 2 ++ ui-ngx/src/assets/locale/locale.constant-en_US.json | 6 ++---- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/application/src/main/data/json/system/widget_types/signal_strength.json b/application/src/main/data/json/system/widget_types/signal_strength.json index 62fc0088b6..d48b41e977 100644 --- a/application/src/main/data/json/system/widget_types/signal_strength.json +++ b/application/src/main/data/json/system/widget_types/signal_strength.json @@ -17,7 +17,7 @@ "settingsDirective": "tb-signal-strength-widget-settings", "hasBasicMode": true, "basicModeDirective": "tb-signal-strength-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"rssi\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"if (!prevValue) {\\n prevValue = Math.random() * -96;\\n}\\nvar value = prevValue + (Math.random() * 60 - 30);\\nif (value > 0) {\\n\\tvalue = 0;\\n} else if (value < -96) {\\n value = -96;\\n}\\nlet rand = Math.random();\\nreturn rand < 0.2 ? (rand < 0.1 ? -101 : '') : value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"wifi\",\"showDate\":false,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"activeBarsColor\":{\"color\":\"rgba(92, 223, 144, 1)\",\"type\":\"range\",\"rangeList\":[{\"to\":-85,\"color\":\"rgba(227, 71, 71, 1)\"},{\"from\":-85,\"to\":-70,\"color\":\"rgba(255, 122, 0, 1)\"},{\"from\":-70,\"to\":-55,\"color\":\"rgba(246, 206, 67, 1)\"},{\"from\":-55,\"color\":\"rgba(92, 223, 144, 1)\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"inactiveBarsColor\":\"rgba(224, 224, 224, 1)\",\"showTooltip\":true,\"showTooltipValue\":true,\"tooltipValueFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"16px\"},\"tooltipValueColor\":\"rgba(0,0,0,0.76)\",\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"16px\"},\"tooltipDateColor\":\"rgba(0,0,0,0.76)\",\"tooltipBackgroundColor\":\"rgba(255,255,255,0.72)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Signal strength\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"dBm\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"signal_cellular_alt\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"rssi\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"if (!prevValue) {\\n prevValue = Math.random() * -96;\\n}\\nvar value = prevValue + (Math.random() * 60 - 30);\\nif (value > 0) {\\n\\tvalue = 0;\\n} else if (value < -96) {\\n value = -96;\\n}\\nlet rand = Math.random();\\nreturn rand < 0.2 ? (rand < 0.1 ? -101 : '') : value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"wifi\",\"showDate\":false,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"activeBarsColor\":{\"color\":\"rgba(92, 223, 144, 1)\",\"type\":\"range\",\"rangeList\":[{\"to\":-85,\"color\":\"rgba(227, 71, 71, 1)\"},{\"from\":-85,\"to\":-70,\"color\":\"rgba(255, 122, 0, 1)\"},{\"from\":-70,\"to\":-55,\"color\":\"rgba(246, 206, 67, 1)\"},{\"from\":-55,\"color\":\"rgba(92, 223, 144, 1)\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"inactiveBarsColor\":\"rgba(224, 224, 224, 1)\",\"noSignalRssiValue\":-100,\"showTooltip\":true,\"showTooltipValue\":true,\"tooltipValueFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"16px\"},\"tooltipValueColor\":\"rgba(0,0,0,0.76)\",\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"16px\"},\"tooltipDateColor\":\"rgba(0,0,0,0.76)\",\"tooltipBackgroundColor\":\"rgba(255,255,255,0.72)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Signal strength\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"dBm\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"signal_cellular_alt\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" }, "externalId": null, "tags": [ diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html index 4669bf5f82..ea6df20fcf 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html @@ -109,6 +109,13 @@ formControlName="inactiveBarsColor"> +
+
widgets.signal-strength.no-signal-rssi-value
+ + + +
Date: Thu, 15 Feb 2024 18:56:49 +0200 Subject: [PATCH 05/22] UI: fixed typeList url query and alarm filter config translation --- .../components/alarm/alarm-filter-config.component.ts | 10 ++++++++-- ui-ngx/src/app/shared/models/alarm.models.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts index 1218cedca2..609dbb8e7a 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts @@ -45,6 +45,7 @@ import { deepClone } from '@core/utils'; import { EntityType } from '@shared/models/entity-type.models'; import { fromEvent, Subscription } from 'rxjs'; import { POSITION_MAP } from '@shared/models/overlay.models'; +import { UtilsService } from '@core/services/utils.service'; export const ALARM_FILTER_CONFIG_DATA = new InjectionToken('AlarmFilterConfigData'); @@ -127,7 +128,8 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal private translate: TranslateService, private overlay: Overlay, private nativeElement: ElementRef, - private viewContainerRef: ViewContainerRef) { + private viewContainerRef: ViewContainerRef, + private utils: UtilsService) { } ngOnInit(): void { @@ -298,7 +300,7 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal this.translate.instant(alarmSeverityTranslations.get(s))).join(', ')); } if (this.alarmFilterConfig?.typeList?.length) { - filterTextParts.push(this.alarmFilterConfig.typeList.join(', ')); + filterTextParts.push(this.alarmFilterConfig.typeList.map((type) => this.customTranslate(type)).join(', ')); } if (this.alarmFilterConfig?.assignedToCurrentUser) { filterTextParts.push(this.translate.instant('alarm.assigned-to-me')); @@ -313,4 +315,8 @@ export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlVal } } + private customTranslate(entity: string) { + return this.utils.customTranslation(entity, entity); + } + } diff --git a/ui-ngx/src/app/shared/models/alarm.models.ts b/ui-ngx/src/app/shared/models/alarm.models.ts index 43fd717ef7..57509368d5 100644 --- a/ui-ngx/src/app/shared/models/alarm.models.ts +++ b/ui-ngx/src/app/shared/models/alarm.models.ts @@ -335,7 +335,7 @@ export class AlarmQueryV2 { let query = this.affectedEntityId ? `/${this.affectedEntityId.entityType}/${this.affectedEntityId.id}` : ''; query += this.pageLink.toQuery(); if (this.typeList && this.typeList.length) { - query += `&typeList=${this.typeList.join(',')}`; + query += `&typeList=${this.typeList.map(type => encodeURIComponent(type)).join(',')}`; } if (this.statusList && this.statusList.length) { query += `&statusList=${this.statusList.join(',')}`; From adbf708cd771722955bb78a9cd6aea100aef221c Mon Sep 17 00:00:00 2001 From: Vladyslav Date: Fri, 16 Feb 2024 11:14:06 +0200 Subject: [PATCH 06/22] Update entity-subtype-list.component.html --- .../shared/components/entity/entity-subtype-list.component.html | 1 - 1 file changed, 1 deletion(-) diff --git a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html index 26fb757c42..fa37de3901 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html +++ b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.html @@ -34,7 +34,6 @@ (blur)="addOnBlur($event)" formControlName="entitySubtype" matAutocompleteOrigin - matChipInputAddOnBlur="false" #origin="matAutocompleteOrigin" [matAutocompleteConnectedTo]="origin" [matAutocomplete]="entitySubtypeAutocomplete" From 6dd28b0134fb4d7da07af818298440edf5a3a394 Mon Sep 17 00:00:00 2001 From: okolesnyk Date: Fri, 16 Feb 2024 17:26:37 +0200 Subject: [PATCH 07/22] UI:fix. Change the link to the documentation (wrong urls)(PROD-2559) --- ui-ngx/src/app/shared/models/constants.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui-ngx/src/app/shared/models/constants.ts b/ui-ngx/src/app/shared/models/constants.ts index e57ab758e0..0092a679f6 100644 --- a/ui-ngx/src/app/shared/models/constants.ts +++ b/ui-ngx/src/app/shared/models/constants.ts @@ -159,12 +159,12 @@ export const HelpLinks = { otaUpdates: helpBaseUrl + '/docs/user-guide/ota-updates', widgetTypes: helpBaseUrl + '/docs/user-guide/ui/widget-library/#widget-types', widgetsBundles: helpBaseUrl + '/docs/user-guide/ui/widget-library/#widgets-library-bundles', - widgetsConfig: helpBaseUrl + '/docs/user-guide/widgets', - widgetsConfigTimeseries: helpBaseUrl + '/docs/user-guide/widgets', - widgetsConfigLatest: helpBaseUrl + '/docs/user-guide/widgets', - widgetsConfigRpc: helpBaseUrl + '/docs/user-guide/widgets', - widgetsConfigAlarm: helpBaseUrl + '/docs/user-guide/widgets', - widgetsConfigStatic: helpBaseUrl + '/docs/user-guide/widgets', + widgetsConfig: helpBaseUrl + '/docs/user-guide/ui/widget-library', + widgetsConfigTimeseries: helpBaseUrl + '/docs/user-guide/ui/widget-library#time-series', + widgetsConfigLatest: helpBaseUrl + '/docs/user-guide/ui/widget-library#latest-values', + widgetsConfigRpc: helpBaseUrl + '/docs/user-guide/ui/widget-library#control-widget', + widgetsConfigAlarm: helpBaseUrl + '/docs/user-guide/ui/widget-library#alarm-widget', + widgetsConfigStatic: helpBaseUrl + '/docs/user-guide/ui/widget-library#static', ruleNodePushToCloud: helpBaseUrl + '/docs/user-guide/rule-engine-2-0/action-nodes/#push-to-cloud', ruleNodePushToEdge: helpBaseUrl + '/docs/user-guide/rule-engine-2-0/action-nodes/#push-to-edge', queue: helpBaseUrl + '/docs/user-guide/queue', From ecca3ee708748f6cda14378ea95214599d736e97 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Fri, 16 Feb 2024 17:45:46 +0200 Subject: [PATCH 08/22] UI: Optimized updated image in Image Gallery --- .../image/image-dialog.component.ts | 19 +++++++----- .../image/upload-image-dialog.component.ts | 30 +++++++++++-------- .../src/app/shared/models/resource.models.ts | 4 +++ 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/ui-ngx/src/app/shared/components/image/image-dialog.component.ts b/ui-ngx/src/app/shared/components/image/image-dialog.component.ts index 1a777d1bf7..b140c6bf32 100644 --- a/ui-ngx/src/app/shared/components/image/image-dialog.component.ts +++ b/ui-ngx/src/app/shared/components/image/image-dialog.component.ts @@ -14,8 +14,7 @@ /// limitations under the License. /// -import { Component, Inject, OnInit, SkipSelf } from '@angular/core'; -import { ErrorStateMatcher } from '@angular/material/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; @@ -23,7 +22,7 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; import { ImageService } from '@core/http/image.service'; -import { ImageResourceInfo, imageResourceType } from '@shared/models/resource.models'; +import { ImageResource, ImageResourceInfo, imageResourceType } from '@shared/models/resource.models'; import { UploadImageDialogComponent, UploadImageDialogData @@ -143,7 +142,7 @@ export class ImageDialogComponent extends $event.stopPropagation(); } this.dialog.open(UploadImageDialogComponent, { + ImageResource>(UploadImageDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], data: { @@ -153,9 +152,15 @@ export class ImageDialogComponent extends if (result) { this.imageChanged = true; this.image = result; - this.imagePreviewData = { - url: this.image.public ? `${this.image.publicLink}?ts=${new Date().getTime()}` : this.image.link - }; + let url; + if (result.base64) { + url = result.base64; + } else if (this.image.public) { + url = `${this.image.publicLink}?ts=${new Date().getTime()}`; + } else { + url = this.image.link; + } + this.imagePreviewData = {url}; } }); } diff --git a/ui-ngx/src/app/shared/components/image/upload-image-dialog.component.ts b/ui-ngx/src/app/shared/components/image/upload-image-dialog.component.ts index ae022615a1..b61ef03eef 100644 --- a/ui-ngx/src/app/shared/components/image/upload-image-dialog.component.ts +++ b/ui-ngx/src/app/shared/components/image/upload-image-dialog.component.ts @@ -30,8 +30,10 @@ import { import { DialogComponent } from '@shared/components/dialog.component'; import { Router } from '@angular/router'; import { ImageService } from '@core/http/image.service'; -import { ImageResourceInfo, imageResourceType } from '@shared/models/resource.models'; +import { ImageResource, ImageResourceInfo, imageResourceType } from '@shared/models/resource.models'; import { getCurrentAuthState } from '@core/auth/auth.selectors'; +import { forkJoin } from 'rxjs'; +import { blobToBase64 } from '@core/utils'; export interface UploadImageDialogData { image?: ImageResourceInfo; @@ -44,7 +46,7 @@ export interface UploadImageDialogData { styleUrls: [] }) export class UploadImageDialogComponent extends - DialogComponent implements OnInit, ErrorStateMatcher { + DialogComponent implements OnInit, ErrorStateMatcher { uploadImageFormGroup: UntypedFormGroup; @@ -59,7 +61,7 @@ export class UploadImageDialogComponent extends private imageService: ImageService, @Inject(MAT_DIALOG_DATA) public data: UploadImageDialogData, @SkipSelf() private errorStateMatcher: ErrorStateMatcher, - public dialogRef: MatDialogRef, + public dialogRef: MatDialogRef, public fb: UntypedFormBuilder) { super(store, router, dialogRef); } @@ -98,18 +100,20 @@ export class UploadImageDialogComponent extends const file: File = this.uploadImageFormGroup.get('file').value; if (this.uploadImage) { const title: string = this.uploadImageFormGroup.get('title').value; - this.imageService.uploadImage(file, title).subscribe( - (res) => { - this.dialogRef.close(res); - } - ); + forkJoin([ + this.imageService.uploadImage(file, title), + blobToBase64(file) + ]).subscribe(([imageInfo, base64]) => { + this.dialogRef.close(Object.assign(imageInfo, {base64})); + }); } else { const image = this.data.image; - this.imageService.updateImage(imageResourceType(image), image.resourceKey, file).subscribe( - (res) => { - this.dialogRef.close(res); - } - ); + forkJoin([ + this.imageService.updateImage(imageResourceType(image), image.resourceKey, file), + blobToBase64(file) + ]).subscribe(([imageInfo, base64]) => { + this.dialogRef.close(Object.assign(imageInfo, {base64})); + }); } } } diff --git a/ui-ngx/src/app/shared/models/resource.models.ts b/ui-ngx/src/app/shared/models/resource.models.ts index 86b7c50553..a35e87864e 100644 --- a/ui-ngx/src/app/shared/models/resource.models.ts +++ b/ui-ngx/src/app/shared/models/resource.models.ts @@ -86,6 +86,10 @@ export interface ImageResourceInfo extends TbResourceInfo { publicLink?: string; } +export interface ImageResource extends ImageResourceInfo { + base64?: string; +} + export interface ImageExportData { mediaType: string; fileName: string; From 3a4ffa213fc17520a3f01003a25a438b4ccea1c9 Mon Sep 17 00:00:00 2001 From: okolesnyk Date: Mon, 19 Feb 2024 12:58:00 +0200 Subject: [PATCH 09/22] UI. Signal Strength widget (PROD-2773)(move "No signal" field into advanced form) --- .../indicator/signal-strength-basic-config.component.html | 7 ------- .../indicator/signal-strength-basic-config.component.ts | 2 -- .../signal-strength-widget-settings.component.html | 7 +++++++ .../indicator/signal-strength-widget-settings.component.ts | 3 ++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html index a31685430c..9d6c7d9b05 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/signal-strength-basic-config.component.html @@ -109,13 +109,6 @@ formControlName="inactiveBarsColor">
-
-
widgets.signal-strength.no-signal-rssi-value
- - - -
+
+
widgets.signal-strength.no-signal-rssi-value
+ + + +
Date: Mon, 19 Feb 2024 13:02:31 +0200 Subject: [PATCH 10/22] UI: Fixed background settings panel jump when edit content --- .../background-settings-panel.component.html | 87 ++++++++++--------- .../background-settings-panel.component.scss | 8 ++ .../common/background-settings.component.ts | 2 +- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.html index 6cca169f5a..9038f2a22f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.html @@ -17,49 +17,54 @@ -->
widgets.background.background-settings
-
-
-
widgets.background.background
- - - {{ backgroundTypeTranslationsMap.get(type) | translate }} - - -
- -
-
widgets.color.color
- - -
-
-
-
widgets.background.overlay
- - {{ 'widgets.background.enable-overlay' | translate }} - -
-
widgets.color.color
- - -
-
-
widgets.background.blur
- - -
px
-
+
+
+
+
widgets.background.background
+ + + {{ backgroundTypeTranslationsMap.get(type) | translate }} + + +
+ +
+
widgets.color.color
+ + +
-
-
-
- widgets.background.preview +
+
widgets.background.overlay
+ + {{ 'widgets.background.enable-overlay' | translate }} + +
+
widgets.color.color
+ + +
+
+
widgets.background.blur
+ + +
px
+
+
-
-
+
+
+ widgets.background.preview +
+
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.scss index 01297b9d12..6bc83fe967 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings-panel.component.scss @@ -67,6 +67,14 @@ left: 7.998px; right: 7.998px; } + .tb-background-settings-panel-content { + display: flex; + flex-direction: column; + gap: 16px; + overflow: auto; + margin: -10px; + padding: 10px; + } .tb-background-settings-panel-buttons { height: 40px; display: flex; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts index 5ac54cbbe3..66dd774a21 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/background-settings.component.ts @@ -110,7 +110,7 @@ export class BackgroundSettingsComponent implements OnInit, ControlValueAccessor backgroundSettings: this.modelValue }; const backgroundSettingsPanelPopover = this.popoverService.displayPopover(trigger, this.renderer, - this.viewContainerRef, BackgroundSettingsPanelComponent, 'left', true, null, + this.viewContainerRef, BackgroundSettingsPanelComponent, ['leftOnly', 'leftTopOnly', 'leftBottomOnly'], true, null, ctx, {}, {}, {}, true); From 2013cb36217392c5ed98c4854a54267fd279de59 Mon Sep 17 00:00:00 2001 From: okolesnyk Date: Mon, 19 Feb 2024 13:51:56 +0200 Subject: [PATCH 11/22] UI. Device profile > Alarm rules (corrections)(PROD-3051) --- ui-ngx/src/assets/locale/locale.constant-en_US.json | 4 ++-- ui-ngx/src/assets/locale/locale.constant-ko_KR.json | 4 ++-- ui-ngx/src/assets/locale/locale.constant-sl_SI.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index f8cacb7b29..ca895fb5e5 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1665,8 +1665,8 @@ "alarm-rule-mobile-dashboard-hint": "Used by mobile application as an alarm details dashboard", "alarm-rule-no-mobile-dashboard": "No dashboard selected", "propagate-alarm": "Propagate alarm to related entities", - "alarm-rule-relation-types-list": "Relation types to propagate", - "alarm-rule-relation-types-list-hint": "If propagate relation types are not entered, alarms will be propagated without filtering by relation type.", + "alarm-rule-relation-types-list": "Relation types", + "alarm-rule-relation-types-list-hint": "Defines relation types to filter the related entities. If not set, the alarm will be propagated to all related entities.", "propagate-alarm-to-owner": "Propagate alarm to entity owner (Customer or Tenant)", "propagate-alarm-to-tenant": "Propagate alarm to Tenant", "alarm-rule-condition": "Alarm rule condition", diff --git a/ui-ngx/src/assets/locale/locale.constant-ko_KR.json b/ui-ngx/src/assets/locale/locale.constant-ko_KR.json index 39d1e6311f..646981659d 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ko_KR.json +++ b/ui-ngx/src/assets/locale/locale.constant-ko_KR.json @@ -1007,8 +1007,8 @@ "condition-duration-time-unit-required": "Time unit is required.", "advanced-settings": "Advanced settings", "propagate-alarm": "Propagate alarm", - "alarm-rule-relation-types-list": "Relation types to propagate", - "alarm-rule-relation-types-list-hint": "If propagate relation types are not entered, alarms will be propagated without filtering by relation type.", + "alarm-rule-relation-types-list": "Relation types", + "alarm-rule-relation-types-list-hint": "Defines relation types to filter the related entities. If not set, the alarm will be propagated to all related entities.", "alarm-rule-condition": "Alarm rule condition", "enter-alarm-rule-condition-prompt": "Please add alarm rule condition", "edit-alarm-rule-condition": "Edit alarm rule condition", diff --git a/ui-ngx/src/assets/locale/locale.constant-sl_SI.json b/ui-ngx/src/assets/locale/locale.constant-sl_SI.json index c4b1643a53..2135a7cbd3 100644 --- a/ui-ngx/src/assets/locale/locale.constant-sl_SI.json +++ b/ui-ngx/src/assets/locale/locale.constant-sl_SI.json @@ -1007,8 +1007,8 @@ "condition-duration-time-unit-required": "Time unit is required.", "advanced-settings": "Advanced settings", "propagate-alarm": "Propagate alarm", - "alarm-rule-relation-types-list": "Relation types to propagate", - "alarm-rule-relation-types-list-hint": "If propagate relation types are not entered, alarms will be propagated without filtering by relation type.", + "alarm-rule-relation-types-list": "Relation types", + "alarm-rule-relation-types-list-hint": "Defines relation types to filter the related entities. If not set, the alarm will be propagated to all related entities.", "alarm-rule-condition": "Alarm rule condition", "enter-alarm-rule-condition-prompt": "Please add alarm rule condition", "edit-alarm-rule-condition": "Edit alarm rule condition", From 927efe35f15f57f817ad9436508f0d66a4fae5b4 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 19 Feb 2024 14:15:18 +0200 Subject: [PATCH 12/22] UI: Typo in send notification component --- .../notification/sent/sent-notification-dialog.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html index 8f5d41de34..128b37313e 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html @@ -36,7 +36,7 @@ check - {{ 'notification.compose' | translate }} + {{ 'notification.setup' | translate }}
From 73bef368de96ca2074c14792c124c09f2a659fba Mon Sep 17 00:00:00 2001 From: Dmitriymush Date: Mon, 19 Feb 2024 15:58:42 +0200 Subject: [PATCH 13/22] UI: refactoring of widget action component --- .../common/action/widget-action.component.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts index 3fa353623f..b7183a5b80 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/action/widget-action.component.ts @@ -34,7 +34,7 @@ import { import { WidgetService } from '@core/http/widget.service'; import { WidgetActionCallbacks } from '@home/components/widget/action/manage-widget-actions.component.models'; import { map, mergeMap, share, startWith, takeUntil, tap } from 'rxjs/operators'; -import { Observable, of, Subject, Subscription } from 'rxjs'; +import { Observable, of, ReplaySubject, Subject, Subscription } from 'rxjs'; import { Dashboard } from '@shared/models/dashboard.models'; import { DashboardService } from '@core/http/dashboard.service'; import { DashboardUtilsService } from '@core/services/dashboard-utils.service'; @@ -186,7 +186,7 @@ export class WidgetActionComponent implements ControlValueAccessor, OnInit, Vali } onDashboardStateInputFocus(): void { - this.actionTypeFormGroup.get('targetDashboardId').updateValueAndValidity({onlySelf: true, emitEvent: true}); + this.actionTypeFormGroup.get('targetDashboardStateId').updateValueAndValidity({onlySelf: true, emitEvent: true}); } stateDisplayTypeName(displayType: stateDisplayType): string { @@ -228,16 +228,16 @@ export class WidgetActionComponent implements ControlValueAccessor, OnInit, Vali this.fb.control(action ? action.stateEntityParamName : null, []) ); if (type === WidgetActionType.openDashboard) { + const targetDashboardId = action ? action.targetDashboardId : null; this.actionTypeFormGroup.addControl( 'openNewBrowserTab', this.fb.control(action ? action.openNewBrowserTab : false, []) ); this.actionTypeFormGroup.addControl( 'targetDashboardId', - this.fb.control(action ? action.targetDashboardId : null, - [Validators.required]) + this.fb.control(targetDashboardId, [Validators.required]) ); - this.setupSelectedDashboardStateIds(); + this.setupSelectedDashboardStateIds(targetDashboardId); } else { if (type === WidgetActionType.openDashboardState) { const displayType = this.getStateDisplayType(action); @@ -367,9 +367,10 @@ export class WidgetActionComponent implements ControlValueAccessor, OnInit, Vali ); } - private setupSelectedDashboardStateIds() { + private setupSelectedDashboardStateIds(targetDashboardId: string | null) { this.selectedDashboardStateIds = this.actionTypeFormGroup.get('targetDashboardId').valueChanges.pipe( + startWith(targetDashboardId), tap((dashboardId) => { if (!dashboardId) { this.actionTypeFormGroup.get('targetDashboardStateId') @@ -400,7 +401,12 @@ export class WidgetActionComponent implements ControlValueAccessor, OnInit, Vali return []; } }), - share() + share({ + connector: () => new ReplaySubject(1), + resetOnError: false, + resetOnComplete: false, + resetOnRefCountZero: false + }) ); } From 3f48b2a0ee42691bfff77538373b1c37de686030 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 21 Feb 2024 18:24:00 +0200 Subject: [PATCH 14/22] UI: Minor fixed in notification dialog --- .../sent-notification-dialog.component.html | 26 +++++++++++-------- .../sent-notification-dialog.component.scss | 9 +++++++ .../sent/sent-notification-dialog.componet.ts | 2 ++ ...tion-template-configuration.component.scss | 2 +- ...emplate-notification-dialog.component.html | 18 +++++++------ .../template-notification-dialog.component.ts | 1 + 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html index 8f5d41de34..bf59950953 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.html @@ -140,20 +140,24 @@ {{ 'notification.compose' | translate }} - - - - + +
+ + +
+
{{ 'notification.review' | translate }} - - +
+ + +
diff --git a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.scss b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.scss index ee0c8aeedc..a6e8def974 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.scss +++ b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.component.scss @@ -110,6 +110,15 @@ margin-bottom: 16px; } + .tb-loader { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 400px; + max-height: 100%; + } + .preview-group { &.notification { background-color: #F3F6FA; diff --git a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts index 4d2d184dbd..7060baf5cc 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/sent/sent-notification-dialog.componet.ts @@ -147,6 +147,7 @@ export class SentNotificationDialogComponent extends this.notificationRequestForm.reset({}, {emitEvent: false}); this.notificationRequestForm.patchValue(this.data.request, {emitEvent: false}); this.notificationRequestForm.get('template.name').setValue(guid()); + this.notificationRequestForm.get('template.notificationType').setValue(NotificationType.GENERAL); let useTemplate = true; if (isDefinedAndNotNull(this.data.request.template)) { useTemplate = false; @@ -155,6 +156,7 @@ export class SentNotificationDialogComponent extends }, {emitEvent: false}); } this.notificationRequestForm.get('useTemplate').setValue(useTemplate, {onlySelf : true}); + this.deliveryConfiguration = this.templateNotificationForm.get('configuration.deliveryMethodsTemplates').value; } this.refreshAllowDeliveryMethod(); } diff --git a/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.scss b/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.scss index 312f69bdc7..eed548f07b 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.scss +++ b/ui-ngx/src/app/modules/home/pages/notification/template/configuration/notification-template-configuration.component.scss @@ -17,7 +17,7 @@ .tb-template-header { position: sticky; top: 0; - z-index: 1; + z-index: 5; padding-bottom: 12px; background-color: var(--mdc-dialog-container-color, white); diff --git a/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.html index 73618fd939..2d3e642dd2 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.html @@ -71,14 +71,16 @@ {{ 'notification.compose' | translate }} -
- - -
+ +
+ + +
+
diff --git a/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts b/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts index b34e5e5c4f..c0ae4f1abb 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/pages/notification/template/template-notification-dialog.component.ts @@ -102,6 +102,7 @@ export class TemplateNotificationDialogComponent this.notificationTemplateConfigurationForm.patchValue({ deliveryMethodsTemplates: this.templateNotification.configuration.deliveryMethodsTemplates }, {emitEvent: false}); + this.deliveryConfiguration = this.templateNotificationForm.get('configuration.deliveryMethodsTemplates').value; } } From d815e8a1185a30032566d264c387947147633178 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Wed, 21 Feb 2024 18:33:08 +0200 Subject: [PATCH 15/22] UI: Add hint to setting notification rule Edge communication failure --- .../notification/rule/rule-notification-dialog.component.html | 1 + 1 file changed, 1 insertion(+) diff --git a/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html index f4ae83143f..6a50a857a4 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html @@ -453,6 +453,7 @@
notification.filter From 27a42eac1494fb2a296489b9d974c446998feb1f Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Thu, 22 Feb 2024 10:22:46 +0200 Subject: [PATCH 16/22] UI: Required mark and error text were changed in the recipients' field of the notification rule dialog --- .../notification/rule/rule-notification-dialog.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html b/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html index f4ae83143f..f89bad912a 100644 --- a/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html +++ b/ui-ngx/src/app/modules/home/pages/notification/rule/rule-notification-dialog.component.html @@ -70,6 +70,8 @@ formControlName="targets" subType="{{ ruleNotificationForm.get('triggerType').value }}" entityType="{{ entityType.NOTIFICATION_TARGET }}" + labelText="{{ 'notification.recipients' | translate }}" + requiredText="{{ 'notification.recipients-required' | translate }}" placeholderText="{{ 'notification.recipient' | translate }}">