Browse Source

Merge pull request #9037 from rusikv/feature/alarm-bulk-clear-ack

Added selection to alarms table for bulk acknowledgement and clearing
pull/9078/head
Igor Kulikov 3 years ago
committed by GitHub
parent
commit
01bda92cab
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      ui-ngx/src/app/core/http/alarm.service.ts
  2. 128
      ui-ngx/src/app/modules/home/components/alarm/alarm-table-config.ts
  3. 4
      ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts
  4. 5
      ui-ngx/src/assets/locale/locale.constant-en_US.json

12
ui-ngx/src/app/core/http/alarm.service.ts

@ -52,12 +52,12 @@ export class AlarmService {
return this.http.post<Alarm>('/api/alarm', alarm, defaultHttpOptionsFromConfig(config));
}
public ackAlarm(alarmId: string, config?: RequestConfig): Observable<void> {
return this.http.post<void>(`/api/alarm/${alarmId}/ack`, null, defaultHttpOptionsFromConfig(config));
public ackAlarm(alarmId: string, config?: RequestConfig): Observable<AlarmInfo> {
return this.http.post<AlarmInfo>(`/api/alarm/${alarmId}/ack`, null, defaultHttpOptionsFromConfig(config));
}
public clearAlarm(alarmId: string, config?: RequestConfig): Observable<void> {
return this.http.post<void>(`/api/alarm/${alarmId}/clear`, null, defaultHttpOptionsFromConfig(config));
public clearAlarm(alarmId: string, config?: RequestConfig): Observable<AlarmInfo> {
return this.http.post<AlarmInfo>(`/api/alarm/${alarmId}/clear`, null, defaultHttpOptionsFromConfig(config));
}
public assignAlarm(alarmId: string, assigneeId: string, config?: RequestConfig): Observable<void> {
@ -68,8 +68,8 @@ export class AlarmService {
return this.http.delete<void>(`/api/alarm/${alarmId}/assign`, defaultHttpOptionsFromConfig(config));
}
public deleteAlarm(alarmId: string, config?: RequestConfig): Observable<void> {
return this.http.delete<void>(`/api/alarm/${alarmId}`, defaultHttpOptionsFromConfig(config));
public deleteAlarm(alarmId: string, config?: RequestConfig): Observable<boolean> {
return this.http.delete<boolean>(`/api/alarm/${alarmId}`, defaultHttpOptionsFromConfig(config));
}
public getAlarms(query: AlarmQuery,

128
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<AlarmInfo, TimePageLink>
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,27 @@ export class AlarmTableConfig extends EntityTableConfig<AlarmInfo, TimePageLink>
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)
},
{
name: this.translate.instant('alarm.clear'),
icon: 'clear',
isEnabled: true,
onAction: ($event, entities) => this.clearAlarms($event, entities)
},
{
name: this.translate.instant('alarm.delete'),
icon: 'delete',
isEnabled: true,
onAction: ($event, entities) => this.deleteAlarms($event, entities)
}
)
}
fetchAlarms(pageLink: TimePageLink): Observable<PageData<AlarmInfo>> {
@ -294,4 +315,103 @@ export class AlarmTableConfig extends EntityTableConfig<AlarmInfo, TimePageLink>
});
}
ackAlarms($event: Event, alarms: Array<AlarmInfo>) {
if ($event) {
$event.stopPropagation();
}
const unacknowledgedAlarms = alarms.filter(alarm => {
return alarm.status === AlarmStatus.CLEARED_UNACK || alarm.status === AlarmStatus.ACTIVE_UNACK;
})
let title = '';
let content = '';
if (!unacknowledgedAlarms.length) {
title = this.translate.instant('alarm.selected-alarms', {count: alarms.length});
content = this.translate.instant('alarm.selected-alarms-are-acknowledged');
this.dialogService.alert(
title,
content).subscribe();
} else {
title = this.translate.instant('alarm.aknowledge-alarms-title', {count: unacknowledgedAlarms.length});
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<AlarmInfo>[] = [];
for (const alarm of unacknowledgedAlarms) {
tasks.push(this.alarmService.ackAlarm(alarm.id.id));
}
forkJoin(tasks).subscribe(() => {
this.updateData();
});
}
});
}
}
clearAlarms($event: Event, alarms: Array<AlarmInfo>) {
if ($event) {
$event.stopPropagation();
}
const activeAlarms = alarms.filter(alarm => {
return alarm.status === AlarmStatus.ACTIVE_ACK || alarm.status === AlarmStatus.ACTIVE_UNACK;
})
let title = '';
let content = '';
if (!activeAlarms.length) {
title = this.translate.instant('alarm.selected-alarms', {count: alarms.length});
content = this.translate.instant('alarm.selected-alarms-are-cleared');
this.dialogService.alert(
title,
content
).subscribe();
} else {
title = this.translate.instant('alarm.clear-alarms-title', {count: activeAlarms.length});
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<AlarmInfo>[] = [];
for (const alarm of activeAlarms) {
tasks.push(this.alarmService.clearAlarm(alarm.id.id));
}
forkJoin(tasks).subscribe(() => {
this.updateData();
});
}
});
}
}
deleteAlarms($event: Event, alarms: Array<AlarmInfo>) {
if ($event) {
$event.stopPropagation();
}
const title = this.translate.instant('alarm.delete-alarms-title', {count: alarms.length});
const content = this.translate.instant('alarm.delete-alarms-text', {count: alarms.length});
this.dialogService.confirm(
title,
content,
this.translate.instant('action.no'),
this.translate.instant('action.yes')
).subscribe((res) => {
if (res) {
const tasks: Observable<boolean>[] = [];
for (const alarm of alarms) {
tasks.push(this.alarmService.deleteAlarm(alarm.id.id));
}
forkJoin(tasks).subscribe(() => {
this.updateData();
});
}
});
}
}

4
ui-ngx/src/app/modules/home/components/widget/lib/alarms-table-widget.component.ts

@ -903,7 +903,7 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
).subscribe((res) => {
if (res) {
if (res) {
const tasks: Observable<void>[] = [];
const tasks: Observable<AlarmInfo>[] = [];
for (const alarmId of alarmIds) {
tasks.push(this.alarmService.ackAlarm(alarmId));
}
@ -959,7 +959,7 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
).subscribe((res) => {
if (res) {
if (res) {
const tasks: Observable<void>[] = [];
const tasks: Observable<AlarmInfo>[] = [];
for (const alarmId of alarmIds) {
tasks.push(this.alarmService.clearAlarm(alarmId));
}

5
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -512,6 +512,7 @@
"severity-indeterminate": "Indeterminate",
"acknowledge": "Acknowledge",
"clear": "Clear",
"delete": "Delete",
"search": "Search alarms",
"selected-alarms": "{ count, plural, =1 {1 alarm} other {# alarms} } selected",
"no-data": "No data to display",
@ -522,10 +523,14 @@
"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?",
"delete-alarms-title": "Delete { count, plural, =1 {1 alarm} other {# alarms} }",
"delete-alarms-text": "Are you sure you want to delete { count, plural, =1 {1 alarm} other {# alarms} }?",
"selected-alarms-are-cleared": "Selected alarms are already cleared",
"alarm-status-filter": "Alarm Status Filter",
"alarm-filter-title": "Alarm Filter",
"assigned": "Assigned",

Loading…
Cancel
Save