diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts
index 5a4289a8d2..5de1b77b18 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/digital-gauge-widget-settings.component.ts
@@ -16,7 +16,14 @@
import { Datasource, WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models';
import { Component } from '@angular/core';
-import { AbstractControl, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import {
+ AbstractControl,
+ UntypedFormArray,
+ UntypedFormBuilder,
+ UntypedFormGroup, ValidationErrors,
+ ValidatorFn,
+ Validators
+} from '@angular/forms';
import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
import { GaugeType } from '@home/components/widget/lib/canvas-digital-gauge';
@@ -167,7 +174,7 @@ export class DigitalGaugeWidgetSettingsComponent extends WidgetSettingsComponent
donutStartAngle: [settings.donutStartAngle, []],
showMinMax: [settings.showMinMax, []],
minValue: [settings.minValue, []],
- maxValue: [settings.maxValue, []],
+ maxValue: [settings.maxValue, [this.maxValueValidation()]],
minMaxFont: [settings.minMaxFont, []],
minMaxColor: [settings.minMaxFont.color, []],
@@ -206,6 +213,18 @@ export class DigitalGaugeWidgetSettingsComponent extends WidgetSettingsComponent
});
}
+ private maxValueValidation(): ValidatorFn {
+ return (control: AbstractControl): ValidationErrors | null => {
+ const value: string = control.value;
+ if (value) {
+ if (value < control.parent?.get('minValue').value) {
+ return {maxValue: true};
+ }
+ }
+ return null;
+ };
+ }
+
protected prepareOutputSettings(settings) {
const barColor: ColorSettings = this.digitalGaugeWidgetSettingsForm.get('barColor').value;
@@ -230,10 +249,15 @@ export class DigitalGaugeWidgetSettingsComponent extends WidgetSettingsComponent
}
protected validatorTriggers(): string[] {
- return ['gaugeType', 'showTitle', 'showUnitTitle', 'showValue', 'showMinMax', 'showTimestamp', 'showTicks', 'animation'];
+ return ['gaugeType', 'showTitle', 'showUnitTitle', 'showValue', 'showMinMax', 'showTimestamp', 'showTicks', 'animation', 'minValue'];
}
- protected updateValidators(emitEvent: boolean) {
+ protected updateValidators(emitEvent: boolean, trigger: string) {
+ if (trigger === 'minValue') {
+ this.digitalGaugeWidgetSettingsForm.get('maxValue').updateValueAndValidity({emitEvent: true});
+ this.digitalGaugeWidgetSettingsForm.get('maxValue').markAsTouched({onlySelf: true});
+ return;
+ }
const gaugeType: GaugeType = this.digitalGaugeWidgetSettingsForm.get('gaugeType').value;
const showTitle: boolean = this.digitalGaugeWidgetSettingsForm.get('showTitle').value;
const showUnitTitle: boolean = this.digitalGaugeWidgetSettingsForm.get('showUnitTitle').value;
diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts b/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts
index cfb30cfc99..00cabe0599 100644
--- a/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts
@@ -90,9 +90,6 @@ import { ToggleButtonWidgetComponent } from '@home/components/widget/lib/button/
import { TimeSeriesChartWidgetComponent } from '@home/components/widget/lib/chart/time-series-chart-widget.component';
import { AddConnectorDialogComponent } from '@home/components/widget/lib/gateway/dialog/add-connector-dialog.component';
import { MappingDialogComponent } from '@home/components/widget/lib/gateway/dialog/mapping-dialog.component';
-import {
- EllipsisChipListDirective
-} from '@home/components/widget/lib/gateway/connectors-configuration/ellipsis-chip-list.directive';
import { StatusWidgetComponent } from '@home/components/widget/lib/indicator/status-widget.component';
import { LatestChartComponent } from '@home/components/widget/lib/chart/latest-chart.component';
import { PieChartWidgetComponent } from '@home/components/widget/lib/chart/pie-chart-widget.component';
@@ -112,18 +109,38 @@ import {
import {
NotificationTypeFilterPanelComponent
} from '@home/components/widget/lib/cards/notification-type-filter-panel.component';
-import { GatewayHelpLinkPipe } from '@home/pipes/public-api';
+import { GatewayHelpLinkPipe } from '@home/components/widget/lib/gateway/pipes/gateway-help-link.pipe';
+import { EllipsisChipListDirective } from '@shared/directives/ellipsis-chip-list.directive';
+import {
+ BrokerConfigControlComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/broker-config-control/broker-config-control.component';
+import {
+ WorkersConfigControlComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/workers-config-control/workers-config-control.component';
+import {
+ OpcServerConfigComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/opc-server-config/opc-server-config.component';
+import {
+ MqttBasicConfigComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/mqtt-basic-config/mqtt-basic-config.component';
+import {
+ MappingTableComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/mapping-table/mapping-table.component';
import {
- BrokerConfigControlComponent,
- DeviceInfoTableComponent,
- MappingDataKeysPanelComponent,
- MappingTableComponent,
- MqttBasicConfigComponent,
- OpcUaBasicConfigComponent,
- ServerConfigComponent,
- TypeValuePanelComponent,
- WorkersConfigControlComponent,
-} from '@home/components/widget/lib/gateway/connectors-configuration/public-api';
+ OpcUaBasicConfigComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/opc-ua-basic-config/opc-ua-basic-config.component';
+import {
+ ModbusBasicConfigComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-basic-config/modbus-basic-config.component';
+import {
+ DeviceInfoTableComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/device-info-table/device-info-table.component';
+import {
+ MappingDataKeysPanelComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/mapping-data-keys-panel/mapping-data-keys-panel.component';
+import {
+ TypeValuePanelComponent
+} from '@home/components/widget/lib/gateway/connectors-configuration/type-value-panel/type-value-panel.component';
import { ScadaSymbolWidgetComponent } from '@home/components/widget/lib/scada/scada-symbol-widget.component';
@NgModule({
@@ -164,7 +181,6 @@ import { ScadaSymbolWidgetComponent } from '@home/components/widget/lib/scada/sc
GatewayConfigurationComponent,
GatewayRemoteConfigurationDialogComponent,
GatewayServiceRPCConnectorTemplateDialogComponent,
- EllipsisChipListDirective,
ValueCardWidgetComponent,
AggregatedValueCardWidgetComponent,
CountWidgetComponent,
@@ -206,11 +222,13 @@ import { ScadaSymbolWidgetComponent } from '@home/components/widget/lib/scada/sc
GatewayHelpLinkPipe,
BrokerConfigControlComponent,
WorkersConfigControlComponent,
- ServerConfigComponent,
+ OpcServerConfigComponent,
MqttBasicConfigComponent,
MappingTableComponent,
OpcUaBasicConfigComponent,
- KeyValueIsNotEmptyPipe
+ KeyValueIsNotEmptyPipe,
+ ModbusBasicConfigComponent,
+ EllipsisChipListDirective,
],
exports: [
EntitiesTableWidgetComponent,
diff --git a/ui-ngx/src/app/modules/home/pages/admin/resource/resources-library.component.html b/ui-ngx/src/app/modules/home/pages/admin/resource/resources-library.component.html
index 76625326b4..5c3d9da081 100644
--- a/ui-ngx/src/app/modules/home/pages/admin/resource/resources-library.component.html
+++ b/ui-ngx/src/app/modules/home/pages/admin/resource/resources-library.component.html
@@ -58,7 +58,7 @@
resource.title
-
+
{{ 'resource.title-required' | translate }}
@@ -68,7 +68,7 @@
impleme
ngOnInit() {
super.ngOnInit();
- this.entityForm.get('resourceType').valueChanges.pipe(
- startWith(ResourceType.JS_MODULE),
- filter(() => this.isAdd),
- takeUntil(this.destroy$)
- ).subscribe((type) => {
- if (type === this.resourceType.LWM2M_MODEL) {
- this.entityForm.get('title').disable({emitEvent: false});
- this.entityForm.patchValue({title: ''}, {emitEvent: false});
- } else {
- this.entityForm.get('title').enable({emitEvent: false});
- }
- this.entityForm.patchValue({
- data: null,
- fileName: null
- }, {emitEvent: false});
- });
+ if (this.isAdd) {
+ this.observeResourceTypeChange();
+ }
}
ngOnDestroy() {
@@ -96,7 +83,7 @@ export class ResourcesLibraryComponent extends EntityComponent impleme
title: [entity ? entity.title : '', [Validators.required, Validators.maxLength(255)]],
resourceType: [entity?.resourceType ? entity.resourceType : ResourceType.JS_MODULE, Validators.required],
fileName: [entity ? entity.fileName : null, Validators.required],
- data: [entity ? entity.data : null, Validators.required]
+ data: [entity ? entity.data : null, this.isAdd ? [Validators.required] : []]
});
}
@@ -105,7 +92,6 @@ export class ResourcesLibraryComponent extends EntityComponent impleme
this.entityForm.get('resourceType').disable({emitEvent: false});
if (entity.resourceType !== ResourceType.JS_MODULE) {
this.entityForm.get('fileName').disable({emitEvent: false});
- this.entityForm.get('data').disable({emitEvent: false});
}
}
this.entityForm.patchValue({
@@ -153,4 +139,24 @@ export class ResourcesLibraryComponent extends EntityComponent impleme
horizontalPosition: 'right'
}));
}
+
+ private observeResourceTypeChange(): void {
+ this.entityForm.get('resourceType').valueChanges.pipe(
+ startWith(ResourceType.JS_MODULE),
+ takeUntil(this.destroy$)
+ ).subscribe((type: ResourceType) => this.onResourceTypeChange(type));
+ }
+
+ private onResourceTypeChange(type: ResourceType): void {
+ if (type === this.resourceType.LWM2M_MODEL) {
+ this.entityForm.get('title').disable({emitEvent: false});
+ this.entityForm.patchValue({title: ''}, {emitEvent: false});
+ } else {
+ this.entityForm.get('title').enable({emitEvent: false});
+ }
+ this.entityForm.patchValue({
+ data: null,
+ fileName: null
+ }, {emitEvent: false});
+ }
}
diff --git a/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html b/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html
index fc71dbedcb..aa928687ad 100644
--- a/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html
+++ b/ui-ngx/src/app/modules/home/pages/device-profile/device-profile-tabs.component.html
@@ -35,8 +35,7 @@
+ [isAdd]="isTransportTypeChanged">
@@ -65,8 +64,7 @@