@c8y/ngx-components 1023.15.0 → 1023.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -617,7 +617,7 @@ class AlarmListWidgetConfigComponent {
617
617
  }
618
618
  }
619
619
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AlarmListWidgetConfigComponent, deps: [{ token: AlarmWidgetService }, { token: i2.AlarmService }, { token: i1.AlarmsViewService }, { token: i4.AlertService }, { token: i5.NgForm }, { token: i5.FormBuilder }, { token: i6.WidgetConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
620
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: AlarmListWidgetConfigComponent, isStandalone: true, selector: "c8y-alarm-list-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMapSet", first: true, predicate: ["alarmListPreview"], descendants: true }], ngImport: i0, template: "<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n@if (formGroup) {\n <form\n class=\"row d-flex flex-wrap\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n @for (order of orderList; track order; let i = $index) {\n <div\n class=\"d-flex p-b-8 p-t-4 a-i-center\"\n data-cy=\"c8y-alarm-list-widget-config--order-elements\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--severities-elements\"\n >\n @for (severityOption of severityList; track severityOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n @let severityIcon = severityOption | severityIcon;\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.iconClass }}\"\n [c8yIcon]=\"severityIcon.c8yIcon\"\n ></i>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.severities.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n @if (showDateFilter) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date filter' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <c8y-alarms-date-filter\n [updateQueryParams]=\"false\"\n [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n formControlName=\"dateFilter\"\n (dateFilterChange)=\"onDateFilterChange($event)\"\n ></c8y-alarms-date-filter>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"status\"\n >\n <legend data-cy=\"c8y-alarm-list-widget-config-status-label\">\n {{ 'Status' | translate }}\n </legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--status-elements\"\n >\n @for (statusOption of statusList; track statusOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.status.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-section\"\n >\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-label\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n data-cy=\"c8y-alarm-list-widget-config--showAlarmsForChildren-checkbox\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-xs-12\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n @for (type of types.controls; track type; let i = $index) {\n <div\n class=\"input-group m-b-4\"\n data-cy=\"c8y-alarm-list-widget-config--types-elements\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n data-cy=\"c8y-alarm-list-widget-config--types-remove-type\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n @if (i === types.controls.length - 1) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n data-cy=\"c8y-alarm-list-widget-config--types-add-type\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n }\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n </form>\n}\n\n<ng-template #alarmListPreview>\n @if ((config$ | async)?.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"(config$ | async)?.displayMode\"\n [config]=\"config$ | async\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n <c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInPreviewMode]=\"true\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n }\"\n data-cy=\"c8y-alarm-list-widget-config--preview-alarm-list\"\n ></c8y-alarms-list>\n</ng-template>\n\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i5.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: AlarmsDateFilterComponent, selector: "c8y-alarms-date-filter", inputs: ["DEFAULT_INTERVAL", "updateQueryParams", "date"], outputs: ["dateFilterChange"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: AlarmsListComponent, selector: "c8y-alarms-list", inputs: ["alarms", "hasPermissions", "typeFilters", "loadMoreMode", "navigationOptions", "isInitialLoading", "splitView", "isInPreviewMode"], outputs: ["onSelectedAlarm", "onScrollingStateChange"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SeverityIconPipe, name: "severityIcon" }, { kind: "pipe", type: SortingDescriptionPopoverMessagePipe, name: "sortingDescriptionPopoverMessage" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
620
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: AlarmListWidgetConfigComponent, isStandalone: true, selector: "c8y-alarm-list-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMapSet", first: true, predicate: ["alarmListPreview"], descendants: true }], ngImport: i0, template: "<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n@if (formGroup) {\n <form\n class=\"row d-flex flex-wrap\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n @for (order of orderList; track order; let i = $index) {\n <div\n class=\"d-flex p-b-8 p-t-4 a-i-center\"\n data-cy=\"c8y-alarm-list-widget-config--order-elements\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--severities-elements\"\n >\n @for (severityOption of severityList; track severityOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n @let severityIcon = severityOption | severityIcon;\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.iconClass }}\"\n [c8yIcon]=\"severityIcon.c8yIcon\"\n ></i>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.severities.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n @if (showDateFilter) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date filter' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <c8y-alarms-date-filter\n [updateQueryParams]=\"false\"\n [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n formControlName=\"dateFilter\"\n (dateFilterChange)=\"onDateFilterChange($event)\"\n ></c8y-alarms-date-filter>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"status\"\n >\n <legend data-cy=\"c8y-alarm-list-widget-config-status-label\">\n {{ 'Status' | translate }}\n </legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--status-elements\"\n >\n @for (statusOption of statusList; track statusOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.status.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-section\"\n >\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-label\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n data-cy=\"c8y-alarm-list-widget-config--showAlarmsForChildren-checkbox\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-xs-12\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n @for (type of types.controls; track type; let i = $index) {\n <div\n class=\"input-group m-b-4\"\n data-cy=\"c8y-alarm-list-widget-config--types-elements\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n data-cy=\"c8y-alarm-list-widget-config--types-remove-type\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n @if (i === types.controls.length - 1) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n data-cy=\"c8y-alarm-list-widget-config--types-add-type\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n }\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n </form>\n}\n\n<ng-template #alarmListPreview>\n @if ((config$ | async)?.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"(config$ | async)?.displayMode\"\n [config]=\"config$ | async\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n <c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInPreviewMode]=\"true\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n }\"\n data-cy=\"c8y-alarm-list-widget-config--preview-alarm-list\"\n ></c8y-alarms-list>\n</ng-template>\n\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i5.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: AlarmsDateFilterComponent, selector: "c8y-alarms-date-filter", inputs: ["DEFAULT_INTERVAL", "updateQueryParams", "date"], outputs: ["dateFilterChange"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: AlarmsListComponent, selector: "c8y-alarms-list", inputs: ["alarms", "hasPermissions", "typeFilters", "loadMoreMode", "navigationOptions", "isInitialLoading", "isInPreviewMode"], outputs: ["onSelectedAlarm", "onScrollingStateChange"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SeverityIconPipe, name: "severityIcon" }, { kind: "pipe", type: SortingDescriptionPopoverMessagePipe, name: "sortingDescriptionPopoverMessage" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
621
621
  }
622
622
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AlarmListWidgetConfigComponent, decorators: [{
623
623
  type: Component,
@@ -793,7 +793,7 @@ class AlarmListWidgetComponent {
793
793
  }
794
794
  }
795
795
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AlarmListWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
796
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: AlarmListWidgetComponent, isStandalone: true, selector: "c8y-alarm-list-widget", inputs: { config: "config" }, providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService], ngImport: i0, template: "@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n<c8y-alarms-list\n #list\n [alarms]=\"alarms$ | async\"\n [navigationOptions]=\"{\n alwaysNavigateToAllAlarms: !config.device,\n allowNavigationToAlarmsView: true,\n includeClearedQueryParams: true,\n queryParamsHandling: ''\n }\"\n [isInitialLoading]=\"isLoading$ | async\"\n [hasPermissions]=\"hasPermissions\"\n (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n></c8y-alarms-list>\n", dependencies: [{ kind: "component", type: AlarmsListComponent, selector: "c8y-alarms-list", inputs: ["alarms", "hasPermissions", "typeFilters", "loadMoreMode", "navigationOptions", "isInitialLoading", "splitView", "isInPreviewMode"], outputs: ["onSelectedAlarm", "onScrollingStateChange"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled"], outputs: ["configChange", "refresh"] }, { kind: "component", type: GlobalContextConnectorComponent, selector: "c8y-global-context-connector", inputs: ["controls", "config", "isLoading", "dashboardChild", "linked"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
796
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: AlarmListWidgetComponent, isStandalone: true, selector: "c8y-alarm-list-widget", inputs: { config: "config" }, providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService], ngImport: i0, template: "@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n<c8y-alarms-list\n #list\n [alarms]=\"alarms$ | async\"\n [navigationOptions]=\"{\n alwaysNavigateToAllAlarms: !config.device,\n allowNavigationToAlarmsView: true,\n includeClearedQueryParams: true,\n queryParamsHandling: ''\n }\"\n [isInitialLoading]=\"isLoading$ | async\"\n [hasPermissions]=\"hasPermissions\"\n (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n></c8y-alarms-list>\n", dependencies: [{ kind: "component", type: AlarmsListComponent, selector: "c8y-alarms-list", inputs: ["alarms", "hasPermissions", "typeFilters", "loadMoreMode", "navigationOptions", "isInitialLoading", "isInPreviewMode"], outputs: ["onSelectedAlarm", "onScrollingStateChange"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled"], outputs: ["configChange", "refresh"] }, { kind: "component", type: GlobalContextConnectorComponent, selector: "c8y-global-context-connector", inputs: ["controls", "config", "isLoading", "dashboardChild", "linked"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
797
797
  }
798
798
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AlarmListWidgetComponent, decorators: [{
799
799
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-widgets-implementations-alarms.mjs","sources":["../../widgets/implementations/alarms/alarm-list-widget.model.ts","../../widgets/implementations/alarms/alarm-widget.service.ts","../../widgets/implementations/alarms/severity-icon.pipe.ts","../../widgets/implementations/alarms/sorting-description-popover-message.pipe.ts","../../widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.ts","../../widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.html","../../widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.ts","../../widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.html","../../widgets/implementations/alarms/alarms-widget.module.ts","../../widgets/implementations/alarms/c8y-ngx-components-widgets-implementations-alarms.ts"],"sourcesContent":["import type { AlarmStatusSettings, SeverityFilter } from '@c8y/client';\nimport { GlobalAutoRefreshWidgetConfig } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport type { GlobalContextState } from '@c8y/ngx-components/global-context';\n\nexport const ALARM_ORDER_VALUES = {\n BY_ACTIVE: 'BY_ACTIVE',\n BY_DATE_ASCENDING: 'BY_DATE_ASCENDING',\n BY_DATE_DESCENDING: 'BY_DATE_DESCENDING',\n BY_SEVERITY: 'BY_SEVERITY'\n} as const;\n\nexport const ALARM_ORDER_LABELS = {\n BY_ACTIVE: gettext('By active status') as 'By active status',\n BY_DATE_ASCENDING: gettext('By date (ascending)') as 'By date (ascending)',\n BY_DATE_DESCENDING: gettext('By date (descending)') as 'By date (descending)',\n BY_SEVERITY: gettext('By severity') as 'By severity'\n} as const;\n\nexport type AlarmOrderType = keyof typeof ALARM_ORDER_VALUES;\n\nexport type SelectedDevice = { id: string; name: string };\n\nexport const ASSET_ALARMS_WIDGET_ID = 'Asset Alarms';\n\nexport const RECENT_ALARMS_WIDGET_ID = 'Recent Alarms';\n\n// TODO: remove\nexport type AlarmListRefreshOption = 'none' | 'interval' | 'global-interval';\n\n// TODO: remove\nexport const GLOBAL_INTERVAL_OPTION: AlarmListRefreshOption = 'global-interval';\n\nexport type LegacyAlarmListConfig = {\n realtime: boolean;\n options: {\n severity: SeverityFilter;\n types: string[];\n orderMode: string;\n device: string;\n status: AlarmStatusSettings;\n };\n device?: {\n name: string;\n id: string;\n };\n};\n\nexport interface AlarmListWidgetConfig\n extends Partial<GlobalContextState>,\n GlobalAutoRefreshWidgetConfig {\n order: AlarmOrderType;\n showAlarmsForChildren?: boolean;\n device?: SelectedDevice | null;\n severities: SeverityFilter;\n status: AlarmStatusSettings;\n types?: string[];\n isRealtime?: boolean;\n realtime?: boolean;\n widgetId?: string;\n}\n","import { Injectable } from '@angular/core';\nimport {\n AlarmQueryFilter,\n AlarmStatusSettings,\n AlarmStatus,\n IAlarm,\n Severity,\n SeverityFilter,\n SEVERITY_LABELS\n} from '@c8y/client';\n\nimport { SeveritySettings, SeverityType } from '@c8y/client';\nimport { AlarmsViewService } from '@c8y/ngx-components/alarms';\nimport {\n ALARM_ORDER_VALUES,\n AlarmListWidgetConfig,\n AlarmOrderType,\n LegacyAlarmListConfig,\n RECENT_ALARMS_WIDGET_ID\n} from './alarm-list-widget.model';\n\nexport const DEFAULT_PAGE_SIZE = 20;\n\n@Injectable({ providedIn: 'root' })\nexport class AlarmWidgetService {\n constructor(private alarmsViewService: AlarmsViewService) {}\n\n /**\n * Checks if the provided data follows the LegacyAlarmConfig structure.\n *\n * This function determines if a given data object is an instance of LegacyAlarmConfig\n * by checking for the presence of the 'options' property.\n *\n * @param data - The data object to be checked.\n * @returns - Returns `true` if the data object is a LegacyAlarmConfig, otherwise `false`.\n */\n isOldAlarmConfigStructure(\n data: LegacyAlarmListConfig | AlarmListWidgetConfig\n ): data is LegacyAlarmListConfig {\n return data !== null && typeof data === 'object' && 'options' in data;\n }\n\n /**\n * Creates predefined widget configuration object.\n *\n * This method creates a new configuration object based on\n * a widgets ID (that determines if is a legacy Recent or Critical alarms widget).\n *\n * @param isIntervalRefresh - determines a type of a refresh.\n * @param widgetId - determines if a config should be done for Recent or Critical alarms widget.\n * @returns The new, predefined configuration object.\n */\n getPredefinedConfiguration(widgetId?: string, existingConfig?: any): AlarmListWidgetConfig {\n // Check if any time/refresh configuration exists (cast to any for legacy properties)\n const hasAnyTimeConfig =\n existingConfig?.dateTimeContext ||\n existingConfig?.dateFilter ||\n existingConfig?.date ||\n existingConfig?.dateFrom ||\n existingConfig?.dateTo ||\n existingConfig?.refreshOption ||\n existingConfig?.isAutoRefreshEnabled !== undefined ||\n existingConfig?.refreshInterval ||\n existingConfig?.aggregation !== undefined;\n\n const config: AlarmListWidgetConfig = {\n order: ALARM_ORDER_VALUES.BY_ACTIVE,\n severities:\n widgetId === RECENT_ALARMS_WIDGET_ID\n ? ({\n [Severity.CRITICAL]: true,\n [Severity.MAJOR]: true,\n [Severity.MINOR]: true,\n [Severity.WARNING]: true\n } as SeveritySettings)\n : ({\n [Severity.CRITICAL]: true,\n [Severity.MAJOR]: false,\n [Severity.MINOR]: false,\n [Severity.WARNING]: false\n } as SeveritySettings),\n status:\n widgetId === RECENT_ALARMS_WIDGET_ID\n ? ({\n [AlarmStatus.ACKNOWLEDGED]: true,\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.CLEARED]: true\n } as AlarmStatusSettings)\n : ({\n [AlarmStatus.ACKNOWLEDGED]: false,\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.CLEARED]: false\n } as AlarmStatusSettings),\n types: [''],\n widgetId: widgetId || ''\n };\n\n // Only add global context defaults if no time/refresh config exists at all\n if (!hasAnyTimeConfig) {\n config.isAutoRefreshEnabled = true;\n config.refreshInterval = this.alarmsViewService.DEFAULT_INTERVAL_VALUE;\n config.aggregation = null;\n config.refreshOption = 'live';\n config.dateTimeContext = {\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date().toISOString(),\n interval: 'custom'\n };\n }\n\n return config;\n }\n\n /**\n * Transforms a LegacyAlarmConfig object into an AlarmListWidgetConfig object.\n *\n * This function maps the properties from an old configuration structure (LegacyAlarmConfig)\n * to a new configuration structure (AlarmListWidgetConfig).\n *\n * @param oldConfig - The old configuration object to be transformed.\n * @returns - The new configuration object mapped from the old one.\n */\n mapToNewConfigStructure(oldConfig: LegacyAlarmListConfig): AlarmListWidgetConfig {\n const order: AlarmOrderType =\n oldConfig.options.orderMode === 'ACTIVE_FIRST'\n ? ALARM_ORDER_VALUES.BY_ACTIVE\n : ALARM_ORDER_VALUES.BY_SEVERITY;\n\n if (!this.isContainingAllSeverityTypes(oldConfig.options.severity)) {\n oldConfig.options.severity = this.addAllMissingSeverityTypes(oldConfig.options.severity);\n }\n\n return {\n order: order,\n isRealtime: oldConfig.realtime,\n device: oldConfig.device,\n showAlarmsForChildren: true,\n severities: oldConfig.options.severity,\n status: this.allValuesFalse(oldConfig.options.status)\n ? ({\n [AlarmStatus.ACKNOWLEDGED]: true,\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.CLEARED]: true\n } as AlarmStatusSettings)\n : oldConfig.options.status,\n types: oldConfig.options.types?.length ? oldConfig.options.types : [''],\n isAutoRefreshEnabled: true,\n refreshInterval: this.alarmsViewService.DEFAULT_INTERVAL_VALUE\n };\n }\n\n /**\n * Checks if the provided severity object contains all the predefined severity types.\n *\n * @param severity - A record object where keys are severity type strings and values are boolean.\n * - This object is checked against the predefined severity types.\n * @returns `true` if all predefined severity types are present in the severity object; otherwise, `false`.\n */\n isContainingAllSeverityTypes(severity: SeverityFilter): boolean {\n return Object.keys(SEVERITY_LABELS).every(severityType => severityType in severity);\n }\n\n /**\n * Adds any missing severity types to the provided severity object with a default value of `false`.\n *\n * @param severity - A record object where keys are severity type strings and values are boolean.\n * - Missing severity types will be added to this object.\n * @returns The modified severity object, which includes all predefined severity types, adding any\n * that were missing with a value of `false`.\n */\n addAllMissingSeverityTypes(severity: SeverityFilter): SeverityFilter {\n Object.keys(SEVERITY_LABELS).forEach(severityType => {\n if (!(severityType in severity)) {\n severity[severityType] = false;\n }\n });\n return severity;\n }\n\n /**\n * Maps an AlarmListWidgetConfig object to an AlarmQueryFilter.\n *\n * This function converts the provided AlarmListWidgetConfig into a format suitable for querying alarms.\n *\n * @param config - The configuration object for the alarm list widget.\n * @param pageSize - Optional number specifying the size of the pages to be returned in the query.\n * @returns - The query filter object constructed from the provided configuration.\n */\n mapConfigToQueryFilter(config: AlarmListWidgetConfig, pageSize?: number): AlarmQueryFilter {\n const filter: AlarmQueryFilter = {\n pageSize: pageSize || DEFAULT_PAGE_SIZE,\n query: this.getOrderParameters(config.order),\n severity: this.extractFilterParams(config.severities || {}),\n status: this.extractFilterParams(config.status || {}),\n type: (config.types || []).join(','),\n withTotalPages: true\n };\n if (config.dateTimeContext) {\n const { dateFrom, dateTo } = config.dateTimeContext;\n filter.lastUpdatedFrom = typeof dateFrom === 'string' ? dateFrom : dateFrom.toISOString();\n filter.createdTo = typeof dateTo === 'string' ? dateTo : dateTo.toISOString();\n }\n if (config.device) {\n filter.source = config.device.id;\n filter.withSourceAssets = true;\n filter.withSourceDevices = true;\n filter.withSourceAssets = config.showAlarmsForChildren ?? true;\n filter.withSourceDevices = config.showAlarmsForChildren ?? true;\n }\n return filter;\n }\n\n /**\n * Extracts and concatenates filter parameters from a given object.\n *\n * This function takes an object containing filter settings (either SeverityFilter\n * or AlarmStatusSettings) and returns a string of all keys where the corresponding value is true.\n * If the object is empty or null, an empty string is returned.\n *\n * @param obj - The object containing filter settings.\n * @returns - A concatenated string of keys with true values, separated by commas.\n */\n extractFilterParams(obj: SeverityFilter | AlarmStatusSettings): string {\n if (!obj) {\n return '';\n }\n return Object.entries(obj)\n .filter(([, value]) => value)\n .map(([key]) => key)\n .join(',');\n }\n\n /**\n * Determines if an incoming real-time alarm has a different status than an existing alarm.\n *\n * This function checks if the provided incoming real-time alarm's status differs\n * from that of an existing alarm with the same ID in the given array of alarms.\n *\n * @param existingAlarms - The array of existing alarms.\n * @param incomingRealtimeAlarm - The incoming real-time alarm to check.\n * @returns - True if the existing alarm's status has changed, otherwise false.\n */\n hasExistingAlarmChangedStatus(existingAlarms: IAlarm[], incomingRealtimeAlarm: IAlarm): boolean {\n const existingAlarm = existingAlarms.find(alarm => alarm.id === incomingRealtimeAlarm.id);\n return !!existingAlarm && existingAlarm.status !== incomingRealtimeAlarm.status;\n }\n\n /**\n * Filters alarms based on their status, severity, and type.\n *\n * This method determines if a given alarm, identified either by a numeric ID or an `IAlarm` object,\n * matches specific criteria defined in `alarms` and optionally `config`.\n *\n * @param alarm - The alarm to check, represented either by a numeric ID or an `IAlarm` object.\n * @param alarms - An array of `IAlarm` objects against which the given alarm is evaluated.\n * @param config - Optional. Configuration for the alarm list widget, used to define additional\n * filtering criteria.\n *\n * @returns `true` if the alarm matches the specified criteria; otherwise, `false`.\n * If `alarm` is a number, it always returns `false`.\n * If `config` is not provided, it uses a legacy filter for critical alarms.\n *\n * @remarks\n * - When `alarm` is a numeric ID, the function returns `false` as it cannot match against type and severity.\n * - If `config` is not provided, the function assumes a legacy scenario for filtering all critical alarms.\n */\n filterAlarmsByStatusSeverityAndType(\n alarm: number | IAlarm,\n alarms: IAlarm[],\n config?: AlarmListWidgetConfig\n ): boolean {\n if (typeof alarm === 'number') {\n return false;\n }\n\n return this.isAlarmMatchedByConfig(alarm, alarms, config);\n }\n\n /**\n * Determines if all values in the given object are false.\n *\n * This function checks every value in the provided object to see if they are all false.\n *\n * @param obj - An object with boolean values.\n * @returns - Returns `true` if all values in the object are false, otherwise `false`.\n */\n allValuesFalse(obj: { [key: string]: boolean }): boolean {\n return Object.values(obj).every(value => !value);\n }\n\n /**\n * Constructs a string of order parameters for a query based on the specified alarm order.\n *\n * This function takes an alarm order and maps it to a corresponding set of order parameters.\n * It supports different ordering types, such as BY_ACTIVE, BY_SEVERITY, and BY_DATE_ASCENDING.\n * The order parameters are used to construct a query string that determines the order\n * in which alarms are retrieved or displayed.\n *\n * @param order - The specified order for sorting alarms (e.g., BY_ACTIVE).\n * @returns - A string of order parameters to be used in a query, or an empty string if the order type is unrecognized.\n */\n getOrderParameters(order: AlarmOrderType): string {\n let orderParams: string[];\n\n switch (order) {\n case ALARM_ORDER_VALUES.BY_ACTIVE:\n orderParams = ['status asc', 'severity asc', 'time.date desc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n case ALARM_ORDER_VALUES.BY_SEVERITY:\n orderParams = ['severity asc', 'time.date desc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n case ALARM_ORDER_VALUES.BY_DATE_ASCENDING:\n orderParams = ['time.date asc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n default:\n orderParams = ['time.date desc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n }\n }\n\n /**\n * Determines if an alarm is matched by the specified widget configuration.\n *\n * This function evaluates whether a given alarm should be included based on the severity,\n * status, and type filters defined in the AlarmListWidgetConfig. It checks if the alarm's\n * severity and status match the configuration settings and if the alarm's type is included\n * in the configuration's types (if specified).\n *\n * @ignore\n * @param alarm - The alarm to evaluate.\n * @param alarms - An array of existing alarms, used for status matching.\n * @param config - The configuration settings to match against.\n * @returns - Returns `true` if the alarm matches the configuration criteria; otherwise, `false`.\n */\n isAlarmMatchedByConfig(alarm: IAlarm, alarms: IAlarm[], config: AlarmListWidgetConfig): boolean {\n const isSeverityMatched = this.isSeverityMatching(alarm.severity, config);\n const isStatusMatched = this.isStatusMatching(alarm, alarms, config);\n const isTypeMatched = this.isTypesMatching(config, alarm);\n\n return isSeverityMatched && isStatusMatched && isTypeMatched;\n }\n /**\n * Checks if the severity of an alarm matches the configuration setting.\n *\n * This function determines whether the severity of an alarm is included in the\n * severity settings defined in the AlarmListWidgetConfig.\n *\n * @ignore\n * @param severity - The severity of the alarm to check.\n * @param config - The configuration with severity settings.\n * @returns - Returns `true` if the alarm's severity matches the configuration; otherwise, `false`.\n */\n isSeverityMatching(severity: SeverityType, config: AlarmListWidgetConfig): boolean {\n return !!config.severities[severity];\n }\n\n /**\n * Evaluates if the status of an alarm matches the configuration setting or has changed.\n *\n * This function checks if the status of an alarm is included in the status settings defined in\n * the AlarmListWidgetConfig, or if the alarm's status has changed based on the existing alarms.\n *\n * @ignore\n * @param alarm - The alarm whose status is to be evaluated.\n * @param alarms - An array of existing alarms to compare against for status changes.\n * @param config - The configuration with status settings.\n * @returns - Returns `true` if the alarm's status matches or has changed as per the configuration; otherwise, `false`.\n */\n isStatusMatching(alarm: IAlarm, alarms: IAlarm[], config: AlarmListWidgetConfig): boolean {\n return !!config.status[alarm.status] || this.hasExistingAlarmChangedStatus(alarms, alarm);\n }\n\n /**\n * Checks if the configuration's types array contains only empty string or includes a specific alarm type.\n *\n * @param config - The configuration object with a `types` property.\n * @param alarm - The alarm object with a `type` property to check against the config's types.\n * @returns `true` if the config's types array contains only empty string or includes the alarm's type, otherwise `false`.\n */\n isTypesMatching(config: AlarmListWidgetConfig, alarm: IAlarm): boolean {\n return Array.isArray(config.types) && config.types.length === 1 && config.types[0] === ''\n ? true\n : (config.types?.includes(alarm.type) ?? false);\n }\n\n /**\n * Constructs a query string from an array of order parameters.\n *\n * This function takes an array of ordering parameters and constructs a query string\n * for use in alarm ordering queries. The parameters are concatenated into a single string,\n * prefixed with '$orderby='.\n *\n * @ignore\n * @private\n * @param orderParams - The order parameters to be included in the query.\n * @returns - A query string representing the order parameters.\n */\n private buildOrderParameters(orderParams: string[]): string {\n return `$orderby=${orderParams.join(',')}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity } from '@c8y/client';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\n\ninterface SeverityIcon {\n c8yIcon?: string;\n iconClass: string;\n severityClass?: string;\n}\n\n@Pipe({ name: 'severityIcon' })\nexport class SeverityIconPipe implements PipeTransform {\n transform(severity: string): SeverityIcon {\n let severityClassName = '';\n let iconClassName: SupportedIconsSuggestions = '';\n\n switch (severity) {\n case Severity.CRITICAL:\n severityClassName = 'critical';\n iconClassName = 'exclamation-circle';\n break;\n case Severity.MAJOR:\n severityClassName = 'major';\n iconClassName = 'warning';\n break;\n case Severity.MINOR:\n severityClassName = 'minor';\n iconClassName = 'high-priority';\n break;\n case Severity.WARNING:\n severityClassName = 'warning';\n iconClassName = 'circle';\n break;\n default:\n return { iconClass: '', severityClass: '' };\n }\n\n return {\n iconClass: `status icon-lg stroked-icon dlt-c8y-icon-${iconClassName} ${severityClassName}`,\n c8yIcon: severityClassName\n };\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ALARM_ORDER_VALUES, AlarmOrderType } from './alarm-list-widget.model';\n\n@Pipe({ name: 'sortingDescriptionPopoverMessage' })\nexport class SortingDescriptionPopoverMessagePipe implements PipeTransform {\n transform(order: AlarmOrderType): string {\n switch (order) {\n case ALARM_ORDER_VALUES.BY_ACTIVE:\n return gettext('Order alarms by active status, severity, and time.');\n case ALARM_ORDER_VALUES.BY_DATE_ASCENDING:\n return gettext('Order alarms by time, starting with the oldest ones.');\n case ALARM_ORDER_VALUES.BY_DATE_DESCENDING:\n return gettext('Order alarms by time, starting with the latest ones.');\n case ALARM_ORDER_VALUES.BY_SEVERITY:\n return gettext('Order alarms by severity and time.');\n default:\n return '';\n }\n }\n}\n","import { AsyncPipe, NgClass } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport {\n ControlContainer,\n FormArray,\n FormBuilder,\n FormControl,\n FormGroup,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidatorFn\n} from '@angular/forms';\nimport {\n ALARM_STATUS_LABELS,\n AlarmService,\n AlarmStatus,\n IAlarm,\n IResultList,\n SEVERITY_LABELS\n} from '@c8y/client';\nimport {\n AlertService,\n C8yTranslatePipe,\n OnBeforeSave,\n FormGroupComponent,\n IconDirective,\n MessageDirective,\n MessagesComponent,\n RequiredInputPlaceholderDirective\n} from '@c8y/ngx-components';\nimport {\n ALARM_STATUS_ICON,\n AlarmsDateFilterComponent,\n AlarmsListComponent,\n AlarmsViewService,\n DEFAULT_SEVERITY_VALUES,\n DEFAULT_STATUS_VALUES\n} from '@c8y/ngx-components/alarms';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n LocalControlsComponent,\n PRESET_NAME,\n PresetName\n} from '@c8y/ngx-components/global-context';\nimport { merge } from 'lodash-es';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { BehaviorSubject, EMPTY, from, Observable, Subject } from 'rxjs';\nimport { filter, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport {\n ALARM_ORDER_LABELS,\n ALARM_ORDER_VALUES,\n AlarmListWidgetConfig,\n AlarmOrderType\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService, DEFAULT_PAGE_SIZE } from '../alarm-widget.service';\nimport { SeverityIconPipe } from '../severity-icon.pipe';\nimport { SortingDescriptionPopoverMessagePipe } from '../sorting-description-popover-message.pipe';\n\n@Component({\n selector: 'c8y-alarm-list-widget-config',\n templateUrl: './alarm-list-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n PopoverDirective,\n FormGroupComponent,\n AlarmsDateFilterComponent,\n RequiredInputPlaceholderDirective,\n NgClass,\n IconDirective,\n MessagesComponent,\n MessageDirective,\n AlarmsListComponent,\n C8yTranslatePipe,\n AsyncPipe,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe,\n LocalControlsComponent\n ]\n})\nexport class AlarmListWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n @Input() config: AlarmListWidgetConfig;\n\n readonly REFRESH_INTERVAL_IN_MILLISECONDS = this.alarmsViewService.DEFAULT_INTERVAL_VALUES;\n readonly SEVERITY_LABELS = SEVERITY_LABELS;\n readonly STATUS_LABELS = ALARM_STATUS_LABELS;\n\n readonly ACKNOWLEDGE_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;\n readonly CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;\n\n readonly BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;\n readonly BELL_ICON = ALARM_STATUS_ICON.BELL;\n readonly C8Y_ALERT_IDLE_ICON = ALARM_STATUS_ICON.ALERT_IDLE;\n\n readonly ALARM_ORDER_LABELS = ALARM_ORDER_LABELS;\n\n alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n formGroup: ReturnType<AlarmListWidgetConfigComponent['createForm']>;\n\n isLoading: boolean;\n orderList = Object.values(ALARM_ORDER_VALUES);\n severityList = Object.keys(SEVERITY_LABELS);\n /**\n * Order does matter.\n */\n statusList = [AlarmStatus.ACTIVE, AlarmStatus.ACKNOWLEDGED, AlarmStatus.CLEARED];\n\n @ViewChild('alarmListPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private destroy$ = new Subject<void>();\n\n config$ = this.widgetConfigService.currentConfig$.pipe(\n filter(config => !!config),\n filter(c => c.dateTimeContext),\n tap(config => {\n if (!this.formGroup) {\n this.initializeForm();\n } else {\n this.formGroup.patchValue(config, { emitEvent: false });\n }\n }),\n takeUntil(this.destroy$),\n shareReplay(1)\n );\n\n controls: PresetName = PRESET_NAME.ALARM_LIST;\n constructor(\n private alarmListWidgetService: AlarmWidgetService,\n private alarmService: AlarmService,\n private alarmsViewService: AlarmsViewService,\n private alertService: AlertService,\n private form: NgForm,\n private formBuilder: FormBuilder,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n ngOnInit(): void {\n this.config$\n .pipe(\n takeUntil(this.destroy$),\n filter(config => {\n const displayMode = config?.displayMode ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n if (displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n return !!config?.isGlobalContextReady;\n }\n return true;\n }),\n switchMap(config => {\n if (\n (config?.severities && this.alarmListWidgetService.allValuesFalse(config.severities)) ||\n (config?.status && this.alarmListWidgetService.allValuesFalse(config.status))\n ) {\n this.alarms$.next({ data: [], res: null });\n return EMPTY;\n }\n const isWidgetWithExistingConfig = config.order && config.severities && config.status;\n const filterConfig = isWidgetWithExistingConfig\n ? config\n : { ...this.formGroup.value, ...config };\n return from(this.getAlarms(filterConfig as AlarmListWidgetConfig));\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: AlarmListWidgetConfig): boolean | Promise<boolean> | Observable<boolean> {\n const { types } = this.formGroup.value;\n if (types.length > 1) {\n const stringTypes = types as string[];\n\n if (this.isContainingOnlyEmptyTypes(stringTypes)) {\n this.formGroup.value.types = [''];\n } else {\n this.formGroup.value.types = this.filterEmptyTypes(stringTypes);\n }\n }\n\n /**\n * Applies only to converted legacy Alarm list widget\n */\n if (config['options']) {\n delete config['options'];\n }\n\n Object.assign(config, this.formGroup.value);\n\n return true;\n }\n\n removeType(index: number): void {\n if (this.types.controls.length === 1) {\n this.formGroup.get('types').reset();\n } else {\n this.types.removeAt(index);\n }\n }\n\n addType(): void {\n this.types.push(this.formBuilder.control(''));\n }\n\n get types(): FormArray {\n return this.formGroup.get('types') as FormArray;\n }\n\n private filterEmptyTypes(types: (string | null)[]): string[] {\n return types.filter((element: string | null) => element !== '' && element !== null);\n }\n\n private isContainingOnlyEmptyTypes(types: (string | null)[]): boolean {\n return types.every((element: string | null) => element === '' || element === null);\n }\n\n private async getAlarms(config: AlarmListWidgetConfig): Promise<void> {\n try {\n this.isLoading = true;\n const result: IResultList<IAlarm> = await this.alarmService.list(\n this.alarmListWidgetService.mapConfigToQueryFilter(config, DEFAULT_PAGE_SIZE)\n );\n\n this.alarms$.next(result);\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading = false;\n }\n }\n\n private initializeForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config, { emitEvent: false });\n this.initializeTypes(this.config.types);\n\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\n this.config = merge(this.config, value);\n this.getAlarms(this.config);\n });\n }\n\n private createForm() {\n return this.formBuilder.group({\n status: this.formBuilder.group(DEFAULT_STATUS_VALUES, {\n validators: this.minSelectedCheckboxes(1)\n }),\n showAlarmsForChildren: true,\n types: this.formBuilder.array([]),\n severities: this.formBuilder.group(DEFAULT_SEVERITY_VALUES, {\n validators: this.minSelectedCheckboxes(1)\n }),\n order: ALARM_ORDER_VALUES.BY_ACTIVE as AlarmOrderType,\n device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined)\n });\n }\n\n private minSelectedCheckboxes(min = 1): ValidatorFn {\n const validator: ValidatorFn = (formGroup: FormGroup) => {\n const totalSelected = Object.values(formGroup.controls).reduce(\n (prev, next) => (next.value ? prev + next.value : prev),\n 0\n );\n\n return totalSelected >= min ? null : { required: true };\n };\n\n return validator;\n }\n\n private initializeTypes(types: string[]): void {\n const typesControl = this.formGroup.get('types') as FormArray;\n if (types) {\n types.forEach(type => {\n typesControl.push(this.formBuilder.control(type));\n });\n } else {\n typesControl.push(this.formBuilder.control(''));\n }\n }\n}\n","<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n@if (formGroup) {\n <form\n class=\"row d-flex flex-wrap\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n @for (order of orderList; track order; let i = $index) {\n <div\n class=\"d-flex p-b-8 p-t-4 a-i-center\"\n data-cy=\"c8y-alarm-list-widget-config--order-elements\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--severities-elements\"\n >\n @for (severityOption of severityList; track severityOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n @let severityIcon = severityOption | severityIcon;\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.iconClass }}\"\n [c8yIcon]=\"severityIcon.c8yIcon\"\n ></i>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.severities.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n @if (showDateFilter) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date filter' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <c8y-alarms-date-filter\n [updateQueryParams]=\"false\"\n [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n formControlName=\"dateFilter\"\n (dateFilterChange)=\"onDateFilterChange($event)\"\n ></c8y-alarms-date-filter>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"status\"\n >\n <legend data-cy=\"c8y-alarm-list-widget-config-status-label\">\n {{ 'Status' | translate }}\n </legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--status-elements\"\n >\n @for (statusOption of statusList; track statusOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.status.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-section\"\n >\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-label\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n data-cy=\"c8y-alarm-list-widget-config--showAlarmsForChildren-checkbox\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-xs-12\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n @for (type of types.controls; track type; let i = $index) {\n <div\n class=\"input-group m-b-4\"\n data-cy=\"c8y-alarm-list-widget-config--types-elements\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n data-cy=\"c8y-alarm-list-widget-config--types-remove-type\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n @if (i === types.controls.length - 1) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n data-cy=\"c8y-alarm-list-widget-config--types-add-type\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n }\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n </form>\n}\n\n<ng-template #alarmListPreview>\n @if ((config$ | async)?.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"(config$ | async)?.displayMode\"\n [config]=\"config$ | async\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n <c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInPreviewMode]=\"true\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n }\"\n data-cy=\"c8y-alarm-list-widget-config--preview-alarm-list\"\n ></c8y-alarms-list>\n</ng-template>\n\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, inject, signal } from '@angular/core';\nimport { AlarmService, IAlarm, IResultList } from '@c8y/client';\nimport {\n AlarmRealtimeService,\n AlarmWithChildrenRealtimeService,\n AlertService,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator\n} from '@c8y/ngx-components';\nimport { AlarmsListComponent } from '@c8y/ngx-components/alarms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n LocalControlsComponent,\n GlobalContextState,\n GlobalContextConnectorComponent,\n REFRESH_OPTION,\n WidgetConfigMigrationService,\n PresetName,\n DisplayMode,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n CONTEXT_FEATURE,\n PRESET_NAME\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { isEmpty, isMatch, merge } from 'lodash-es';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport {\n AlarmListWidgetConfig,\n ASSET_ALARMS_WIDGET_ID,\n RECENT_ALARMS_WIDGET_ID\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService } from '../alarm-widget.service';\n\n@Component({\n selector: 'c8y-alarm-list-widget',\n templateUrl: './alarm-list-widget.component.html',\n providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService],\n imports: [AlarmsListComponent, AsyncPipe, LocalControlsComponent, GlobalContextConnectorComponent]\n})\nexport class AlarmListWidgetComponent implements OnInit, OnDestroy, DynamicComponent {\n private alarmWidgetService = inject(AlarmWidgetService);\n private alarmService = inject(AlarmService);\n private dashboardChild = inject(DashboardChildComponent);\n private alertService = inject(AlertService);\n private widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n\n @Input() config: AlarmListWidgetConfig;\n displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n contextConfig = signal<GlobalContextState>({});\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(true);\n alerts: DynamicComponentAlertAggregator;\n widgetControls = signal<PresetName>(PRESET_NAME.ALARM_LIST);\n\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n readonly CONTEXT_FEATURE = CONTEXT_FEATURE;\n readonly REFRESH_OPTION = REFRESH_OPTION;\n readonly PRESET_NAME = PRESET_NAME;\n\n private TIMEOUT_ERROR_TEXT = gettext(\n 'The request is taking longer than usual. We apologize for the inconvenience.'\n );\n private SERVER_ERROR_TEXT = gettext('Server error occurred.');\n private unsubscribe$ = new Subject<void>();\n hasPermissions = true;\n\n async ngOnInit(): Promise<void> {\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n const alarmsWidgetId =\n this.dashboardChild['data']?.componentId ?? this.dashboardChild['data']?.name;\n\n // Check for legacy angularJS widget without proper configuration\n const isLegacyWidgetWithoutConfiguration =\n (this.config?.widgetId ?? alarmsWidgetId) === defaultWidgetIds.ALL_CRITICAL_ALARMS ||\n (this.config?.widgetId ?? alarmsWidgetId) === defaultWidgetIds.RECENT_ALARMS ||\n isEmpty(this.config) ||\n (isMatch(this.config, { displaySettings: { globalAutoRefreshContext: true } }) &&\n !this.config['options']?.device &&\n !this.config.types &&\n !this.config.status &&\n !this.config.severities);\n\n if (isLegacyWidgetWithoutConfiguration) {\n let updatedId = alarmsWidgetId;\n const assetAlarms =\n this.dashboardChild['data']?.title === 'Active, critical alarms' && 'Asset alarms';\n const recentAlarms =\n this.dashboardChild['data']?.title === 'Recent alarms' && 'Recent alarms';\n\n if (assetAlarms) {\n updatedId = ASSET_ALARMS_WIDGET_ID;\n }\n if (recentAlarms) {\n updatedId = RECENT_ALARMS_WIDGET_ID;\n }\n\n this.setLegacyRecentOrCriticalAlarmWidgetConfig(updatedId);\n this.config.widgetId = updatedId;\n } else if (this.alarmWidgetService.isOldAlarmConfigStructure(this.config)) {\n const mappedConfig = this.alarmWidgetService.mapToNewConfigStructure(this.config);\n Object.assign(this.config, mappedConfig);\n }\n\n if (\n this.config?.widgetId === RECENT_ALARMS_WIDGET_ID ||\n this.config?.widgetId === ASSET_ALARMS_WIDGET_ID\n ) {\n this.widgetControls.set(PRESET_NAME.ALARM_LIST_LEGACY);\n }\n\n const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(this.config);\n this.config = merge(this.config, migratedConfig);\n\n const resolvedWidgetId = this.config?.widgetId ?? alarmsWidgetId ?? defaultWidgetIds.ALARM_LIST;\n this.config.widgetId = resolvedWidgetId;\n\n const displayMode = this.config.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n this.displayMode.set(displayMode as DisplayMode);\n\n const initialContextConfig = {\n dateTimeContext: this.config.dateTimeContext,\n aggregation: this.config.aggregation,\n isAutoRefreshEnabled: this.config.isAutoRefreshEnabled,\n refreshInterval: this.config.refreshInterval,\n refreshOption: this.config.refreshOption\n };\n this.contextConfig.set(initialContextConfig);\n\n // In dashboard mode, wait for GlobalContextConnector to emit the first state\n // In config modes, fetch immediately with widget config\n if (displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n await this.fetchAlarms();\n }\n }\n\n ngOnDestroy(): void {\n if (this.config?.isRealtime) {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n const { diff, context } = event;\n if (\n diff.isAutoRefreshEnabled === false &&\n Object.keys(diff).length === 1 &&\n context.refreshOption === REFRESH_OPTION.LIVE\n ) {\n return;\n }\n\n this.contextConfig.set(event.context);\n void this.fetchAlarms();\n }\n\n getDashboardChild(): DashboardChildComponent {\n return this.dashboardChild;\n }\n\n onRefresh(): void {\n void this.fetchAlarms();\n }\n\n onScrollingStateChange(isScrolling: boolean): void {\n const current = this.contextConfig();\n\n if (current.refreshOption === REFRESH_OPTION.HISTORY) {\n return;\n }\n this.contextConfig.set({ ...current, isAutoRefreshEnabled: !isScrolling });\n this.isLinkedToGlobal.set(!isScrolling);\n }\n\n private async fetchAlarms(): Promise<void> {\n const alarms = await this.getAlarms();\n this.alarms$.next(alarms);\n }\n\n private async getAlarms(): Promise<IResultList<IAlarm>> {\n try {\n this.isLoading$.next(true);\n const effectiveConfig = {\n ...this.config,\n ...this.contextConfig()\n };\n return await this.alarmService.list(\n this.alarmWidgetService.mapConfigToQueryFilter(effectiveConfig)\n );\n } catch (error) {\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text:\n error?.name === 'TimeoutError'\n ? this.TIMEOUT_ERROR_TEXT\n : (error?.message ?? this.SERVER_ERROR_TEXT)\n })\n );\n if (error?.res?.status === 403) {\n this.hasPermissions = false;\n return;\n }\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private setLegacyRecentOrCriticalAlarmWidgetConfig(widgetId: string): void {\n if (widgetId === RECENT_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n RECENT_ALARMS_WIDGET_ID,\n this.config\n );\n Object.assign(this.config, predefinedConfig);\n return;\n }\n\n if (widgetId === ASSET_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n ASSET_ALARMS_WIDGET_ID,\n this.config\n );\n Object.assign(this.config, predefinedConfig);\n }\n }\n}\n","@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n<c8y-alarms-list\n #list\n [alarms]=\"alarms$ | async\"\n [navigationOptions]=\"{\n alwaysNavigateToAllAlarms: !config.device,\n allowNavigationToAlarmsView: true,\n includeClearedQueryParams: true,\n queryParamsHandling: ''\n }\"\n [isInitialLoading]=\"isLoading$ | async\"\n [hasPermissions]=\"hasPermissions\"\n (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n></c8y-alarms-list>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule as NgFormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport {\n CommonModule,\n CountdownIntervalModule,\n DocsModule,\n FormsModule\n} from '@c8y/ngx-components';\nimport { AlarmsModule } from '@c8y/ngx-components/alarms';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AlarmListWidgetConfigComponent } from './alarm-list-widget-config/alarm-list-widget-config.component';\nimport { AlarmListWidgetComponent } from './alarm-list-widget-view/alarm-list-widget.component';\nimport { SortingDescriptionPopoverMessagePipe } from './sorting-description-popover-message.pipe';\nimport { SeverityIconPipe } from './severity-icon.pipe';\nimport {\n ConfigContextSelectorComponent,\n GlobalContextConfigComponent,\n GlobalContextWidgetWrapperComponent,\n GlobalContextInlineComponent\n} from '@c8y/ngx-components/global-context';\n\n@NgModule({\n imports: [\n AlarmsModule,\n CommonModule,\n CountdownIntervalModule,\n DocsModule,\n FormsModule,\n NgCommonModule,\n NgFormsModule,\n PopoverModule,\n ReactiveFormsModule,\n RouterModule,\n TooltipModule.forRoot(),\n AlarmListWidgetComponent,\n AlarmListWidgetConfigComponent,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe,\n GlobalContextConfigComponent,\n GlobalContextInlineComponent,\n ConfigContextSelectorComponent,\n GlobalContextWidgetWrapperComponent\n ]\n})\nexport class AlarmsWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AlarmWidgetService","i3","FormsModule","NgCommonModule","NgFormsModule"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-widgets-implementations-alarms.mjs","sources":["../../widgets/implementations/alarms/alarm-list-widget.model.ts","../../widgets/implementations/alarms/alarm-widget.service.ts","../../widgets/implementations/alarms/severity-icon.pipe.ts","../../widgets/implementations/alarms/sorting-description-popover-message.pipe.ts","../../widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.ts","../../widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.html","../../widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.ts","../../widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.html","../../widgets/implementations/alarms/alarms-widget.module.ts","../../widgets/implementations/alarms/c8y-ngx-components-widgets-implementations-alarms.ts"],"sourcesContent":["import type { AlarmStatusSettings, SeverityFilter } from '@c8y/client';\nimport { GlobalAutoRefreshWidgetConfig } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport type { GlobalContextState } from '@c8y/ngx-components/global-context';\n\nexport const ALARM_ORDER_VALUES = {\n BY_ACTIVE: 'BY_ACTIVE',\n BY_DATE_ASCENDING: 'BY_DATE_ASCENDING',\n BY_DATE_DESCENDING: 'BY_DATE_DESCENDING',\n BY_SEVERITY: 'BY_SEVERITY'\n} as const;\n\nexport const ALARM_ORDER_LABELS = {\n BY_ACTIVE: gettext('By active status') as 'By active status',\n BY_DATE_ASCENDING: gettext('By date (ascending)') as 'By date (ascending)',\n BY_DATE_DESCENDING: gettext('By date (descending)') as 'By date (descending)',\n BY_SEVERITY: gettext('By severity') as 'By severity'\n} as const;\n\nexport type AlarmOrderType = keyof typeof ALARM_ORDER_VALUES;\n\nexport type SelectedDevice = { id: string; name: string };\n\nexport const ASSET_ALARMS_WIDGET_ID = 'Asset Alarms';\n\nexport const RECENT_ALARMS_WIDGET_ID = 'Recent Alarms';\n\n// TODO: remove\nexport type AlarmListRefreshOption = 'none' | 'interval' | 'global-interval';\n\n// TODO: remove\nexport const GLOBAL_INTERVAL_OPTION: AlarmListRefreshOption = 'global-interval';\n\nexport type LegacyAlarmListConfig = {\n realtime: boolean;\n options: {\n severity: SeverityFilter;\n types: string[];\n orderMode: string;\n device: string;\n status: AlarmStatusSettings;\n };\n device?: {\n name: string;\n id: string;\n };\n};\n\nexport interface AlarmListWidgetConfig\n extends Partial<GlobalContextState>,\n GlobalAutoRefreshWidgetConfig {\n order: AlarmOrderType;\n showAlarmsForChildren?: boolean;\n device?: SelectedDevice | null;\n severities: SeverityFilter;\n status: AlarmStatusSettings;\n types?: string[];\n isRealtime?: boolean;\n realtime?: boolean;\n widgetId?: string;\n}\n","import { Injectable } from '@angular/core';\nimport {\n AlarmQueryFilter,\n AlarmStatusSettings,\n AlarmStatus,\n IAlarm,\n Severity,\n SeverityFilter,\n SEVERITY_LABELS\n} from '@c8y/client';\n\nimport { SeveritySettings, SeverityType } from '@c8y/client';\nimport { AlarmsViewService } from '@c8y/ngx-components/alarms';\nimport {\n ALARM_ORDER_VALUES,\n AlarmListWidgetConfig,\n AlarmOrderType,\n LegacyAlarmListConfig,\n RECENT_ALARMS_WIDGET_ID\n} from './alarm-list-widget.model';\n\nexport const DEFAULT_PAGE_SIZE = 20;\n\n@Injectable({ providedIn: 'root' })\nexport class AlarmWidgetService {\n constructor(private alarmsViewService: AlarmsViewService) {}\n\n /**\n * Checks if the provided data follows the LegacyAlarmConfig structure.\n *\n * This function determines if a given data object is an instance of LegacyAlarmConfig\n * by checking for the presence of the 'options' property.\n *\n * @param data - The data object to be checked.\n * @returns - Returns `true` if the data object is a LegacyAlarmConfig, otherwise `false`.\n */\n isOldAlarmConfigStructure(\n data: LegacyAlarmListConfig | AlarmListWidgetConfig\n ): data is LegacyAlarmListConfig {\n return data !== null && typeof data === 'object' && 'options' in data;\n }\n\n /**\n * Creates predefined widget configuration object.\n *\n * This method creates a new configuration object based on\n * a widgets ID (that determines if is a legacy Recent or Critical alarms widget).\n *\n * @param isIntervalRefresh - determines a type of a refresh.\n * @param widgetId - determines if a config should be done for Recent or Critical alarms widget.\n * @returns The new, predefined configuration object.\n */\n getPredefinedConfiguration(widgetId?: string, existingConfig?: any): AlarmListWidgetConfig {\n // Check if any time/refresh configuration exists (cast to any for legacy properties)\n const hasAnyTimeConfig =\n existingConfig?.dateTimeContext ||\n existingConfig?.dateFilter ||\n existingConfig?.date ||\n existingConfig?.dateFrom ||\n existingConfig?.dateTo ||\n existingConfig?.refreshOption ||\n existingConfig?.isAutoRefreshEnabled !== undefined ||\n existingConfig?.refreshInterval ||\n existingConfig?.aggregation !== undefined;\n\n const config: AlarmListWidgetConfig = {\n order: ALARM_ORDER_VALUES.BY_ACTIVE,\n severities:\n widgetId === RECENT_ALARMS_WIDGET_ID\n ? ({\n [Severity.CRITICAL]: true,\n [Severity.MAJOR]: true,\n [Severity.MINOR]: true,\n [Severity.WARNING]: true\n } as SeveritySettings)\n : ({\n [Severity.CRITICAL]: true,\n [Severity.MAJOR]: false,\n [Severity.MINOR]: false,\n [Severity.WARNING]: false\n } as SeveritySettings),\n status:\n widgetId === RECENT_ALARMS_WIDGET_ID\n ? ({\n [AlarmStatus.ACKNOWLEDGED]: true,\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.CLEARED]: true\n } as AlarmStatusSettings)\n : ({\n [AlarmStatus.ACKNOWLEDGED]: false,\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.CLEARED]: false\n } as AlarmStatusSettings),\n types: [''],\n widgetId: widgetId || ''\n };\n\n // Only add global context defaults if no time/refresh config exists at all\n if (!hasAnyTimeConfig) {\n config.isAutoRefreshEnabled = true;\n config.refreshInterval = this.alarmsViewService.DEFAULT_INTERVAL_VALUE;\n config.aggregation = null;\n config.refreshOption = 'live';\n config.dateTimeContext = {\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date().toISOString(),\n interval: 'custom'\n };\n }\n\n return config;\n }\n\n /**\n * Transforms a LegacyAlarmConfig object into an AlarmListWidgetConfig object.\n *\n * This function maps the properties from an old configuration structure (LegacyAlarmConfig)\n * to a new configuration structure (AlarmListWidgetConfig).\n *\n * @param oldConfig - The old configuration object to be transformed.\n * @returns - The new configuration object mapped from the old one.\n */\n mapToNewConfigStructure(oldConfig: LegacyAlarmListConfig): AlarmListWidgetConfig {\n const order: AlarmOrderType =\n oldConfig.options.orderMode === 'ACTIVE_FIRST'\n ? ALARM_ORDER_VALUES.BY_ACTIVE\n : ALARM_ORDER_VALUES.BY_SEVERITY;\n\n if (!this.isContainingAllSeverityTypes(oldConfig.options.severity)) {\n oldConfig.options.severity = this.addAllMissingSeverityTypes(oldConfig.options.severity);\n }\n\n return {\n order: order,\n isRealtime: oldConfig.realtime,\n device: oldConfig.device,\n showAlarmsForChildren: true,\n severities: oldConfig.options.severity,\n status: this.allValuesFalse(oldConfig.options.status)\n ? ({\n [AlarmStatus.ACKNOWLEDGED]: true,\n [AlarmStatus.ACTIVE]: true,\n [AlarmStatus.CLEARED]: true\n } as AlarmStatusSettings)\n : oldConfig.options.status,\n types: oldConfig.options.types?.length ? oldConfig.options.types : [''],\n isAutoRefreshEnabled: true,\n refreshInterval: this.alarmsViewService.DEFAULT_INTERVAL_VALUE\n };\n }\n\n /**\n * Checks if the provided severity object contains all the predefined severity types.\n *\n * @param severity - A record object where keys are severity type strings and values are boolean.\n * - This object is checked against the predefined severity types.\n * @returns `true` if all predefined severity types are present in the severity object; otherwise, `false`.\n */\n isContainingAllSeverityTypes(severity: SeverityFilter): boolean {\n return Object.keys(SEVERITY_LABELS).every(severityType => severityType in severity);\n }\n\n /**\n * Adds any missing severity types to the provided severity object with a default value of `false`.\n *\n * @param severity - A record object where keys are severity type strings and values are boolean.\n * - Missing severity types will be added to this object.\n * @returns The modified severity object, which includes all predefined severity types, adding any\n * that were missing with a value of `false`.\n */\n addAllMissingSeverityTypes(severity: SeverityFilter): SeverityFilter {\n Object.keys(SEVERITY_LABELS).forEach(severityType => {\n if (!(severityType in severity)) {\n severity[severityType] = false;\n }\n });\n return severity;\n }\n\n /**\n * Maps an AlarmListWidgetConfig object to an AlarmQueryFilter.\n *\n * This function converts the provided AlarmListWidgetConfig into a format suitable for querying alarms.\n *\n * @param config - The configuration object for the alarm list widget.\n * @param pageSize - Optional number specifying the size of the pages to be returned in the query.\n * @returns - The query filter object constructed from the provided configuration.\n */\n mapConfigToQueryFilter(config: AlarmListWidgetConfig, pageSize?: number): AlarmQueryFilter {\n const filter: AlarmQueryFilter = {\n pageSize: pageSize || DEFAULT_PAGE_SIZE,\n query: this.getOrderParameters(config.order),\n severity: this.extractFilterParams(config.severities || {}),\n status: this.extractFilterParams(config.status || {}),\n type: (config.types || []).join(','),\n withTotalPages: true\n };\n if (config.dateTimeContext) {\n const { dateFrom, dateTo } = config.dateTimeContext;\n filter.lastUpdatedFrom = typeof dateFrom === 'string' ? dateFrom : dateFrom.toISOString();\n filter.createdTo = typeof dateTo === 'string' ? dateTo : dateTo.toISOString();\n }\n if (config.device) {\n filter.source = config.device.id;\n filter.withSourceAssets = true;\n filter.withSourceDevices = true;\n filter.withSourceAssets = config.showAlarmsForChildren ?? true;\n filter.withSourceDevices = config.showAlarmsForChildren ?? true;\n }\n return filter;\n }\n\n /**\n * Extracts and concatenates filter parameters from a given object.\n *\n * This function takes an object containing filter settings (either SeverityFilter\n * or AlarmStatusSettings) and returns a string of all keys where the corresponding value is true.\n * If the object is empty or null, an empty string is returned.\n *\n * @param obj - The object containing filter settings.\n * @returns - A concatenated string of keys with true values, separated by commas.\n */\n extractFilterParams(obj: SeverityFilter | AlarmStatusSettings): string {\n if (!obj) {\n return '';\n }\n return Object.entries(obj)\n .filter(([, value]) => value)\n .map(([key]) => key)\n .join(',');\n }\n\n /**\n * Determines if an incoming real-time alarm has a different status than an existing alarm.\n *\n * This function checks if the provided incoming real-time alarm's status differs\n * from that of an existing alarm with the same ID in the given array of alarms.\n *\n * @param existingAlarms - The array of existing alarms.\n * @param incomingRealtimeAlarm - The incoming real-time alarm to check.\n * @returns - True if the existing alarm's status has changed, otherwise false.\n */\n hasExistingAlarmChangedStatus(existingAlarms: IAlarm[], incomingRealtimeAlarm: IAlarm): boolean {\n const existingAlarm = existingAlarms.find(alarm => alarm.id === incomingRealtimeAlarm.id);\n return !!existingAlarm && existingAlarm.status !== incomingRealtimeAlarm.status;\n }\n\n /**\n * Filters alarms based on their status, severity, and type.\n *\n * This method determines if a given alarm, identified either by a numeric ID or an `IAlarm` object,\n * matches specific criteria defined in `alarms` and optionally `config`.\n *\n * @param alarm - The alarm to check, represented either by a numeric ID or an `IAlarm` object.\n * @param alarms - An array of `IAlarm` objects against which the given alarm is evaluated.\n * @param config - Optional. Configuration for the alarm list widget, used to define additional\n * filtering criteria.\n *\n * @returns `true` if the alarm matches the specified criteria; otherwise, `false`.\n * If `alarm` is a number, it always returns `false`.\n * If `config` is not provided, it uses a legacy filter for critical alarms.\n *\n * @remarks\n * - When `alarm` is a numeric ID, the function returns `false` as it cannot match against type and severity.\n * - If `config` is not provided, the function assumes a legacy scenario for filtering all critical alarms.\n */\n filterAlarmsByStatusSeverityAndType(\n alarm: number | IAlarm,\n alarms: IAlarm[],\n config?: AlarmListWidgetConfig\n ): boolean {\n if (typeof alarm === 'number') {\n return false;\n }\n\n return this.isAlarmMatchedByConfig(alarm, alarms, config);\n }\n\n /**\n * Determines if all values in the given object are false.\n *\n * This function checks every value in the provided object to see if they are all false.\n *\n * @param obj - An object with boolean values.\n * @returns - Returns `true` if all values in the object are false, otherwise `false`.\n */\n allValuesFalse(obj: { [key: string]: boolean }): boolean {\n return Object.values(obj).every(value => !value);\n }\n\n /**\n * Constructs a string of order parameters for a query based on the specified alarm order.\n *\n * This function takes an alarm order and maps it to a corresponding set of order parameters.\n * It supports different ordering types, such as BY_ACTIVE, BY_SEVERITY, and BY_DATE_ASCENDING.\n * The order parameters are used to construct a query string that determines the order\n * in which alarms are retrieved or displayed.\n *\n * @param order - The specified order for sorting alarms (e.g., BY_ACTIVE).\n * @returns - A string of order parameters to be used in a query, or an empty string if the order type is unrecognized.\n */\n getOrderParameters(order: AlarmOrderType): string {\n let orderParams: string[];\n\n switch (order) {\n case ALARM_ORDER_VALUES.BY_ACTIVE:\n orderParams = ['status asc', 'severity asc', 'time.date desc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n case ALARM_ORDER_VALUES.BY_SEVERITY:\n orderParams = ['severity asc', 'time.date desc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n case ALARM_ORDER_VALUES.BY_DATE_ASCENDING:\n orderParams = ['time.date asc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n default:\n orderParams = ['time.date desc', 'text asc'];\n return this.buildOrderParameters(orderParams);\n }\n }\n\n /**\n * Determines if an alarm is matched by the specified widget configuration.\n *\n * This function evaluates whether a given alarm should be included based on the severity,\n * status, and type filters defined in the AlarmListWidgetConfig. It checks if the alarm's\n * severity and status match the configuration settings and if the alarm's type is included\n * in the configuration's types (if specified).\n *\n * @ignore\n * @param alarm - The alarm to evaluate.\n * @param alarms - An array of existing alarms, used for status matching.\n * @param config - The configuration settings to match against.\n * @returns - Returns `true` if the alarm matches the configuration criteria; otherwise, `false`.\n */\n isAlarmMatchedByConfig(alarm: IAlarm, alarms: IAlarm[], config: AlarmListWidgetConfig): boolean {\n const isSeverityMatched = this.isSeverityMatching(alarm.severity, config);\n const isStatusMatched = this.isStatusMatching(alarm, alarms, config);\n const isTypeMatched = this.isTypesMatching(config, alarm);\n\n return isSeverityMatched && isStatusMatched && isTypeMatched;\n }\n /**\n * Checks if the severity of an alarm matches the configuration setting.\n *\n * This function determines whether the severity of an alarm is included in the\n * severity settings defined in the AlarmListWidgetConfig.\n *\n * @ignore\n * @param severity - The severity of the alarm to check.\n * @param config - The configuration with severity settings.\n * @returns - Returns `true` if the alarm's severity matches the configuration; otherwise, `false`.\n */\n isSeverityMatching(severity: SeverityType, config: AlarmListWidgetConfig): boolean {\n return !!config.severities[severity];\n }\n\n /**\n * Evaluates if the status of an alarm matches the configuration setting or has changed.\n *\n * This function checks if the status of an alarm is included in the status settings defined in\n * the AlarmListWidgetConfig, or if the alarm's status has changed based on the existing alarms.\n *\n * @ignore\n * @param alarm - The alarm whose status is to be evaluated.\n * @param alarms - An array of existing alarms to compare against for status changes.\n * @param config - The configuration with status settings.\n * @returns - Returns `true` if the alarm's status matches or has changed as per the configuration; otherwise, `false`.\n */\n isStatusMatching(alarm: IAlarm, alarms: IAlarm[], config: AlarmListWidgetConfig): boolean {\n return !!config.status[alarm.status] || this.hasExistingAlarmChangedStatus(alarms, alarm);\n }\n\n /**\n * Checks if the configuration's types array contains only empty string or includes a specific alarm type.\n *\n * @param config - The configuration object with a `types` property.\n * @param alarm - The alarm object with a `type` property to check against the config's types.\n * @returns `true` if the config's types array contains only empty string or includes the alarm's type, otherwise `false`.\n */\n isTypesMatching(config: AlarmListWidgetConfig, alarm: IAlarm): boolean {\n return Array.isArray(config.types) && config.types.length === 1 && config.types[0] === ''\n ? true\n : (config.types?.includes(alarm.type) ?? false);\n }\n\n /**\n * Constructs a query string from an array of order parameters.\n *\n * This function takes an array of ordering parameters and constructs a query string\n * for use in alarm ordering queries. The parameters are concatenated into a single string,\n * prefixed with '$orderby='.\n *\n * @ignore\n * @private\n * @param orderParams - The order parameters to be included in the query.\n * @returns - A query string representing the order parameters.\n */\n private buildOrderParameters(orderParams: string[]): string {\n return `$orderby=${orderParams.join(',')}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Severity } from '@c8y/client';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\n\ninterface SeverityIcon {\n c8yIcon?: string;\n iconClass: string;\n severityClass?: string;\n}\n\n@Pipe({ name: 'severityIcon' })\nexport class SeverityIconPipe implements PipeTransform {\n transform(severity: string): SeverityIcon {\n let severityClassName = '';\n let iconClassName: SupportedIconsSuggestions = '';\n\n switch (severity) {\n case Severity.CRITICAL:\n severityClassName = 'critical';\n iconClassName = 'exclamation-circle';\n break;\n case Severity.MAJOR:\n severityClassName = 'major';\n iconClassName = 'warning';\n break;\n case Severity.MINOR:\n severityClassName = 'minor';\n iconClassName = 'high-priority';\n break;\n case Severity.WARNING:\n severityClassName = 'warning';\n iconClassName = 'circle';\n break;\n default:\n return { iconClass: '', severityClass: '' };\n }\n\n return {\n iconClass: `status icon-lg stroked-icon dlt-c8y-icon-${iconClassName} ${severityClassName}`,\n c8yIcon: severityClassName\n };\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ALARM_ORDER_VALUES, AlarmOrderType } from './alarm-list-widget.model';\n\n@Pipe({ name: 'sortingDescriptionPopoverMessage' })\nexport class SortingDescriptionPopoverMessagePipe implements PipeTransform {\n transform(order: AlarmOrderType): string {\n switch (order) {\n case ALARM_ORDER_VALUES.BY_ACTIVE:\n return gettext('Order alarms by active status, severity, and time.');\n case ALARM_ORDER_VALUES.BY_DATE_ASCENDING:\n return gettext('Order alarms by time, starting with the oldest ones.');\n case ALARM_ORDER_VALUES.BY_DATE_DESCENDING:\n return gettext('Order alarms by time, starting with the latest ones.');\n case ALARM_ORDER_VALUES.BY_SEVERITY:\n return gettext('Order alarms by severity and time.');\n default:\n return '';\n }\n }\n}\n","import { AsyncPipe, NgClass } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport {\n ControlContainer,\n FormArray,\n FormBuilder,\n FormControl,\n FormGroup,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidatorFn\n} from '@angular/forms';\nimport {\n ALARM_STATUS_LABELS,\n AlarmService,\n AlarmStatus,\n IAlarm,\n IResultList,\n SEVERITY_LABELS\n} from '@c8y/client';\nimport {\n AlertService,\n C8yTranslatePipe,\n OnBeforeSave,\n FormGroupComponent,\n IconDirective,\n MessageDirective,\n MessagesComponent,\n RequiredInputPlaceholderDirective\n} from '@c8y/ngx-components';\nimport {\n ALARM_STATUS_ICON,\n AlarmsDateFilterComponent,\n AlarmsListComponent,\n AlarmsViewService,\n DEFAULT_SEVERITY_VALUES,\n DEFAULT_STATUS_VALUES\n} from '@c8y/ngx-components/alarms';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n LocalControlsComponent,\n PRESET_NAME,\n PresetName\n} from '@c8y/ngx-components/global-context';\nimport { merge } from 'lodash-es';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { BehaviorSubject, EMPTY, from, Observable, Subject } from 'rxjs';\nimport { filter, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport {\n ALARM_ORDER_LABELS,\n ALARM_ORDER_VALUES,\n AlarmListWidgetConfig,\n AlarmOrderType\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService, DEFAULT_PAGE_SIZE } from '../alarm-widget.service';\nimport { SeverityIconPipe } from '../severity-icon.pipe';\nimport { SortingDescriptionPopoverMessagePipe } from '../sorting-description-popover-message.pipe';\n\n@Component({\n selector: 'c8y-alarm-list-widget-config',\n templateUrl: './alarm-list-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n PopoverDirective,\n FormGroupComponent,\n AlarmsDateFilterComponent,\n RequiredInputPlaceholderDirective,\n NgClass,\n IconDirective,\n MessagesComponent,\n MessageDirective,\n AlarmsListComponent,\n C8yTranslatePipe,\n AsyncPipe,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe,\n LocalControlsComponent\n ]\n})\nexport class AlarmListWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n @Input() config: AlarmListWidgetConfig;\n\n readonly REFRESH_INTERVAL_IN_MILLISECONDS = this.alarmsViewService.DEFAULT_INTERVAL_VALUES;\n readonly SEVERITY_LABELS = SEVERITY_LABELS;\n readonly STATUS_LABELS = ALARM_STATUS_LABELS;\n\n readonly ACKNOWLEDGE_STATUS_VALUE = AlarmStatus.ACKNOWLEDGED;\n readonly CLEARED_STATUS_VALUE = AlarmStatus.CLEARED;\n\n readonly BELL_SLASH_ICON = ALARM_STATUS_ICON.BELL_SLASH;\n readonly BELL_ICON = ALARM_STATUS_ICON.BELL;\n readonly C8Y_ALERT_IDLE_ICON = ALARM_STATUS_ICON.ALERT_IDLE;\n\n readonly ALARM_ORDER_LABELS = ALARM_ORDER_LABELS;\n\n alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n formGroup: ReturnType<AlarmListWidgetConfigComponent['createForm']>;\n\n isLoading: boolean;\n orderList = Object.values(ALARM_ORDER_VALUES);\n severityList = Object.keys(SEVERITY_LABELS);\n /**\n * Order does matter.\n */\n statusList = [AlarmStatus.ACTIVE, AlarmStatus.ACKNOWLEDGED, AlarmStatus.CLEARED];\n\n @ViewChild('alarmListPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private destroy$ = new Subject<void>();\n\n config$ = this.widgetConfigService.currentConfig$.pipe(\n filter(config => !!config),\n filter(c => c.dateTimeContext),\n tap(config => {\n if (!this.formGroup) {\n this.initializeForm();\n } else {\n this.formGroup.patchValue(config, { emitEvent: false });\n }\n }),\n takeUntil(this.destroy$),\n shareReplay(1)\n );\n\n controls: PresetName = PRESET_NAME.ALARM_LIST;\n constructor(\n private alarmListWidgetService: AlarmWidgetService,\n private alarmService: AlarmService,\n private alarmsViewService: AlarmsViewService,\n private alertService: AlertService,\n private form: NgForm,\n private formBuilder: FormBuilder,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n ngOnInit(): void {\n this.config$\n .pipe(\n takeUntil(this.destroy$),\n filter(config => {\n const displayMode = config?.displayMode ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n if (displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n return !!config?.isGlobalContextReady;\n }\n return true;\n }),\n switchMap(config => {\n if (\n (config?.severities && this.alarmListWidgetService.allValuesFalse(config.severities)) ||\n (config?.status && this.alarmListWidgetService.allValuesFalse(config.status))\n ) {\n this.alarms$.next({ data: [], res: null });\n return EMPTY;\n }\n const isWidgetWithExistingConfig = config.order && config.severities && config.status;\n const filterConfig = isWidgetWithExistingConfig\n ? config\n : { ...this.formGroup.value, ...config };\n return from(this.getAlarms(filterConfig as AlarmListWidgetConfig));\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: AlarmListWidgetConfig): boolean | Promise<boolean> | Observable<boolean> {\n const { types } = this.formGroup.value;\n if (types.length > 1) {\n const stringTypes = types as string[];\n\n if (this.isContainingOnlyEmptyTypes(stringTypes)) {\n this.formGroup.value.types = [''];\n } else {\n this.formGroup.value.types = this.filterEmptyTypes(stringTypes);\n }\n }\n\n /**\n * Applies only to converted legacy Alarm list widget\n */\n if (config['options']) {\n delete config['options'];\n }\n\n Object.assign(config, this.formGroup.value);\n\n return true;\n }\n\n removeType(index: number): void {\n if (this.types.controls.length === 1) {\n this.formGroup.get('types').reset();\n } else {\n this.types.removeAt(index);\n }\n }\n\n addType(): void {\n this.types.push(this.formBuilder.control(''));\n }\n\n get types(): FormArray {\n return this.formGroup.get('types') as FormArray;\n }\n\n private filterEmptyTypes(types: (string | null)[]): string[] {\n return types.filter((element: string | null) => element !== '' && element !== null);\n }\n\n private isContainingOnlyEmptyTypes(types: (string | null)[]): boolean {\n return types.every((element: string | null) => element === '' || element === null);\n }\n\n private async getAlarms(config: AlarmListWidgetConfig): Promise<void> {\n try {\n this.isLoading = true;\n const result: IResultList<IAlarm> = await this.alarmService.list(\n this.alarmListWidgetService.mapConfigToQueryFilter(config, DEFAULT_PAGE_SIZE)\n );\n\n this.alarms$.next(result);\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading = false;\n }\n }\n\n private initializeForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config, { emitEvent: false });\n this.initializeTypes(this.config.types);\n\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {\n this.config = merge(this.config, value);\n this.getAlarms(this.config);\n });\n }\n\n private createForm() {\n return this.formBuilder.group({\n status: this.formBuilder.group(DEFAULT_STATUS_VALUES, {\n validators: this.minSelectedCheckboxes(1)\n }),\n showAlarmsForChildren: true,\n types: this.formBuilder.array([]),\n severities: this.formBuilder.group(DEFAULT_SEVERITY_VALUES, {\n validators: this.minSelectedCheckboxes(1)\n }),\n order: ALARM_ORDER_VALUES.BY_ACTIVE as AlarmOrderType,\n device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined)\n });\n }\n\n private minSelectedCheckboxes(min = 1): ValidatorFn {\n const validator: ValidatorFn = (formGroup: FormGroup) => {\n const totalSelected = Object.values(formGroup.controls).reduce(\n (prev, next) => (next.value ? prev + next.value : prev),\n 0\n );\n\n return totalSelected >= min ? null : { required: true };\n };\n\n return validator;\n }\n\n private initializeTypes(types: string[]): void {\n const typesControl = this.formGroup.get('types') as FormArray;\n if (types) {\n types.forEach(type => {\n typesControl.push(this.formBuilder.control(type));\n });\n } else {\n typesControl.push(this.formBuilder.control(''));\n }\n }\n}\n","<div\n class=\"p-l-24 p-r-24\"\n [style.pointer-events]=\"'auto'\"\n [style.opacity]=\"1\"\n></div>\n\n@if (formGroup) {\n <form\n class=\"row d-flex flex-wrap\"\n [formGroup]=\"formGroup\"\n >\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Order`of items on a list, noun`' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n @for (order of orderList; track order; let i = $index) {\n <div\n class=\"d-flex p-b-8 p-t-4 a-i-center\"\n data-cy=\"c8y-alarm-list-widget-config--order-elements\"\n >\n <label\n class=\"c8y-radio gap-4\"\n title=\"{{ ALARM_ORDER_LABELS[order] | translate }}\"\n >\n <input\n type=\"radio\"\n [value]=\"order\"\n formControlName=\"order\"\n />\n <span class=\"a-s-center\"></span>\n <span class=\"text-truncate\">{{ ALARM_ORDER_LABELS[order] | translate }}</span>\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"order | sortingDescriptionPopoverMessage | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"severities\"\n >\n <legend>{{ 'Severities' | translate }}</legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.severities.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.severities.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--severities-elements\"\n >\n @for (severityOption of severityList; track severityOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"SEVERITY_LABELS[severityOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"severityOption\"\n [name]=\"severityOption\"\n />\n <span class=\"a-s-center\"></span>\n @let severityIcon = severityOption | severityIcon;\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.iconClass }}\"\n [c8yIcon]=\"severityIcon.c8yIcon\"\n ></i>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.severities.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n @if (showDateFilter) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date filter' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <c8y-alarms-date-filter\n [updateQueryParams]=\"false\"\n [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n formControlName=\"dateFilter\"\n (dateFilterChange)=\"onDateFilterChange($event)\"\n ></c8y-alarms-date-filter>\n </c8y-form-group>\n </fieldset>\n }\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"status\"\n >\n <legend data-cy=\"c8y-alarm-list-widget-config-status-label\">\n {{ 'Status' | translate }}\n </legend>\n <c8y-form-group\n [hasError]=\"formGroup.controls.status.hasError('required')\"\n [ngClass]=\"{\n 'm-b-8': !formGroup.controls.status.hasError('required')\n }\"\n data-cy=\"c8y-alarm-list-widget-config--status-elements\"\n >\n @for (statusOption of statusList; track statusOption) {\n <label\n class=\"c8y-checkbox m-t-0 gap-4\"\n [title]=\"STATUS_LABELS[statusOption] | translate\"\n >\n <input\n type=\"checkbox\"\n [formControlName]=\"statusOption\"\n [name]=\"statusOption\"\n />\n <span class=\"a-s-center\"></span>\n <i\n class=\"a-s-center m-l-4 m-r-4 text-gray-dark c8y-icon icon-20\"\n [c8yIcon]=\"\n statusOption === CLEARED_STATUS_VALUE\n ? C8Y_ALERT_IDLE_ICON\n : statusOption === ACKNOWLEDGE_STATUS_VALUE\n ? BELL_SLASH_ICON\n : BELL_ICON\n \"\n ></i>\n <span>{{ STATUS_LABELS[statusOption] | translate }}</span>\n </label>\n }\n <c8y-messages>\n @if (formGroup.controls.status.hasError('required')) {\n <c8y-message>\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-section\"\n >\n <legend>{{ 'Child devices' | translate }}</legend>\n <c8y-form-group class=\"m-b-8\">\n <label\n class=\"c8y-switch\"\n [title]=\"'Show alarms from child devices' | translate\"\n data-cy=\"c8y-alarm-list-widget-config--child-devices-label\"\n >\n <input\n type=\"checkbox\"\n formControlName=\"showAlarmsForChildren\"\n data-cy=\"c8y-alarm-list-widget-config--showAlarmsForChildren-checkbox\"\n />\n <span></span>\n <span>{{ 'Show alarms' | translate }}</span>\n <span class=\"sr-only\">{{ 'Show alarms' | translate }}</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </div>\n\n <div class=\"col-xs-12\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Types' | translate }}</legend>\n <c8y-form-group\n class=\"m-b-8\"\n formArrayName=\"types\"\n >\n @for (type of types.controls; track type; let i = $index) {\n <div\n class=\"input-group m-b-4\"\n data-cy=\"c8y-alarm-list-widget-config--types-elements\"\n >\n <input\n class=\"form-control\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Alarm' }\"\n [formControlName]=\"i\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--danger m-l-auto\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeType(i)\"\n data-cy=\"c8y-alarm-list-widget-config--types-remove-type\"\n [disabled]=\"types.controls?.length === 1 && !type.value\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n @if (i === types.controls.length - 1) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot btn-dot--primary m-l-auto\"\n [title]=\"'Add alarm type' | translate\"\n type=\"button\"\n (click)=\"addType()\"\n data-cy=\"c8y-alarm-list-widget-config--types-add-type\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n </button>\n </div>\n }\n </div>\n }\n </c8y-form-group>\n </fieldset>\n </div>\n </form>\n}\n\n<ng-template #alarmListPreview>\n @if ((config$ | async)?.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"(config$ | async)?.displayMode\"\n [config]=\"config$ | async\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n <c8y-alarms-list\n [alarms]=\"alarms$ | async\"\n [isInPreviewMode]=\"true\"\n [isInitialLoading]=\"isLoading\"\n [navigationOptions]=\"{\n allowNavigationToAlarmsView: false,\n alwaysNavigateToAllAlarms: false,\n includeClearedQueryParams: false,\n queryParamsHandling: 'merge'\n }\"\n data-cy=\"c8y-alarm-list-widget-config--preview-alarm-list\"\n ></c8y-alarms-list>\n</ng-template>\n\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, inject, signal } from '@angular/core';\nimport { AlarmService, IAlarm, IResultList } from '@c8y/client';\nimport {\n AlarmRealtimeService,\n AlarmWithChildrenRealtimeService,\n AlertService,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator\n} from '@c8y/ngx-components';\nimport { AlarmsListComponent } from '@c8y/ngx-components/alarms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n LocalControlsComponent,\n GlobalContextState,\n GlobalContextConnectorComponent,\n REFRESH_OPTION,\n WidgetConfigMigrationService,\n PresetName,\n DisplayMode,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n CONTEXT_FEATURE,\n PRESET_NAME\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { isEmpty, isMatch, merge } from 'lodash-es';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport {\n AlarmListWidgetConfig,\n ASSET_ALARMS_WIDGET_ID,\n RECENT_ALARMS_WIDGET_ID\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService } from '../alarm-widget.service';\n\n@Component({\n selector: 'c8y-alarm-list-widget',\n templateUrl: './alarm-list-widget.component.html',\n providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService],\n imports: [AlarmsListComponent, AsyncPipe, LocalControlsComponent, GlobalContextConnectorComponent]\n})\nexport class AlarmListWidgetComponent implements OnInit, OnDestroy, DynamicComponent {\n private alarmWidgetService = inject(AlarmWidgetService);\n private alarmService = inject(AlarmService);\n private dashboardChild = inject(DashboardChildComponent);\n private alertService = inject(AlertService);\n private widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n\n @Input() config: AlarmListWidgetConfig;\n displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n contextConfig = signal<GlobalContextState>({});\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(true);\n alerts: DynamicComponentAlertAggregator;\n widgetControls = signal<PresetName>(PRESET_NAME.ALARM_LIST);\n\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n readonly CONTEXT_FEATURE = CONTEXT_FEATURE;\n readonly REFRESH_OPTION = REFRESH_OPTION;\n readonly PRESET_NAME = PRESET_NAME;\n\n private TIMEOUT_ERROR_TEXT = gettext(\n 'The request is taking longer than usual. We apologize for the inconvenience.'\n );\n private SERVER_ERROR_TEXT = gettext('Server error occurred.');\n private unsubscribe$ = new Subject<void>();\n hasPermissions = true;\n\n async ngOnInit(): Promise<void> {\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n const alarmsWidgetId =\n this.dashboardChild['data']?.componentId ?? this.dashboardChild['data']?.name;\n\n // Check for legacy angularJS widget without proper configuration\n const isLegacyWidgetWithoutConfiguration =\n (this.config?.widgetId ?? alarmsWidgetId) === defaultWidgetIds.ALL_CRITICAL_ALARMS ||\n (this.config?.widgetId ?? alarmsWidgetId) === defaultWidgetIds.RECENT_ALARMS ||\n isEmpty(this.config) ||\n (isMatch(this.config, { displaySettings: { globalAutoRefreshContext: true } }) &&\n !this.config['options']?.device &&\n !this.config.types &&\n !this.config.status &&\n !this.config.severities);\n\n if (isLegacyWidgetWithoutConfiguration) {\n let updatedId = alarmsWidgetId;\n const assetAlarms =\n this.dashboardChild['data']?.title === 'Active, critical alarms' && 'Asset alarms';\n const recentAlarms =\n this.dashboardChild['data']?.title === 'Recent alarms' && 'Recent alarms';\n\n if (assetAlarms) {\n updatedId = ASSET_ALARMS_WIDGET_ID;\n }\n if (recentAlarms) {\n updatedId = RECENT_ALARMS_WIDGET_ID;\n }\n\n this.setLegacyRecentOrCriticalAlarmWidgetConfig(updatedId);\n this.config.widgetId = updatedId;\n } else if (this.alarmWidgetService.isOldAlarmConfigStructure(this.config)) {\n const mappedConfig = this.alarmWidgetService.mapToNewConfigStructure(this.config);\n Object.assign(this.config, mappedConfig);\n }\n\n if (\n this.config?.widgetId === RECENT_ALARMS_WIDGET_ID ||\n this.config?.widgetId === ASSET_ALARMS_WIDGET_ID\n ) {\n this.widgetControls.set(PRESET_NAME.ALARM_LIST_LEGACY);\n }\n\n const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(this.config);\n this.config = merge(this.config, migratedConfig);\n\n const resolvedWidgetId = this.config?.widgetId ?? alarmsWidgetId ?? defaultWidgetIds.ALARM_LIST;\n this.config.widgetId = resolvedWidgetId;\n\n const displayMode = this.config.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n this.displayMode.set(displayMode as DisplayMode);\n\n const initialContextConfig = {\n dateTimeContext: this.config.dateTimeContext,\n aggregation: this.config.aggregation,\n isAutoRefreshEnabled: this.config.isAutoRefreshEnabled,\n refreshInterval: this.config.refreshInterval,\n refreshOption: this.config.refreshOption\n };\n this.contextConfig.set(initialContextConfig);\n\n // In dashboard mode, wait for GlobalContextConnector to emit the first state\n // In config modes, fetch immediately with widget config\n if (displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n await this.fetchAlarms();\n }\n }\n\n ngOnDestroy(): void {\n if (this.config?.isRealtime) {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n const { diff, context } = event;\n if (\n diff.isAutoRefreshEnabled === false &&\n Object.keys(diff).length === 1 &&\n context.refreshOption === REFRESH_OPTION.LIVE\n ) {\n return;\n }\n\n this.contextConfig.set(event.context);\n void this.fetchAlarms();\n }\n\n getDashboardChild(): DashboardChildComponent {\n return this.dashboardChild;\n }\n\n onRefresh(): void {\n void this.fetchAlarms();\n }\n\n onScrollingStateChange(isScrolling: boolean): void {\n const current = this.contextConfig();\n\n if (current.refreshOption === REFRESH_OPTION.HISTORY) {\n return;\n }\n this.contextConfig.set({ ...current, isAutoRefreshEnabled: !isScrolling });\n this.isLinkedToGlobal.set(!isScrolling);\n }\n\n private async fetchAlarms(): Promise<void> {\n const alarms = await this.getAlarms();\n this.alarms$.next(alarms);\n }\n\n private async getAlarms(): Promise<IResultList<IAlarm>> {\n try {\n this.isLoading$.next(true);\n const effectiveConfig = {\n ...this.config,\n ...this.contextConfig()\n };\n return await this.alarmService.list(\n this.alarmWidgetService.mapConfigToQueryFilter(effectiveConfig)\n );\n } catch (error) {\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text:\n error?.name === 'TimeoutError'\n ? this.TIMEOUT_ERROR_TEXT\n : (error?.message ?? this.SERVER_ERROR_TEXT)\n })\n );\n if (error?.res?.status === 403) {\n this.hasPermissions = false;\n return;\n }\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private setLegacyRecentOrCriticalAlarmWidgetConfig(widgetId: string): void {\n if (widgetId === RECENT_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n RECENT_ALARMS_WIDGET_ID,\n this.config\n );\n Object.assign(this.config, predefinedConfig);\n return;\n }\n\n if (widgetId === ASSET_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n ASSET_ALARMS_WIDGET_ID,\n this.config\n );\n Object.assign(this.config, predefinedConfig);\n }\n }\n}\n","@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading$ | async\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n<c8y-alarms-list\n #list\n [alarms]=\"alarms$ | async\"\n [navigationOptions]=\"{\n alwaysNavigateToAllAlarms: !config.device,\n allowNavigationToAlarmsView: true,\n includeClearedQueryParams: true,\n queryParamsHandling: ''\n }\"\n [isInitialLoading]=\"isLoading$ | async\"\n [hasPermissions]=\"hasPermissions\"\n (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n></c8y-alarms-list>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule as NgFormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport {\n CommonModule,\n CountdownIntervalModule,\n DocsModule,\n FormsModule\n} from '@c8y/ngx-components';\nimport { AlarmsModule } from '@c8y/ngx-components/alarms';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AlarmListWidgetConfigComponent } from './alarm-list-widget-config/alarm-list-widget-config.component';\nimport { AlarmListWidgetComponent } from './alarm-list-widget-view/alarm-list-widget.component';\nimport { SortingDescriptionPopoverMessagePipe } from './sorting-description-popover-message.pipe';\nimport { SeverityIconPipe } from './severity-icon.pipe';\nimport {\n ConfigContextSelectorComponent,\n GlobalContextConfigComponent,\n GlobalContextWidgetWrapperComponent,\n GlobalContextInlineComponent\n} from '@c8y/ngx-components/global-context';\n\n@NgModule({\n imports: [\n AlarmsModule,\n CommonModule,\n CountdownIntervalModule,\n DocsModule,\n FormsModule,\n NgCommonModule,\n NgFormsModule,\n PopoverModule,\n ReactiveFormsModule,\n RouterModule,\n TooltipModule.forRoot(),\n AlarmListWidgetComponent,\n AlarmListWidgetConfigComponent,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe,\n GlobalContextConfigComponent,\n GlobalContextInlineComponent,\n ConfigContextSelectorComponent,\n GlobalContextWidgetWrapperComponent\n ]\n})\nexport class AlarmsWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AlarmWidgetService","i3","FormsModule","NgCommonModule","NgFormsModule"],"mappings":"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"}