From 47543ad5e252548dba80c51e826088e747f29801 Mon Sep 17 00:00:00 2001 From: rusikv Date: Thu, 3 Aug 2023 18:33:23 +0300 Subject: [PATCH] Added selection to alarms table for bulk acknowledge and clear --- .../components/alarm/alarm-table-config.ts | 89 ++++++++++++++++++- .../assets/locale/locale.constant-en_US.json | 2 + 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/alarm/alarm-table-config.ts b/ui-ngx/src/app/modules/home/components/alarm/alarm-table-config.ts index 28e64738a8..646e05511f 100644 --- a/ui-ngx/src/app/modules/home/components/alarm/alarm-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/alarm/alarm-table-config.ts @@ -26,17 +26,17 @@ import { DatePipe } from '@angular/common'; import { Direction } from '@shared/models/page/sort-order'; import { MatDialog } from '@angular/material/dialog'; import { TimePageLink } from '@shared/models/page/page-link'; -import { Observable } from 'rxjs'; +import { forkJoin, Observable } from 'rxjs'; import { PageData } from '@shared/models/page/page-data'; import { EntityId } from '@shared/models/id/entity-id'; import { AlarmInfo, - AlarmQuery, AlarmQueryV2, AlarmSearchStatus, alarmSeverityColors, alarmSeverityTranslations, AlarmsMode, + AlarmStatus, alarmStatusTranslations } from '@app/shared/models/alarm.models'; import { AlarmService } from '@app/core/http/alarm.service'; @@ -46,7 +46,7 @@ import { AlarmDetailsDialogComponent, AlarmDetailsDialogData } from '@home/components/alarm/alarm-details-dialog.component'; -import { DAY, forAllTimeInterval, historyInterval } from '@shared/models/time/time.models'; +import { forAllTimeInterval } from '@shared/models/time/time.models'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { getCurrentAuthUser } from '@core/auth/auth.selectors'; @@ -93,7 +93,7 @@ export class AlarmTableConfig extends EntityTableConfig this.pageMode = pageMode; this.defaultTimewindowInterval = forAllTimeInterval(); this.detailsPanelEnabled = false; - this.selectionEnabled = false; + this.selectionEnabled = true; this.searchEnabled = true; this.addEnabled = false; this.entitiesDeleteEnabled = false; @@ -155,6 +155,23 @@ export class AlarmTableConfig extends EntityTableConfig onAction: ($event, entity) => this.showAlarmDetails(entity) } ); + + this.groupActionDescriptors.push( + { + name: this.translate.instant('alarm.acknowledge'), + icon: 'done', + isEnabled: true, + onAction: ($event, entities) => this.ackAlarms($event, entities) + } + ) + this.groupActionDescriptors.push( + { + name: this.translate.instant('alarm.clear'), + icon: 'clear', + isEnabled: true, + onAction: ($event, entities) => this.clearAlarms($event, entities) + } + ) } fetchAlarms(pageLink: TimePageLink): Observable> { @@ -294,4 +311,68 @@ export class AlarmTableConfig extends EntityTableConfig }); } + ackAlarms($event: Event, alarms: Array) { + if ($event) { + $event.stopPropagation(); + } + const unacknowledgedAlarms = alarms.filter(alarm => { + return alarm.status === AlarmStatus.CLEARED_UNACK || alarm.status === AlarmStatus.ACTIVE_UNACK; + }) + if (!unacknowledgedAlarms.length) { + this.dialogService.alert(this.translate.instant('alarm.selected-alarms', {count: alarms.length}), + this.translate.instant('alarm.selected-alarms-are-acknowledged')).subscribe(); + } else { + const title = this.translate.instant('alarm.aknowledge-alarms-title', {count: unacknowledgedAlarms.length}); + const content = this.translate.instant('alarm.aknowledge-alarms-text', {count: unacknowledgedAlarms.length}); + this.dialogService.confirm( + title, + content, + this.translate.instant('action.no'), + this.translate.instant('action.yes') + ).subscribe((res) => { + if (res) { + const tasks: Observable[] = []; + for (const alarm of unacknowledgedAlarms) { + tasks.push(this.alarmService.ackAlarm(alarm.id.id)); + } + forkJoin(tasks).subscribe(() => { + this.updateData(); + }); + } + }); + } + } + + clearAlarms($event: Event, alarms: Array) { + if ($event) { + $event.stopPropagation(); + } + const activeAlarms = alarms.filter(alarm => { + return alarm.status === AlarmStatus.ACTIVE_ACK || alarm.status === AlarmStatus.ACTIVE_UNACK; + }) + if (!activeAlarms.length) { + this.dialogService.alert(this.translate.instant('alarm.selected-alarms', {count: alarms.length}), + this.translate.instant('alarm.selected-alarms-are-cleared')).subscribe(); + } else { + const title = this.translate.instant('alarm.clear-alarms-title', {count: activeAlarms.length}); + const content = this.translate.instant('alarm.clear-alarms-text', {count: activeAlarms.length}); + this.dialogService.confirm( + title, + content, + this.translate.instant('action.no'), + this.translate.instant('action.yes') + ).subscribe((res) => { + if (res) { + const tasks: Observable[] = []; + for (const alarm of activeAlarms) { + tasks.push(this.alarmService.clearAlarm(alarm.id.id)); + } + forkJoin(tasks).subscribe(() => { + this.updateData(); + }); + } + }); + } + } + } 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 ba6bbda7ad..f387b2fe40 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -521,10 +521,12 @@ "aknowledge-alarms-text": "Are you sure you want to acknowledge { count, plural, =1 {1 alarm} other {# alarms} }?", "aknowledge-alarm-title": "Acknowledge Alarm", "aknowledge-alarm-text": "Are you sure you want to acknowledge Alarm?", + "selected-alarms-are-acknowledged": "Selected alarms are already acknowledged", "clear-alarms-title": "Clear { count, plural, =1 {1 alarm} other {# alarms} }", "clear-alarms-text": "Are you sure you want to clear { count, plural, =1 {1 alarm} other {# alarms} }?", "clear-alarm-title": "Clear Alarm", "clear-alarm-text": "Are you sure you want to clear Alarm?", + "selected-alarms-are-cleared": "Selected alarms are already cleared", "alarm-status-filter": "Alarm Status Filter", "alarm-filter-title": "Alarm Filter", "assigned": "Assigned",