diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts index fe0670b4e7..ef539af6f5 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts @@ -142,10 +142,9 @@ export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Vali } ngOnChanges(changes: SimpleChanges) { - if (changes.arguments) { - if (changes.arguments && !changes.arguments.firstChange) { - this.recalculateArgumentValidity(); - } + if (changes.arguments && !changes.arguments.firstChange) { + this.recalculateArgumentValidity(); + this.onValidatorChange(); } } diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.ts index 706477f72a..d9b7f868ac 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.ts @@ -84,6 +84,7 @@ export class CfAlarmRuleComponent implements ControlValueAccessor, OnInit, Valid }); private propagateChange = (v: any) => { }; + private onValidatorChange = () => { }; constructor(private dialog: MatDialog, private fb: FormBuilder, @@ -97,12 +98,21 @@ export class CfAlarmRuleComponent implements ControlValueAccessor, OnInit, Valid registerOnTouched(fn: any): void { } + registerOnValidatorChange(fn: () => void): void { + this.onValidatorChange = fn; + } + ngOnInit() { this.alarmRuleFormGroup.valueChanges.pipe( takeUntilDestroyed(this.destroyRef) ).subscribe(() => { this.updateModel(); }); + this.alarmRuleFormGroup.statusChanges.pipe( + takeUntilDestroyed(this.destroyRef) + ).subscribe(() => { + this.onValidatorChange(); + }); } setDisabledState(isDisabled: boolean): void { diff --git a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts index 4d9884f851..345e155ae1 100644 --- a/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts +++ b/ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts @@ -77,12 +77,16 @@ export class CreateCfAlarmRulesComponent implements ControlValueAccessor, Valida private usedSeverities: AlarmSeverity[] = []; private propagateChange = (v: any) => { }; + private onValidatorChange = () => { }; constructor(private fb: FormBuilder, private destroyRef: DestroyRef) { this.createAlarmRulesFormGroup.valueChanges.pipe( takeUntilDestroyed(this.destroyRef) ).subscribe(() => this.updateModel()); + this.createAlarmRulesFormGroup.statusChanges.pipe( + takeUntilDestroyed(this.destroyRef) + ).subscribe(() => this.onValidatorChange()); } registerOnChange(fn: any): void { @@ -92,6 +96,10 @@ export class CreateCfAlarmRulesComponent implements ControlValueAccessor, Valida registerOnTouched(fn: any): void { } + registerOnValidatorChange(fn: () => void): void { + this.onValidatorChange = fn; + } + createAlarmRulesFormArray(): UntypedFormArray { return this.createAlarmRulesFormGroup.get('createAlarmRules') as UntypedFormArray; } diff --git a/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-actions.service.ts b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-actions.service.ts index 62e44e467c..536c9da878 100644 --- a/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-actions.service.ts +++ b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-actions.service.ts @@ -17,11 +17,9 @@ import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { Observable, of } from 'rxjs'; -import { map, mergeMap } from 'rxjs/operators'; import { MpItemVersionView } from '@shared/models/iot-hub/iot-hub-version.models'; import { ItemType } from '@shared/models/iot-hub/iot-hub-item.models'; import { DeviceInstalledItemDescriptor, IotHubInstalledItem } from '@shared/models/iot-hub/iot-hub-installed-item.models'; -import { IotHubApiService } from '@core/http/iot-hub-api.service'; import { EntityId } from '@shared/models/id/entity-id'; import { TbIotHubAddItemDialogComponent, IotHubAddItemDialogData, IotHubAddItemDialogResult } from './iot-hub-add-item-dialog.component'; import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData, IotHubItemDetailDialogMode } from './iot-hub-item-detail-dialog.component'; @@ -35,8 +33,7 @@ import { TbIotHubInstalledItemsDialogComponent, IotHubInstalledItemsDialogData } export class IotHubActionsService { constructor( - private dialog: MatDialog, - private iotHubApiService: IotHubApiService + private dialog: MatDialog ) {} openItemDetail(item: MpItemVersionView, installedItem?: IotHubInstalledItem, installedItemsCount?: number, @@ -109,13 +106,8 @@ export class IotHubActionsService { panelClass: ['tb-dialog'], disableClose: true, autoFocus: false, - data: { itemName: installedItem.itemName, itemType: installedItem.itemType } - }).afterClosed().pipe( - mergeMap((confirmed) => - confirmed - ? this.iotHubApiService.deleteInstalledItem(installedItem.id.id).pipe(map(() => true)) - : of(false) ) - ); + data: { installedItemId: installedItem.id.id, itemName: installedItem.itemName, itemType: installedItem.itemType } + }).afterClosed(); } installDevice(item: MpItemVersionView): Observable { diff --git a/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-delete-dialog.component.ts b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-delete-dialog.component.ts index 4353f1a9f6..be91644741 100644 --- a/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-delete-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-delete-dialog.component.ts @@ -20,8 +20,11 @@ import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { DialogComponent } from '@shared/components/dialog.component'; +import { IotHubInstalledItem } from 'src/app/shared/models/iot-hub/iot-hub-installed-item.models'; +import { IotHubApiService } from '@core/http/iot-hub-api.service'; export interface IotHubDeleteDialogData { + installedItemId: string; itemName: string; itemType?: string; } @@ -38,13 +41,18 @@ export class TbIotHubDeleteDialogComponent extends DialogComponent, protected router: Router, protected dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: IotHubDeleteDialogData + @Inject(MAT_DIALOG_DATA) public data: IotHubDeleteDialogData, + private iotHubApiService: IotHubApiService ) { super(store, router, dialogRef); } confirm(): void { - this.dialogRef.close(true); + this.iotHubApiService.deleteInstalledItem(this.data.installedItemId).subscribe( + () => { + this.dialogRef.close(true); + } + ); } cancel(): void { diff --git a/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-installed-items-table.component.ts b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-installed-items-table.component.ts index 281d1d1e0e..4435c82736 100644 --- a/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-installed-items-table.component.ts +++ b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-installed-items-table.component.ts @@ -156,12 +156,9 @@ export class TbIotHubInstalledItemsTableComponent implements OnInit, OnChanges, } deleteItem(item: IotHubInstalledItem): void { - this.isLoading = true; this.iotHubActions.deleteItem(item).subscribe(deleted => { if (deleted) { this.loadData(); - } else { - this.isLoading = false; } }); } @@ -247,12 +244,9 @@ export class TbIotHubInstalledItemsTableComponent implements OnInit, OnChanges, } updateItem(item: IotHubInstalledItem, publishedInfo: ItemPublishedVersionInfo): void { - this.isLoading = true; this.iotHubActions.updateItem(item, publishedInfo.publishedVersion, publishedInfo.publishedVersionId).subscribe(result => { if (result === 'updated') { this.loadData(); - } else { - this.isLoading = false; } }); } diff --git a/ui-ngx/src/app/shared/components/time-unit-input.component.ts b/ui-ngx/src/app/shared/components/time-unit-input.component.ts index 93293698b3..79482f378f 100644 --- a/ui-ngx/src/app/shared/components/time-unit-input.component.ts +++ b/ui-ngx/src/app/shared/components/time-unit-input.component.ts @@ -206,15 +206,13 @@ export class TimeUnitInputComponent implements ControlValueAccessor, Validator, writeValue(sec: number) { if (sec !== this.modelValue) { if (isDefinedAndNotNull(sec) && isNumeric(sec) && Number(sec) !== 0) { - this.timeInputForm.patchValue(this.parseTime(sec), {emitEvent: true}); + this.timeInputForm.patchValue(this.parseTime(sec), {emitEvent: false}); this.modelValue = sec; } else { - this.timeInputForm.patchValue({ - time: 0, - timeUnit: TimeUnit.SECONDS - }, {emitEvent: false}); + this.timeInputForm.patchValue(this.secondsModel(0), {emitEvent: false}); this.modelValue = 0; } + this.refreshTimeValidators(); } } @@ -242,6 +240,14 @@ export class TimeUnitInputComponent implements ControlValueAccessor, Validator, } } } + return this.secondsModel(value); + } + + private secondsModel(time: number): TimeUnitInputModel { + return { + time, + timeUnit: TimeUnit.SECONDS + }; } private createStepMultipleOfValidator(): ValidatorFn {