@c8y/ngx-components 1022.28.2 → 1022.33.0
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.
- package/asset-properties/asset-properties.model.d.ts +12 -3
- package/asset-properties/asset-properties.model.d.ts.map +1 -1
- package/asset-properties/asset-properties.service.d.ts +20 -2
- package/asset-properties/asset-properties.service.d.ts.map +1 -1
- package/asset-properties/asset-property-list/asset-property-icon-tooltip.pipe.d.ts +14 -0
- package/asset-properties/asset-property-list/asset-property-icon-tooltip.pipe.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts.map +1 -1
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts +28 -18
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts.map +1 -1
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts +2 -2
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts.map +1 -1
- package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts +97 -0
- package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts.map +1 -0
- package/asset-properties/custom-properties-drawer.service.d.ts +12 -0
- package/asset-properties/custom-properties-drawer.service.d.ts.map +1 -0
- package/asset-properties/index.d.ts +1 -0
- package/asset-properties/index.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.service.d.ts +2 -2
- package/context-dashboard/widget-config-hook/widget-config-hook.model.d.ts +2 -1
- package/context-dashboard/widget-config-hook/widget-config-hook.model.d.ts.map +1 -1
- package/context-dashboard/widget-config.component.d.ts +3 -1
- package/context-dashboard/widget-config.component.d.ts.map +1 -1
- package/context-dashboard/widget-config.service.d.ts +14 -8
- package/context-dashboard/widget-config.service.d.ts.map +1 -1
- package/core/dynamic-component/dynamic-component.model.d.ts +26 -0
- package/core/dynamic-component/dynamic-component.model.d.ts.map +1 -1
- package/core/i18n/pattern-messages.data.d.ts +7 -0
- package/core/i18n/pattern-messages.data.d.ts.map +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.d.ts.map +1 -1
- package/core/query-param-handler/query-param-handler.service.d.ts +1 -1
- package/core/query-param-handler/query-param-handler.service.d.ts.map +1 -1
- package/core/query-param-handler/query-param-modal-handler.service.d.ts +16 -5
- package/core/query-param-handler/query-param-modal-handler.service.d.ts.map +1 -1
- package/core/resizable-grid/index.d.ts +2 -0
- package/core/resizable-grid/index.d.ts.map +1 -0
- package/core/resizable-grid/resizable-grid.component.d.ts +114 -0
- package/core/resizable-grid/resizable-grid.component.d.ts.map +1 -0
- package/dashboard-manager/devicemanagement/c8y-ngx-components-dashboard-manager-devicemanagement.d.ts.map +1 -0
- package/dashboard-manager/devicemanagement/index.d.ts +2 -0
- package/dashboard-manager/devicemanagement/index.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-advanced-software-management.mjs +7 -7
- package/fesm2022/c8y-ngx-components-advanced-software-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +34 -34
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +4 -4
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +73 -73
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-api.mjs +7 -7
- package/fesm2022/c8y-ngx-components-api.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-app-logs.mjs +10 -10
- package/fesm2022/c8y-ngx-components-app-logs.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +427 -66
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-WUN1r4fC.mjs → c8y-ngx-components-asset-property-grid.component-CRnyUbyz.mjs} +13 -13
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-WUN1r4fC.mjs.map → c8y-ngx-components-asset-property-grid.component-CRnyUbyz.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +32 -32
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +114 -114
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs +7 -7
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +13 -13
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-base-branding.mjs +4 -4
- package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor-lazy.mjs +3 -3
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +15 -15
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +6 -6
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +33 -33
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared.mjs +10 -10
- package/fesm2022/c8y-ngx-components-branding-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-child-devices.mjs +13 -13
- package/fesm2022/c8y-ngx-components-child-devices.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +40 -40
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-connectivity.mjs +53 -53
- package/fesm2022/c8y-ngx-components-connectivity.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +11 -11
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C-JLbcn5.mjs → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-BWyhab0H.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C-JLbcn5.mjs.map → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-BWyhab0H.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RXvOcs04.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs} +10 -10
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RXvOcs04.mjs.map → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-DmPIJGXO.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-DmPIJGXO.mjs.map → c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +133 -116
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DtLAOoFx.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CwfVxTSx.mjs} +16 -16
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DtLAOoFx.mjs.map → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CwfVxTSx.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +12 -12
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs +19 -0
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +22 -22
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-broker.mjs +7 -7
- package/fesm2022/c8y-ngx-components-data-broker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs +3 -3
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs +3 -3
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +24 -24
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +7 -7
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-services.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs +4 -4
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +40 -40
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +41 -40
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs +16 -16
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +43 -43
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs +22 -22
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs +12 -12
- package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +34 -34
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs +3 -3
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocols.mjs +16 -16
- package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +13 -13
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-shell.mjs +31 -31
- package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs +13 -13
- package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +27 -27
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +43 -43
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +10 -10
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +46 -46
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +82 -82
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-editor.mjs +6 -6
- package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +3 -3
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events.mjs +3 -3
- package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-exports-list.mjs +6 -6
- package/fesm2022/c8y-ngx-components-exports-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-file-preview.mjs +7 -7
- package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs +19 -19
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-arrows.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-city.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-dateAndTime.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-devicesAndSensors.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-ecommerce.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-editing.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-filesAndFolders.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-finance.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-hands.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-messaging.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-multimedia.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-network.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-office.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-people.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs +1 -0
- package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-programming.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-security.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-transport.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-userInterface.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-weather.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-model.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +19 -19
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +3 -3
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-location.mjs +28 -28
- package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +19 -19
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +55 -55
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +19 -19
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +12 -12
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +12 -12
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-product-experience.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-shared.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs +7 -7
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs +10 -10
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +38 -38
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +58 -58
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +58 -58
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +9 -9
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +6 -6
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +6 -6
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +6 -6
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device.mjs +13 -29
- package/fesm2022/c8y-ngx-components-replace-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +16 -16
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-reports.mjs +19 -19
- package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +48 -48
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +33 -33
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +34 -34
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +42 -42
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository.mjs +4 -4
- package/fesm2022/c8y-ngx-components-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs +19 -19
- package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +33 -27
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs +17 -320
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +3 -3
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-shared.mjs +3 -3
- package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs +29 -29
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs +7 -7
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-static-assets-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets.mjs +6 -6
- package/fesm2022/c8y-ngx-components-static-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs +60 -60
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +40 -40
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-time-context.mjs +6 -6
- package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs +12 -12
- package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +12 -12
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +6 -6
- package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +33 -33
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +4 -4
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +41 -41
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs +10 -10
- package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-legacy-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-help-and-service.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +18 -14
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +4 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +4 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-device-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +22 -22
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-legacy-welcome.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-legacy-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +50 -36
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs +7 -7
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +22 -22
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +18 -18
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +18 -18
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-import-export-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +1658 -1315
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/icon-selector/icons/index.d.ts +1 -1
- package/icon-selector/icons/platform/index.d.ts +2 -2
- package/icon-selector/icons/platform/index.d.ts.map +1 -1
- package/locales/de.po +26 -3
- package/locales/es.po +26 -3
- package/locales/fr.po +26 -3
- package/locales/ja_JP.po +25 -3
- package/locales/ko.po +26 -3
- package/locales/locales.pot +25 -2
- package/locales/nl.po +26 -3
- package/locales/pl.po +26 -3
- package/locales/pt_BR.po +26 -3
- package/locales/zh_CN.po +26 -3
- package/locales/zh_TW.po +26 -3
- package/package.json +1 -1
- package/replace-device/replace-device.module.d.ts.map +1 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone-modal.component.d.ts +6 -6
- package/sensor-phone/sensor-phone-modal/sensor-phone-modal.component.d.ts.map +1 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone.model.d.ts +0 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone.model.d.ts.map +1 -1
- package/sensor-phone/sensor-phone.module.d.ts +2 -3
- package/sensor-phone/sensor-phone.module.d.ts.map +1 -1
- package/widgets/definitions/datapoints-table/index.d.ts +1 -2
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
- package/widgets/definitions/html-widget/html-widget-config.factory.d.ts +1 -1
- package/widgets/definitions/html-widget/html-widget-config.factory.d.ts.map +1 -1
- package/widgets/definitions/image/index.d.ts +1 -1
- package/widgets/definitions/image/index.d.ts.map +1 -1
- package/widgets/definitions/markdown/index.d.ts +1 -1
- package/widgets/definitions/markdown/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
- package/widgets/implementations/three-d-rotation/three-d-rotation-widget-view/three-d-rotation-widget-view.component.d.ts.map +1 -1
|
@@ -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-widget-alarms-reload.component.ts","../../widgets/implementations/alarms/alarm-widget-alarms-reload.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 { gettext, GlobalAutoRefreshWidgetConfig, DateTimeContext } from '@c8y/ngx-components';\nimport { SeverityFilter, AlarmStatusSettings } from '@c8y/client';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\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\nexport type AlarmListRefreshOption = 'none' | 'interval' | 'global-interval';\n\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 enum DATE_SELECTION {\n CONFIG = 'config',\n VIEW_AND_CONFIG = 'view_and_config',\n DASHBOARD_CONTEXT = 'dashboard_context'\n}\nexport interface AlarmListWidgetConfig extends GlobalAutoRefreshWidgetConfig {\n order: AlarmOrderType;\n isRealtime?: boolean;\n showAlarmsForChildren?: boolean;\n refreshInterval?: number;\n isAutoRefreshEnabled?: boolean;\n refreshOption?: AlarmListRefreshOption;\n device?: SelectedDevice | null;\n severities: SeverityFilter;\n status: AlarmStatusSettings;\n types?: string[];\n dateFilter?: DateTimeContext;\n widgetInstanceGlobalTimeContext?: boolean;\n displayDateSelection?: boolean;\n interval?: AlarmFilterInterval['id'];\n displaySettings?: {\n globalTimeContext: boolean;\n globalAutoRefreshContext: boolean;\n };\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(isIntervalRefresh: boolean, widgetId?: string): AlarmListWidgetConfig {\n return {\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 isRealtime: !isIntervalRefresh,\n isAutoRefreshEnabled: true,\n refreshInterval: isIntervalRefresh ? this.alarmsViewService.DEFAULT_INTERVAL_VALUE : undefined\n };\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(\n oldConfig: LegacyAlarmListConfig,\n isIntervalRefresh: boolean\n ): 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: isIntervalRefresh ? this.alarmsViewService.DEFAULT_INTERVAL_VALUE : undefined\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.dateFilter) {\n filter.lastUpdatedFrom =\n typeof config.dateFilter[0] === 'string'\n ? config.dateFilter[0]\n : config.dateFilter[0].toISOString();\n filter.createdTo =\n typeof config.dateFilter[1] === 'string'\n ? config.dateFilter[1]\n : config.dateFilter[1].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';\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 {\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport {\n ControlContainer,\n FormArray,\n FormBuilder,\n FormControl,\n FormGroup,\n NgForm,\n ValidatorFn,\n FormsModule,\n ReactiveFormsModule\n} from '@angular/forms';\nimport {\n ALARM_STATUS_LABELS,\n AlarmStatus,\n AlarmService,\n IAlarm,\n IResultList,\n SEVERITY_LABELS\n} from '@c8y/client';\nimport {\n AlertService,\n OnBeforeSave,\n gettext,\n C8yTranslateDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n IconDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n ALARM_STATUS_ICON,\n AlarmsViewService,\n DEFAULT_SEVERITY_VALUES,\n DEFAULT_STATUS_VALUES,\n AlarmsDateFilterComponent,\n AlarmsListComponent\n} from '@c8y/ngx-components/alarms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isEqual, omit } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { debounceTime, pairwise, startWith } from 'rxjs/operators';\nimport {\n ALARM_ORDER_LABELS,\n ALARM_ORDER_VALUES,\n AlarmListWidgetConfig,\n AlarmOrderType,\n DATE_SELECTION,\n AlarmListRefreshOption,\n GLOBAL_INTERVAL_OPTION\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService, DEFAULT_PAGE_SIZE } from '../alarm-widget.service';\nimport { Interval } from '@c8y/ngx-components/interval-picker';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common';\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 C8yTranslateDirective,\n PopoverDirective,\n NgIf,\n FormGroupComponent,\n AlarmsDateFilterComponent,\n RequiredInputPlaceholderDirective,\n NgFor,\n NgClass,\n IconDirective,\n MessagesComponent,\n MessageDirective,\n AlarmsListComponent,\n C8yTranslatePipe,\n AsyncPipe,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe\n ]\n})\nexport class AlarmListWidgetConfigComponent implements OnInit, OnChanges, 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 readonly GLOBAL_INTERVAL_OPTION = GLOBAL_INTERVAL_OPTION;\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 refreshTypePopoverMessage: string;\n refreshTypeTitle: string;\n severityList = Object.keys(SEVERITY_LABELS);\n showDateFilter = true;\n DATE_SELECTION = DATE_SELECTION;\n dateSelection: DATE_SELECTION | undefined;\n dateSelectionHelp = this.translateService.instant(\n gettext(`Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li>\n </ul>`)\n );\n refreshOption: AlarmListRefreshOption;\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 formChangesSubscription: Subscription;\n\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 translateService: TranslateService,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.refreshTypeTitle = this.config.isRealtime\n ? this.translateService.instant(gettext('Realtime'))\n : this.translateService.instant(gettext('Auto refresh'));\n\n this.refreshTypePopoverMessage = this.config.isRealtime\n ? this.translateService.instant(gettext('Change the default state of realtime refresh.'))\n : this.translateService.instant(\n gettext('Change the state of interval automatic refresh and set the refresh frequency.')\n );\n\n this.initializeForm();\n\n if (!this.config.isRealtime) {\n this.updateConfigBasedOnRefreshOption();\n }\n this.config.isRealtime = !this.alarmsViewService.isIntervalRefresh();\n\n const isWidgetWithExistingConfig =\n this.config.order && this.config.severities && this.config.status;\n\n if (isWidgetWithExistingConfig) {\n await this.getAlarms(this.config);\n } else {\n /** Used when creating a new widget */\n await this.getAlarms(this.formGroup.value as AlarmListWidgetConfig);\n }\n this.handlePreviewSubscription();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.formGroup && changes.config) {\n this.formGroup.get('device').patchValue(this.config.device);\n }\n }\n\n ngOnDestroy(): void {\n this.formChangesSubscription?.unsubscribe();\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 return true;\n }\n\n onDateFilterChange(event: { selectedDates: [Date, Date]; interval: Interval['id'] }) {\n this.formGroup.patchValue({\n dateFilter: event.selectedDates,\n interval: event.interval\n });\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 updateRefreshOption() {\n this.config.refreshOption = this.refreshOption;\n this.formGroup.controls.refreshOption.setValue(this.refreshOption);\n const isGlobalInterval = this.refreshOption === GLOBAL_INTERVAL_OPTION;\n\n this.config.widgetInstanceGlobalAutoRefreshContext = isGlobalInterval;\n this.formGroup.controls.widgetInstanceGlobalAutoRefreshContext.setValue(isGlobalInterval);\n\n this.updateConfigBasedOnRefreshOption();\n }\n\n get types(): FormArray {\n return this.formGroup.get('types') as FormArray;\n }\n\n dateSelectionChange(dateSelection: DATE_SELECTION): void {\n if (dateSelection === DATE_SELECTION.CONFIG) {\n this.showDateFilter = true;\n this.formGroup.patchValue({\n displayDateSelection: false,\n widgetInstanceGlobalTimeContext: false\n });\n } else if (dateSelection === DATE_SELECTION.VIEW_AND_CONFIG) {\n this.showDateFilter = true;\n this.formGroup.patchValue({\n displayDateSelection: true,\n widgetInstanceGlobalTimeContext: false\n });\n } else if (dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT) {\n this.showDateFilter = false;\n this.formGroup.patchValue({\n displayDateSelection: false,\n widgetInstanceGlobalTimeContext: true\n });\n }\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);\n this.initializeTypes(this.config.types);\n this.initDateSelection();\n this.refreshOption = this.config.refreshOption ?? 'interval';\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 isAutoRefreshEnabled: [true],\n refreshInterval: !this.config.isRealtime\n ? new FormControl({\n value: this.alarmsViewService.DEFAULT_INTERVAL_VALUE,\n disabled: this.isAutorefershDisabled()\n })\n : new FormControl(undefined),\n device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined),\n dateFilter: this.config.dateFilter\n ? new FormControl(this.config.dateFilter)\n : new FormControl([new Date(0), new Date()]),\n displayDateSelection: this.config.displayDateSelection || false,\n widgetInstanceGlobalTimeContext: this.config.widgetInstanceGlobalTimeContext || false,\n interval: this.config.interval || 'none',\n refreshOption: this.config.isRealtime ? null : 'interval',\n widgetInstanceGlobalAutoRefreshContext: this.config.refreshOption === GLOBAL_INTERVAL_OPTION\n });\n }\n\n private isAutorefershDisabled(): boolean {\n /**This check is required on widget creation */\n if (this.config.isAutoRefreshEnabled === undefined) {\n return false;\n }\n\n return !this.config.isAutoRefreshEnabled;\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 private initDateSelection(): void {\n this.dateSelection = this.config?.widgetInstanceGlobalTimeContext\n ? DATE_SELECTION.DASHBOARD_CONTEXT\n : this.config?.displayDateSelection\n ? DATE_SELECTION.VIEW_AND_CONFIG\n : DATE_SELECTION.CONFIG;\n\n this.dateSelectionChange(this.dateSelection);\n\n const interval = this.config?.interval ?? 'none';\n if (interval === 'none' || interval === 'custom') {\n return;\n }\n\n this.config.dateFilter = this.alarmsViewService.getDateTimeContextByInterval(\n this.config.interval\n );\n this.formGroup.patchValue({\n dateFilter: this.config.dateFilter\n });\n }\n\n /**\n * Initializes and handles the form change subscription for the Alarm list preview at Widget's configuration.\n *\n * This method subscribes to form value changes with a debounce time of 500ms.\n * It compares the previous and current form values to determine if the changes are relevant.\n * If the only change is in the `isAutoRefreshEnabled` property, the change is ignored.\n */\n private handlePreviewSubscription(): void {\n this.formChangesSubscription = this.formGroup.valueChanges\n .pipe(startWith(this.formGroup.value), pairwise(), debounceTime(500))\n .subscribe(([previousConfig, currentConfig]: [unknown, unknown]) => {\n const typedPreviousConfig: AlarmListWidgetConfig = previousConfig as AlarmListWidgetConfig;\n const typedCurrentConfig: AlarmListWidgetConfig = currentConfig as AlarmListWidgetConfig;\n\n if (this.isOnlyAutoRefreshOrIntervalChanged(typedPreviousConfig, typedCurrentConfig)) {\n return;\n }\n\n if (\n this.alarmListWidgetService.allValuesFalse(typedCurrentConfig.severities) ||\n this.alarmListWidgetService.allValuesFalse(typedCurrentConfig.status)\n ) {\n this.alarms$.next({ data: [], res: null });\n return;\n }\n\n this.getAlarms(typedCurrentConfig);\n });\n }\n\n /**\n * Determines if the only changes between two `AlarmListWidgetConfig` objects are in the `isAutoRefreshEnabled` and `refreshInterval` properties.\n *\n * This method compares two configurations by omitting `isAutoRefreshEnabled` and `refreshInterval`.\n * It returns true if these are the only properties that differ between the previous and current configurations.\n * Note that `refreshInterval` is relevant only when the refresh type is set to an interval.\n *\n * @param previousConfig - The previous configuration of `AlarmListWidgetConfig`.\n * @param currentConfig - The current configuration of `AlarmListWidgetConfig`.\n * @returns `true` if the differences are confined to `isAutoRefreshEnabled` and `refreshInterval`, `false` otherwise.\n */\n private isOnlyAutoRefreshOrIntervalChanged(\n previousConfig: AlarmListWidgetConfig,\n currentConfig: AlarmListWidgetConfig\n ): boolean {\n const prevConfigCopy = omit(previousConfig, 'isAutoRefreshEnabled', 'refreshInterval');\n const currentConfigCopy = omit(currentConfig, 'isAutoRefreshEnabled', 'refreshInterval');\n\n return isEqual(prevConfigCopy, currentConfigCopy);\n }\n\n private updateConfigBasedOnRefreshOption() {\n const isInterval = this.refreshOption === 'interval';\n\n this.config.isAutoRefreshEnabled = isInterval;\n this.formGroup.controls.isAutoRefreshEnabled.setValue(isInterval);\n\n isInterval\n ? this.formGroup.get('refreshInterval').enable()\n : this.formGroup.get('refreshInterval').disable();\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<form\n class=\"row d-flex flex-wrap\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"col-xs-12\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date' | translate }}</legend>\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"d-flex a-i-center\">\n <span translate>Date selection</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n <option\n title=\"{{ 'Widget and widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.VIEW_AND_CONFIG\"\n >\n {{ 'Widget and widget configuration' | translate }}\n </option>\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <div class=\"row tight-grid\">\n <div class=\"col-md-7\">\n <ng-container *ngIf=\"showDateFilter\">\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <label>{{ 'Date filter' | translate }}</label>\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 </ng-container>\n </div>\n <div class=\"col-md-5\">\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <label class=\"d-flex a-i-center\">\n {{ refreshTypeTitle }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"refreshTypePopoverMessage\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <div class=\"d-flex gap-8 a-i-center\">\n <ng-template #realtime>\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Realtime refresh' | translate }}</span>\n </label>\n </ng-template>\n <div\n class=\"c8y-select-wrapper\"\n *ngIf=\"!config.isRealtime; else realtime\"\n >\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"refreshOption\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"updateRefreshOption()\"\n >\n <option value=\"none\">\n {{ 'No automatic refresh' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval' | translate\"\n value=\"interval\"\n >\n {{ 'Use refresh interval' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval, synchronized globally' | translate\"\n value=\"global-interval\"\n >\n {{ 'Use global refresh interval' | translate }}\n </option>\n </select>\n </div>\n <ng-container\n *ngIf=\"!config.isRealtime && config.refreshOption !== GLOBAL_INTERVAL_OPTION\"\n >\n <div class=\"c8y-select-wrapper flex-grow flex-no-shrink\" title=\" {{ 'Interval' | translate }}\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n data-cy=\"c8y-alarm-list-widget-config--interval-selector\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_IN_MILLISECONDS\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }}s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </ng-container>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\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 <div\n class=\"d-flex p-b-8 p-t-4 a-i-center\"\n *ngFor=\"let order of orderList; let i = index\"\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 </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"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 <ng-container *ngFor=\"let severityOption of severityList\">\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 <ng-container *ngIf=\"{ result: severityOption | severityIcon } as severityIcon\">\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.result.iconClass }}\"\n [c8yIcon]=\"severityIcon.result.c8yIcon\"\n ></i>\n </ng-container>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.severities.hasError('required')\">\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n <ng-container *ngIf=\"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 </ng-container>\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"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 <ng-container *ngFor=\"let statusOption of statusList\">\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 </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.status.hasError('required')\">\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\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 <div\n class=\"input-group m-b-4\"\n *ngFor=\"let type of types.controls; let i = index\"\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 <div\n class=\"input-group-btn\"\n *ngIf=\"i === types.controls.length - 1\"\n >\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 </div>\n </c8y-form-group>\n </fieldset>\n </div>\n</form>\n\n<ng-template #alarmListPreview>\n <c8y-alarms-list\n [alarms]=\"alarms$ | async\"\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 {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport {\n CountdownIntervalComponent,\n gettext,\n IntervalBasedReload,\n WIDGET_TYPE_VALUES,\n WidgetGlobalAutoRefreshService,\n GainsightService,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmsViewService } from '@c8y/ngx-components/alarms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { AlarmListWidgetConfig, GLOBAL_INTERVAL_OPTION } from './alarm-list-widget.model';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-alarm-widget-alarms-reload',\n templateUrl: './alarm-widget-alarms-reload.component.html',\n imports: [\n NgIf,\n TooltipDirective,\n CountdownIntervalComponent,\n IconDirective,\n NgClass,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmWidgetAlarmsReloadComponent\n extends IntervalBasedReload\n implements OnInit, AfterViewInit, OnChanges, OnDestroy\n{\n readonly REALTIME_UPDATE_ALARMS_MESSAGE = this.alarmsViewService.REALTIME_UPDATE_ALARMS_MESSAGE;\n readonly WIDGET_TYPE_VALUES = WIDGET_TYPE_VALUES;\n\n /**\n * State of this boolean depends on an Application Options \"alarmsRefreshType\" setting.\n */\n @Input() isIntervalRefresh: boolean;\n /**\n * @inheritdoc\n */\n @Input() refreshInterval: number;\n /**\n * Alarm widgets config.\n */\n @Input() config: AlarmListWidgetConfig;\n /**\n * @inheritdoc\n */\n @Input() isLoading: BehaviorSubject<boolean>;\n /**\n * Indicates whether the alarm list is being scrolled or not.\n */\n @Input() isScrolling: boolean;\n /**\n * @inheritdoc\n */\n @Input() isRefreshDisabled: boolean;\n /**\n * @inheritdoc\n */\n @Output() onCountdownEnded = new EventEmitter<void>();\n /**\n * Emitted to indicate that the widgets realtime button state has changed.\n */\n @Output() onRealTimeToggleChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n @ViewChild(CountdownIntervalComponent, { static: false })\n countdownIntervalComponent: CountdownIntervalComponent;\n /**\n * @inheritdoc\n */\n protected hideCountdown: boolean;\n /**\n * Tooltip for a new realtime alarm indicator.\n */\n realtimeIconTitle: string;\n /**\n * Indicates whether the countdown has been cleared already.\n */\n isNewAlarmMessageCleared = true;\n /**\n * @inheritdoc\n */\n isIntervalRefreshToggleOn: boolean;\n /**\n * Indicates the current state of an realtime toggle button.\n */\n isRealtimeToggleOn: boolean;\n /**\n * Holds the subscription to a countdown observable.\n */\n countdownSubscription: Subscription;\n /**\n * @inheritdoc\n */\n protected manuallyDisabledCountdown = false;\n\n toggleCountdownButtonTooltipText: string;\n globalAutoRefreshEnabled: boolean;\n\n constructor(\n private alarmsViewService: AlarmsViewService,\n private cdRef: ChangeDetectorRef,\n private translateService: TranslateService,\n private widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService,\n protected gainsightService: GainsightService\n ) {\n super();\n }\n\n ngOnInit() {\n if (!this.isIntervalRefresh) {\n this.isRealtimeToggleOn = this.config.isAutoRefreshEnabled;\n this.realtimeIconTitle = this.getRealtimeIconTitle();\n } else {\n this.isIntervalRefreshToggleOn =\n !this.isRefreshDisabled && (this.config.isAutoRefreshEnabled || !!this.refreshInterval);\n this.updateCountdownButtonTooltipText();\n }\n }\n\n ngAfterViewInit() {\n if (this.isIntervalRefresh && this.refreshInterval) {\n this.startCountdown();\n }\n\n if (this.globalAutoRefreshEnabled) {\n this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$\n .pipe(tap(() => this.onCountdownEnded.emit()))\n .subscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const { isDisabled, config } = changes;\n if (config) {\n this.globalAutoRefreshEnabled = this.config.refreshOption === GLOBAL_INTERVAL_OPTION;\n }\n if (isDisabled) {\n this.isIntervalRefreshToggleOn =\n !this.isRefreshDisabled && (this.config.isAutoRefreshEnabled || !!this.refreshInterval);\n this.updateCountdownButtonTooltipText(gettext('Disabled'));\n }\n\n if (\n !this.isIntervalRefresh ||\n this.manuallyDisabledCountdown ||\n !this.config.isAutoRefreshEnabled\n ) {\n return;\n }\n\n this.handleScrolling();\n }\n\n ngOnDestroy() {\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n }\n\n /**\n * @inheritdoc\n */\n countdownEnded(): void {\n /**\n * @inheritdoc\n */\n this.autoRefreshList();\n }\n\n reload(): void {\n if (this.isIntervalRefresh) {\n this.autoRefreshList();\n } else {\n this.onCountdownEnded.emit();\n this.isNewAlarmMessageCleared = true;\n }\n }\n\n /**\n * Toggles the real-time state of the component.\n *\n * This method switches the `isRealtimeToggleOn` state between true and false.\n * When the state is toggled, it emits the current state through `onRealTimeToggleChanged` event.\n * It also updates the `realtimeIconTitle` based on the new state.\n */\n toggleRealtimeState(): void {\n this.isRealtimeToggleOn = !this.isRealtimeToggleOn;\n this.onRealTimeToggleChanged.emit(this.isRealtimeToggleOn);\n this.realtimeIconTitle = this.getRealtimeIconTitle();\n }\n\n /**\n * Stops the countdown and triggers a refresh action.\n * This function is responsible for halting the countdown interval component's operation.\n * After stopping the countdown, it emits an `onCountdownEnded` event.\n * This event is used to inform external components that the countdown has ended,\n * typically prompting them to reload or refresh their data.\n */\n autoRefreshList(): void {\n if (this.isIntervalRefreshToggleOn && this.config.isAutoRefreshEnabled) {\n this.countdownIntervalComponent.stop();\n }\n this.onCountdownEnded.emit();\n }\n\n /**\n * Sets the tooltip message for a new realtime alarm indicator.\n * @returns Tooltip message.\n */\n getRealtimeIconTitle(): string {\n return this.isRealtimeToggleOn\n ? this.translateService.instant(gettext('Realtime active'))\n : this.translateService.instant(gettext('Realtime inactive'));\n }\n\n /**\n * Enables and starts the countdown timer.\n *\n * This method makes the countdown visible (`hideCountdown` is set to false) and then\n * starts the countdown process. It ensures the countdown timer is updated immediately\n * by triggering change detection with `cdRef.detectChanges()` before starting the countdown.\n * This method encapsulates the logic required to initiate the countdown timer.\n */\n enableCountdown(): void {\n this.hideCountdown = false;\n // Prevents the countdown from getting stuck on an initial value.\n this.cdRef.detectChanges();\n this.startCountdown();\n }\n\n /**\n * @inheritdoc\n */\n protected updateCountdownButtonTooltipText(customText?: string): void {\n if (customText) {\n this.toggleCountdownButtonTooltipText = customText;\n return;\n }\n this.toggleCountdownButtonTooltipText = this.isIntervalRefreshToggleOn\n ? this.translateService.instant(gettext('Disable auto refresh'))\n : this.translateService.instant(gettext('Enable auto refresh'));\n }\n}\n","<div\n class=\"m-l-auto d-flex p-t-4 p-b-4\"\n *ngIf=\"!globalAutoRefreshEnabled\"\n>\n <div class=\"m-l-auto d-flex a-i-center\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"isIntervalRefresh && refreshInterval && config.isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isRefreshDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"isIntervalRefresh && refreshInterval && config.isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-alarms-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event, WIDGET_TYPE_VALUES.ALARMS)\"\n />\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"\n !isNewAlarmMessageCleared\n ? (REALTIME_UPDATE_ALARMS_MESSAGE | translate)\n : ('Refresh' | translate)\n \"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isRefreshDisabled || (isLoading | async)\"\n (click)=\"reload()\"\n data-cy=\"c8y-alarms-widget--reload-button\"\n >\n <span\n class=\"tag tag--info m-r-8\"\n *ngIf=\"!isNewAlarmMessageCleared\"\n >\n {{ 'New alarms' | translate }}\n </span>\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn input-group-btn--last\"\n *ngIf=\"!isIntervalRefresh\"\n >\n <button\n class=\"c8y-realtime btn btn-default\"\n [attr.aria-label]=\"realtimeIconTitle\"\n [tooltip]=\"realtimeIconTitle\"\n placement=\"bottom\"\n type=\"button\"\n [container]=\"'body'\"\n (click)=\"toggleRealtimeState()\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-alarms-widget--realtime-indicator\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{\n active: isRealtimeToggleOn,\n inactive: !isRealtimeToggleOn\n }\"\n ></span>\n </button>\n </div>\n </div>\n </div>\n</div>","import {\n AfterViewInit,\n Component,\n Input,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { AlarmService, IAlarm, IResult, IResultList } from '@c8y/client';\nimport {\n AlarmRealtimeService,\n AlarmWithChildrenRealtimeService,\n AlertService,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n gettext,\n globalAutoRefreshLoading,\n WidgetGlobalAutoRefreshService\n} from '@c8y/ngx-components';\nimport {\n AlarmsViewService,\n AlarmsListComponent,\n AlarmsDateFilterComponent\n} from '@c8y/ngx-components/alarms';\nimport { isEmpty, isEqual } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { skip, takeUntil, tap } from 'rxjs/operators';\nimport {\n ASSET_ALARMS_WIDGET_ID,\n AlarmListWidgetConfig,\n RECENT_ALARMS_WIDGET_ID\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService } from '../alarm-widget.service';\nimport { AlarmWidgetAlarmsReloadComponent } from '../alarm-widget-alarms-reload.component';\nimport { Interval } from '@c8y/ngx-components/interval-picker';\nimport { NgIf, AsyncPipe } from '@angular/common';\n\n/**\n * To ensure backward compatibility, legacy widgets will be converted to the new implementation.\n */\n@Component({\n selector: 'c8y-alarm-list-widget',\n templateUrl: './alarm-list-widget.component.html',\n providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService],\n imports: [\n AlarmsListComponent,\n NgIf,\n AlarmsDateFilterComponent,\n AlarmWidgetAlarmsReloadComponent,\n AsyncPipe\n ]\n})\nexport class AlarmListWidgetComponent\n implements OnInit, AfterViewInit, OnDestroy, DynamicComponent\n{\n /**\n * Alarm widget config.\n */\n @Input() config: AlarmListWidgetConfig;\n /**\n * Represents current alarms.\n */\n alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n /**\n * Current isLoading state. Based on it next countdown cycle is being started.\n */\n isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(true);\n /**\n * State of this boolean depends on an Application Options \"alarmsRefreshType\" setting.\n */\n isIntervalRefresh: boolean;\n /**\n * Current refresh interval set in a widget config.\n */\n refreshInterval: number;\n\n @ViewChild(AlarmWidgetAlarmsReloadComponent)\n alarmWidgetAlarmsReloadComp: AlarmWidgetAlarmsReloadComponent;\n alerts: DynamicComponentAlertAggregator;\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 private destroy$: Subject<void> = new Subject();\n isDisabled = false;\n\n constructor(\n private alarmWidgetService: AlarmWidgetService,\n private alarmRealtimeService: AlarmRealtimeService,\n private alarmService: AlarmService,\n private alarmsViewService: AlarmsViewService,\n private alarmWithChildrenRealtimeService: AlarmWithChildrenRealtimeService,\n private dashboardChild: DashboardChildComponent,\n private alertService: AlertService,\n private widgetGlobalAutoRefresh: WidgetGlobalAutoRefreshService\n ) {\n this.isIntervalRefresh = this.alarmsViewService.isIntervalRefresh();\n }\n\n async ngOnInit(): Promise<void> {\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n if (this.alarmWidgetService.isOldAlarmConfigStructure(this.config)) {\n const mappedConfig = this.alarmWidgetService.mapToNewConfigStructure(\n this.config,\n this.isIntervalRefresh\n );\n Object.assign(this.config, mappedConfig);\n }\n\n if (this.config.widgetInstanceGlobalAutoRefreshContext && !this.config.isRealtime) {\n this.handleGlobalRefreshLoading();\n }\n const _config = this.dashboardChild['data']?.config;\n const isLegacyWidgetWithoutConfiguration =\n isEmpty(_config) ||\n isEqual(_config, { displaySettings: { globalAutoRefreshContext: true } }) ||\n isEqual(_config, {\n displaySettings: { globalAutoRefreshContext: true },\n device: _config.device\n });\n\n if (isLegacyWidgetWithoutConfiguration) {\n this.setLegacyRecentOrCriticalAlarmWidgetConfig();\n }\n\n this.updateWidgetRefreshMode();\n this.refreshInterval = !!this.config?.refreshInterval && this.config?.refreshInterval;\n await this.fetchAlarms();\n }\n\n ngAfterViewInit(): void {\n if (!this.isIntervalRefresh && this.config.refreshOption === 'interval') {\n this.handleRealtimeAlarms(this.config, this.alarmWidgetAlarmsReloadComp.isRealtimeToggleOn);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes?.config?.currentValue?.date) {\n this.config.dateFilter = changes.config.currentValue.date;\n }\n }\n\n ngOnDestroy(): void {\n if (this.config.isRealtime) {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.config.widgetInstanceGlobalAutoRefreshContext && this.isLoading$.value) {\n this.widgetGlobalAutoRefresh.decrementLoading();\n }\n }\n\n async fetchAlarms(): Promise<void> {\n this.updateDateFilter();\n this.alarms$.next(await this.getAlarms());\n }\n\n async onDateFilterChange(event: {\n selectedDates: [Date, Date];\n interval: Interval['id'];\n }): Promise<void> {\n this.config.dateFilter = event.selectedDates;\n this.config.interval = event.interval;\n await this.fetchAlarms();\n }\n\n handleRealTimeToggleChange(isRealtimeToggleOn: boolean): void {\n if (!isRealtimeToggleOn) {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n this.unsubscribe$ = new Subject();\n this.handleRealtimeAlarms(this.config, isRealtimeToggleOn);\n }\n\n /**\n * Updates the widget's date filter based on the currently selected interval.\n * If the interval is set to last hour, we will configure the date filter to dynamically show alarms only from the last hour.\n */\n private updateDateFilter(): void {\n if (this.config.interval === 'custom' || this.config.widgetInstanceGlobalTimeContext) {\n return;\n }\n\n if (!this.config.interval) {\n this.config.interval = 'none';\n }\n\n this.config.dateFilter = this.alarmsViewService.getDateTimeContextByInterval(\n this.config.interval\n );\n }\n\n /**\n * Updates the widget's refresh mode based on the current configuration and the interval refresh setting.\n * If the widget's 'isRealtime' configuration differs from the current global interval refresh setting (application options setting),\n * the widget's mode is updated to either 'realtime' or 'interval'. In 'realtime' mode, the refresh interval is null,\n * and in 'interval' mode, it is set to the default interval value.\n */\n private updateWidgetRefreshMode(): void {\n const isRefreshTypeSwitched = !!this.config.isRealtime !== !this.isIntervalRefresh;\n if (!isRefreshTypeSwitched) {\n return;\n }\n\n this.config.isRealtime = !this.isIntervalRefresh;\n\n if (this.config.isRealtime) {\n // Switching widget to realtime mode\n this.config.refreshInterval = null;\n this.config.refreshOption = null;\n this.config.widgetInstanceGlobalAutoRefreshContext = false;\n this.config.isAutoRefreshEnabled = true;\n } else {\n // Switching widget to interval mode\n this.config.refreshInterval = this.alarmsViewService.DEFAULT_INTERVAL_VALUE;\n this.config.refreshOption = this.alarmsViewService.DEFAULT_REFRESH_OPTION_VALUE;\n this.config.widgetInstanceGlobalAutoRefreshContext = false;\n }\n }\n\n private async getAlarms(): Promise<IResultList<IAlarm>> {\n try {\n this.isLoading$.next(true);\n return await this.alarmService.list(\n this.alarmWidgetService.mapConfigToQueryFilter(this.config)\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.isDisabled = true;\n return;\n }\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n /**\n * Handles the realtime updates of alarms based on the widget configuration.\n * If a specific device is provided in the widget configuration, all alarms\n * originating from that device and its children are filtered based on status, severity, and type.\n * Otherwise, it processes all incoming alarms and filters them according to status, severity, and type,\n * as specified in the widget configuration. If new alarms meet the specified criteria, it sets a flag\n * to indicate the presence of new alarms.\n *\n * @param config - The configuration settings of the alarm list widget.\n * @param isRealtimeToggleOn - A flag indicating whether the realtime toggle is on. If true, the alarm list will be refreshed.\n * If false, the presence of new alarms will be displayed as \"New Alarms\" entry on widget refresh button, but the list won't be refreshed automatically.\n */\n private handleRealtimeAlarms(config: AlarmListWidgetConfig, isRealtimeToggleOn: boolean): void {\n const callback = (data: number | IAlarm) => {\n if (\n this.alarmWidgetService.filterAlarmsByStatusSeverityAndType(\n data,\n this.alarms$.value.data,\n config\n )\n ) {\n if (isRealtimeToggleOn) {\n this.fetchAlarms();\n this.alarmWidgetAlarmsReloadComp.isNewAlarmMessageCleared = true;\n } else {\n this.alarmWidgetAlarmsReloadComp.isNewAlarmMessageCleared = false;\n }\n }\n };\n\n if (this.config.device) {\n this.handleRealtime(\n this.alarmWithChildrenRealtimeService.onAll$.bind(this.alarmWithChildrenRealtimeService),\n callback\n );\n } else {\n this.handleRealtime(\n this.alarmRealtimeService.onAll$.bind(this.alarmRealtimeService),\n callback\n );\n }\n }\n\n /**\n * Sets up a subscription to a realtime data stream. This function takes a subscriber function,\n * which is used to subscribe to the data stream, and a callback function, which is called with each\n * data update received from the stream.\n *\n * @param subscriberFn - A function that returns an observable stream of alarm data.\n * @param callback - A function to be executed with each alarm data update.\n */\n private handleRealtime(\n subscriberFn: (id?: string) => Observable<IResult<IAlarm>>,\n callback: (data: IAlarm) => void\n ): void {\n subscriberFn(this.config.device?.id)\n .pipe(\n tap(({ data }) => {\n callback(data);\n }),\n takeUntil(this.unsubscribe$)\n )\n .subscribe();\n }\n\n private setLegacyRecentOrCriticalAlarmWidgetConfig(): void {\n const widgetId = this.dashboardChild['data']?.componentId\n ? this.dashboardChild['data']?.componentId //property is used in cockpit dashboards\n : this.dashboardChild['data']?.name; //property is used in device management dashboards\n\n if (widgetId === RECENT_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n this.isIntervalRefresh,\n RECENT_ALARMS_WIDGET_ID\n );\n Object.assign(this.config, predefinedConfig);\n\n return;\n }\n\n if (widgetId === ASSET_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n this.isIntervalRefresh\n );\n Object.assign(this.config, predefinedConfig);\n }\n }\n\n private handleGlobalRefreshLoading(): void {\n this.isLoading$\n .pipe(\n skip(1),\n globalAutoRefreshLoading(this.widgetGlobalAutoRefresh),\n takeUntil(this.destroy$)\n )\n .subscribe();\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]=\"!isDisabled\"\n>\n <c8y-alarms-date-filter\n *ngIf=\"config.displayDateSelection\"\n [updateQueryParams]=\"false\"\n [date]=\"this.config.dateFilter\"\n [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n (dateFilterChange)=\"onDateFilterChange($event)\"\n ></c8y-alarms-date-filter>\n <c8y-alarm-widget-alarms-reload\n class=\"d-contents\"\n [isIntervalRefresh]=\"isIntervalRefresh\"\n [refreshInterval]=\"refreshInterval\"\n [config]=\"config\"\n [isLoading]=\"isLoading$\"\n [isScrolling]=\"list.isScrolling\"\n [isRefreshDisabled]=\"isDisabled\"\n (onCountdownEnded)=\"fetchAlarms()\"\n (onRealTimeToggleChanged)=\"handleRealTimeToggleChange($event)\"\n ></c8y-alarm-widget-alarms-reload>\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 { AlarmWidgetAlarmsReloadComponent } from './alarm-widget-alarms-reload.component';\nimport { SortingDescriptionPopoverMessagePipe } from './sorting-description-popover-message.pipe';\nimport { SeverityIconPipe } from './severity-icon.pipe';\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 AlarmWidgetAlarmsReloadComponent,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe\n ]\n})\nexport class AlarmsWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AlarmWidgetService","i3","i4","i2","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-widget-alarms-reload.component.ts","../../widgets/implementations/alarms/alarm-widget-alarms-reload.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 { gettext, GlobalAutoRefreshWidgetConfig, DateTimeContext } from '@c8y/ngx-components';\nimport { SeverityFilter, AlarmStatusSettings } from '@c8y/client';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\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\nexport type AlarmListRefreshOption = 'none' | 'interval' | 'global-interval';\n\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 enum DATE_SELECTION {\n CONFIG = 'config',\n VIEW_AND_CONFIG = 'view_and_config',\n DASHBOARD_CONTEXT = 'dashboard_context'\n}\nexport interface AlarmListWidgetConfig extends GlobalAutoRefreshWidgetConfig {\n order: AlarmOrderType;\n isRealtime?: boolean;\n showAlarmsForChildren?: boolean;\n refreshInterval?: number;\n isAutoRefreshEnabled?: boolean;\n refreshOption?: AlarmListRefreshOption;\n device?: SelectedDevice | null;\n severities: SeverityFilter;\n status: AlarmStatusSettings;\n types?: string[];\n dateFilter?: DateTimeContext;\n widgetInstanceGlobalTimeContext?: boolean;\n displayDateSelection?: boolean;\n interval?: AlarmFilterInterval['id'];\n displaySettings?: {\n globalTimeContext: boolean;\n globalAutoRefreshContext: boolean;\n };\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(isIntervalRefresh: boolean, widgetId?: string): AlarmListWidgetConfig {\n return {\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 isRealtime: !isIntervalRefresh,\n isAutoRefreshEnabled: true,\n refreshInterval: isIntervalRefresh ? this.alarmsViewService.DEFAULT_INTERVAL_VALUE : undefined\n };\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(\n oldConfig: LegacyAlarmListConfig,\n isIntervalRefresh: boolean\n ): 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: isIntervalRefresh ? this.alarmsViewService.DEFAULT_INTERVAL_VALUE : undefined\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.dateFilter) {\n filter.lastUpdatedFrom =\n typeof config.dateFilter[0] === 'string'\n ? config.dateFilter[0]\n : config.dateFilter[0].toISOString();\n filter.createdTo =\n typeof config.dateFilter[1] === 'string'\n ? config.dateFilter[1]\n : config.dateFilter[1].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';\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 {\n Component,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport {\n ControlContainer,\n FormArray,\n FormBuilder,\n FormControl,\n FormGroup,\n NgForm,\n ValidatorFn,\n FormsModule,\n ReactiveFormsModule\n} from '@angular/forms';\nimport {\n ALARM_STATUS_LABELS,\n AlarmStatus,\n AlarmService,\n IAlarm,\n IResultList,\n SEVERITY_LABELS\n} from '@c8y/client';\nimport {\n AlertService,\n OnBeforeSave,\n gettext,\n C8yTranslateDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n IconDirective,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n ALARM_STATUS_ICON,\n AlarmsViewService,\n DEFAULT_SEVERITY_VALUES,\n DEFAULT_STATUS_VALUES,\n AlarmsDateFilterComponent,\n AlarmsListComponent\n} from '@c8y/ngx-components/alarms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isEqual, omit } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { debounceTime, pairwise, startWith } from 'rxjs/operators';\nimport {\n ALARM_ORDER_LABELS,\n ALARM_ORDER_VALUES,\n AlarmListWidgetConfig,\n AlarmOrderType,\n DATE_SELECTION,\n AlarmListRefreshOption,\n GLOBAL_INTERVAL_OPTION\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService, DEFAULT_PAGE_SIZE } from '../alarm-widget.service';\nimport { Interval } from '@c8y/ngx-components/interval-picker';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common';\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 C8yTranslateDirective,\n PopoverDirective,\n NgIf,\n FormGroupComponent,\n AlarmsDateFilterComponent,\n RequiredInputPlaceholderDirective,\n NgFor,\n NgClass,\n IconDirective,\n MessagesComponent,\n MessageDirective,\n AlarmsListComponent,\n C8yTranslatePipe,\n AsyncPipe,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe\n ]\n})\nexport class AlarmListWidgetConfigComponent implements OnInit, OnChanges, 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 readonly GLOBAL_INTERVAL_OPTION = GLOBAL_INTERVAL_OPTION;\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 refreshTypePopoverMessage: string;\n refreshTypeTitle: string;\n severityList = Object.keys(SEVERITY_LABELS);\n showDateFilter = true;\n DATE_SELECTION = DATE_SELECTION;\n dateSelection: DATE_SELECTION | undefined;\n dateSelectionHelp = this.translateService.instant(\n gettext(`Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li>\n </ul>`)\n );\n refreshOption: AlarmListRefreshOption;\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 formChangesSubscription: Subscription;\n\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 translateService: TranslateService,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.refreshTypeTitle = this.config.isRealtime\n ? this.translateService.instant(gettext('Realtime'))\n : this.translateService.instant(gettext('Auto refresh'));\n\n this.refreshTypePopoverMessage = this.config.isRealtime\n ? this.translateService.instant(gettext('Change the default state of realtime refresh.'))\n : this.translateService.instant(\n gettext('Change the state of interval automatic refresh and set the refresh frequency.')\n );\n\n this.initializeForm();\n\n if (!this.config.isRealtime) {\n this.updateConfigBasedOnRefreshOption();\n }\n this.config.isRealtime = !this.alarmsViewService.isIntervalRefresh();\n\n const isWidgetWithExistingConfig =\n this.config.order && this.config.severities && this.config.status;\n\n if (isWidgetWithExistingConfig) {\n await this.getAlarms(this.config);\n } else {\n /** Used when creating a new widget */\n await this.getAlarms(this.formGroup.value as AlarmListWidgetConfig);\n }\n this.handlePreviewSubscription();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.formGroup && changes.config) {\n this.formGroup.get('device').patchValue(this.config.device);\n }\n }\n\n ngOnDestroy(): void {\n this.formChangesSubscription?.unsubscribe();\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 return true;\n }\n\n onDateFilterChange(event: { selectedDates: [Date, Date]; interval: Interval['id'] }) {\n this.formGroup.patchValue({\n dateFilter: event.selectedDates,\n interval: event.interval\n });\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 updateRefreshOption() {\n this.config.refreshOption = this.refreshOption;\n this.formGroup.controls.refreshOption.setValue(this.refreshOption);\n const isGlobalInterval = this.refreshOption === GLOBAL_INTERVAL_OPTION;\n\n this.config.widgetInstanceGlobalAutoRefreshContext = isGlobalInterval;\n this.formGroup.controls.widgetInstanceGlobalAutoRefreshContext.setValue(isGlobalInterval);\n\n this.updateConfigBasedOnRefreshOption();\n }\n\n get types(): FormArray {\n return this.formGroup.get('types') as FormArray;\n }\n\n dateSelectionChange(dateSelection: DATE_SELECTION): void {\n if (dateSelection === DATE_SELECTION.CONFIG) {\n this.showDateFilter = true;\n this.formGroup.patchValue({\n displayDateSelection: false,\n widgetInstanceGlobalTimeContext: false\n });\n } else if (dateSelection === DATE_SELECTION.VIEW_AND_CONFIG) {\n this.showDateFilter = true;\n this.formGroup.patchValue({\n displayDateSelection: true,\n widgetInstanceGlobalTimeContext: false\n });\n } else if (dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT) {\n this.showDateFilter = false;\n this.formGroup.patchValue({\n displayDateSelection: false,\n widgetInstanceGlobalTimeContext: true\n });\n }\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);\n this.initializeTypes(this.config.types);\n this.initDateSelection();\n this.refreshOption = this.config.refreshOption ?? 'interval';\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 isAutoRefreshEnabled: [true],\n refreshInterval: !this.config.isRealtime\n ? new FormControl({\n value: this.alarmsViewService.DEFAULT_INTERVAL_VALUE,\n disabled: this.isAutorefershDisabled()\n })\n : new FormControl(undefined),\n device: this.config.device ? new FormControl(this.config.device) : new FormControl(undefined),\n dateFilter: this.config.dateFilter\n ? new FormControl(this.config.dateFilter)\n : new FormControl([new Date(0), new Date()]),\n displayDateSelection: this.config.displayDateSelection || false,\n widgetInstanceGlobalTimeContext: this.config.widgetInstanceGlobalTimeContext || false,\n interval: this.config.interval || 'none',\n refreshOption: this.config.isRealtime ? null : 'interval',\n widgetInstanceGlobalAutoRefreshContext: this.config.refreshOption === GLOBAL_INTERVAL_OPTION\n });\n }\n\n private isAutorefershDisabled(): boolean {\n /**This check is required on widget creation */\n if (this.config.isAutoRefreshEnabled === undefined) {\n return false;\n }\n\n return !this.config.isAutoRefreshEnabled;\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 private initDateSelection(): void {\n this.dateSelection = this.config?.widgetInstanceGlobalTimeContext\n ? DATE_SELECTION.DASHBOARD_CONTEXT\n : this.config?.displayDateSelection\n ? DATE_SELECTION.VIEW_AND_CONFIG\n : DATE_SELECTION.CONFIG;\n\n this.dateSelectionChange(this.dateSelection);\n\n const interval = this.config?.interval ?? 'none';\n if (interval === 'none' || interval === 'custom') {\n return;\n }\n\n this.config.dateFilter = this.alarmsViewService.getDateTimeContextByInterval(\n this.config.interval\n );\n this.formGroup.patchValue({\n dateFilter: this.config.dateFilter\n });\n }\n\n /**\n * Initializes and handles the form change subscription for the Alarm list preview at Widget's configuration.\n *\n * This method subscribes to form value changes with a debounce time of 500ms.\n * It compares the previous and current form values to determine if the changes are relevant.\n * If the only change is in the `isAutoRefreshEnabled` property, the change is ignored.\n */\n private handlePreviewSubscription(): void {\n this.formChangesSubscription = this.formGroup.valueChanges\n .pipe(startWith(this.formGroup.value), pairwise(), debounceTime(500))\n .subscribe(([previousConfig, currentConfig]: [unknown, unknown]) => {\n const typedPreviousConfig: AlarmListWidgetConfig = previousConfig as AlarmListWidgetConfig;\n const typedCurrentConfig: AlarmListWidgetConfig = currentConfig as AlarmListWidgetConfig;\n\n if (this.isOnlyAutoRefreshOrIntervalChanged(typedPreviousConfig, typedCurrentConfig)) {\n return;\n }\n\n if (\n this.alarmListWidgetService.allValuesFalse(typedCurrentConfig.severities) ||\n this.alarmListWidgetService.allValuesFalse(typedCurrentConfig.status)\n ) {\n this.alarms$.next({ data: [], res: null });\n return;\n }\n\n this.getAlarms(typedCurrentConfig);\n });\n }\n\n /**\n * Determines if the only changes between two `AlarmListWidgetConfig` objects are in the `isAutoRefreshEnabled` and `refreshInterval` properties.\n *\n * This method compares two configurations by omitting `isAutoRefreshEnabled` and `refreshInterval`.\n * It returns true if these are the only properties that differ between the previous and current configurations.\n * Note that `refreshInterval` is relevant only when the refresh type is set to an interval.\n *\n * @param previousConfig - The previous configuration of `AlarmListWidgetConfig`.\n * @param currentConfig - The current configuration of `AlarmListWidgetConfig`.\n * @returns `true` if the differences are confined to `isAutoRefreshEnabled` and `refreshInterval`, `false` otherwise.\n */\n private isOnlyAutoRefreshOrIntervalChanged(\n previousConfig: AlarmListWidgetConfig,\n currentConfig: AlarmListWidgetConfig\n ): boolean {\n const prevConfigCopy = omit(previousConfig, 'isAutoRefreshEnabled', 'refreshInterval');\n const currentConfigCopy = omit(currentConfig, 'isAutoRefreshEnabled', 'refreshInterval');\n\n return isEqual(prevConfigCopy, currentConfigCopy);\n }\n\n private updateConfigBasedOnRefreshOption() {\n const isInterval = this.refreshOption === 'interval';\n\n this.config.isAutoRefreshEnabled = isInterval;\n this.formGroup.controls.isAutoRefreshEnabled.setValue(isInterval);\n\n isInterval\n ? this.formGroup.get('refreshInterval').enable()\n : this.formGroup.get('refreshInterval').disable();\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<form\n class=\"row d-flex flex-wrap\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"col-xs-12\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date' | translate }}</legend>\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"d-flex a-i-center\">\n <span translate>Date selection</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n <option\n title=\"{{ 'Widget and widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.VIEW_AND_CONFIG\"\n >\n {{ 'Widget and widget configuration' | translate }}\n </option>\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <div class=\"row tight-grid\">\n <div class=\"col-md-7\">\n <ng-container *ngIf=\"showDateFilter\">\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <label>{{ 'Date filter' | translate }}</label>\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 </ng-container>\n </div>\n <div class=\"col-md-5\">\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <label class=\"d-flex a-i-center\">\n {{ refreshTypeTitle }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"refreshTypePopoverMessage\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <div class=\"d-flex gap-8 a-i-center\">\n <ng-template #realtime>\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Realtime refresh' | translate }}</span>\n </label>\n </ng-template>\n <div\n class=\"c8y-select-wrapper\"\n *ngIf=\"!config.isRealtime; else realtime\"\n >\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"refreshOption\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"updateRefreshOption()\"\n >\n <option value=\"none\">\n {{ 'No automatic refresh' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval' | translate\"\n value=\"interval\"\n >\n {{ 'Use refresh interval' | translate }}\n </option>\n <option\n [title]=\"'Refreshing after the given interval, synchronized globally' | translate\"\n value=\"global-interval\"\n >\n {{ 'Use global refresh interval' | translate }}\n </option>\n </select>\n </div>\n <ng-container\n *ngIf=\"!config.isRealtime && config.refreshOption !== GLOBAL_INTERVAL_OPTION\"\n >\n <div class=\"c8y-select-wrapper flex-grow flex-no-shrink\" title=\" {{ 'Interval' | translate }}\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n data-cy=\"c8y-alarm-list-widget-config--interval-selector\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_IN_MILLISECONDS\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }}s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </ng-container>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\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 <div\n class=\"d-flex p-b-8 p-t-4 a-i-center\"\n *ngFor=\"let order of orderList; let i = index\"\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 </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"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 <ng-container *ngFor=\"let severityOption of severityList\">\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 <ng-container *ngIf=\"{ result: severityOption | severityIcon } as severityIcon\">\n <i\n class=\"a-s-center m-r-4 icon-20 {{ severityIcon.result.iconClass }}\"\n [c8yIcon]=\"severityIcon.result.c8yIcon\"\n ></i>\n </ng-container>\n <span>{{ SEVERITY_LABELS[severityOption] | translate }}</span>\n </label>\n </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.severities.hasError('required')\">\n {{ 'Select at least one severity.' | translate }}\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </fieldset>\n <ng-container *ngIf=\"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 </ng-container>\n </div>\n\n <div class=\"col-md-6 col-xs-12\">\n <fieldset\n class=\"c8y-fieldset\"\n formArrayName=\"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 <ng-container *ngFor=\"let statusOption of statusList\">\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 </ng-container>\n <c8y-messages>\n <c8y-message *ngIf=\"formGroup.controls.status.hasError('required')\">\n {{ 'Select at least one status.' | translate }}\n </c8y-message>\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 <div\n class=\"input-group m-b-4\"\n *ngFor=\"let type of types.controls; let i = index\"\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 <div\n class=\"input-group-btn\"\n *ngIf=\"i === types.controls.length - 1\"\n >\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 </div>\n </c8y-form-group>\n </fieldset>\n </div>\n</form>\n\n<ng-template #alarmListPreview>\n <c8y-alarms-list\n [alarms]=\"alarms$ | async\"\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 {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport {\n CountdownIntervalComponent,\n gettext,\n IntervalBasedReload,\n WIDGET_TYPE_VALUES,\n WidgetGlobalAutoRefreshService,\n GainsightService,\n IconDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AlarmsViewService } from '@c8y/ngx-components/alarms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { AlarmListWidgetConfig, GLOBAL_INTERVAL_OPTION } from './alarm-list-widget.model';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-alarm-widget-alarms-reload',\n templateUrl: './alarm-widget-alarms-reload.component.html',\n imports: [\n NgIf,\n TooltipDirective,\n CountdownIntervalComponent,\n IconDirective,\n NgClass,\n C8yTranslatePipe,\n AsyncPipe\n ]\n})\nexport class AlarmWidgetAlarmsReloadComponent\n extends IntervalBasedReload\n implements OnInit, AfterViewInit, OnChanges, OnDestroy\n{\n readonly REALTIME_UPDATE_ALARMS_MESSAGE = this.alarmsViewService.REALTIME_UPDATE_ALARMS_MESSAGE;\n readonly WIDGET_TYPE_VALUES = WIDGET_TYPE_VALUES;\n\n /**\n * State of this boolean depends on an Application Options \"alarmsRefreshType\" setting.\n */\n @Input() isIntervalRefresh: boolean;\n /**\n * @inheritdoc\n */\n @Input() refreshInterval: number;\n /**\n * Alarm widgets config.\n */\n @Input() config: AlarmListWidgetConfig;\n /**\n * @inheritdoc\n */\n @Input() isLoading: BehaviorSubject<boolean>;\n /**\n * Indicates whether the alarm list is being scrolled or not.\n */\n @Input() isScrolling: boolean;\n /**\n * @inheritdoc\n */\n @Input() isRefreshDisabled: boolean;\n /**\n * @inheritdoc\n */\n @Output() onCountdownEnded = new EventEmitter<void>();\n /**\n * Emitted to indicate that the widgets realtime button state has changed.\n */\n @Output() onRealTimeToggleChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n @ViewChild(CountdownIntervalComponent, { static: false })\n countdownIntervalComponent: CountdownIntervalComponent;\n /**\n * @inheritdoc\n */\n protected hideCountdown: boolean;\n /**\n * Tooltip for a new realtime alarm indicator.\n */\n realtimeIconTitle: string;\n /**\n * Indicates whether the countdown has been cleared already.\n */\n isNewAlarmMessageCleared = true;\n /**\n * @inheritdoc\n */\n isIntervalRefreshToggleOn: boolean;\n /**\n * Indicates the current state of an realtime toggle button.\n */\n isRealtimeToggleOn: boolean;\n /**\n * Holds the subscription to a countdown observable.\n */\n countdownSubscription: Subscription;\n /**\n * @inheritdoc\n */\n protected manuallyDisabledCountdown = false;\n\n toggleCountdownButtonTooltipText: string;\n globalAutoRefreshEnabled: boolean;\n\n constructor(\n private alarmsViewService: AlarmsViewService,\n private cdRef: ChangeDetectorRef,\n private translateService: TranslateService,\n private widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService,\n protected gainsightService: GainsightService\n ) {\n super();\n }\n\n ngOnInit() {\n if (!this.isIntervalRefresh) {\n this.isRealtimeToggleOn = this.config.isAutoRefreshEnabled;\n this.realtimeIconTitle = this.getRealtimeIconTitle();\n } else {\n this.isIntervalRefreshToggleOn =\n !this.isRefreshDisabled && (this.config.isAutoRefreshEnabled || !!this.refreshInterval);\n this.updateCountdownButtonTooltipText();\n }\n }\n\n ngAfterViewInit() {\n if (this.isIntervalRefresh && this.refreshInterval) {\n this.startCountdown();\n }\n\n if (this.globalAutoRefreshEnabled) {\n this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$\n .pipe(tap(() => this.onCountdownEnded.emit()))\n .subscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const { isDisabled, config } = changes;\n if (config) {\n this.globalAutoRefreshEnabled = this.config.refreshOption === GLOBAL_INTERVAL_OPTION;\n }\n if (isDisabled) {\n this.isIntervalRefreshToggleOn =\n !this.isRefreshDisabled && (this.config.isAutoRefreshEnabled || !!this.refreshInterval);\n this.updateCountdownButtonTooltipText(gettext('Disabled'));\n }\n\n if (\n !this.isIntervalRefresh ||\n this.manuallyDisabledCountdown ||\n !this.config.isAutoRefreshEnabled\n ) {\n return;\n }\n\n this.handleScrolling();\n }\n\n ngOnDestroy() {\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n }\n\n /**\n * @inheritdoc\n */\n countdownEnded(): void {\n /**\n * @inheritdoc\n */\n this.autoRefreshList();\n }\n\n reload(): void {\n if (this.isIntervalRefresh) {\n this.autoRefreshList();\n } else {\n this.onCountdownEnded.emit();\n this.isNewAlarmMessageCleared = true;\n }\n }\n\n /**\n * Toggles the real-time state of the component.\n *\n * This method switches the `isRealtimeToggleOn` state between true and false.\n * When the state is toggled, it emits the current state through `onRealTimeToggleChanged` event.\n * It also updates the `realtimeIconTitle` based on the new state.\n */\n toggleRealtimeState(): void {\n this.isRealtimeToggleOn = !this.isRealtimeToggleOn;\n this.onRealTimeToggleChanged.emit(this.isRealtimeToggleOn);\n this.realtimeIconTitle = this.getRealtimeIconTitle();\n }\n\n /**\n * Stops the countdown and triggers a refresh action.\n * This function is responsible for halting the countdown interval component's operation.\n * After stopping the countdown, it emits an `onCountdownEnded` event.\n * This event is used to inform external components that the countdown has ended,\n * typically prompting them to reload or refresh their data.\n */\n autoRefreshList(): void {\n if (this.isIntervalRefreshToggleOn && this.config.isAutoRefreshEnabled) {\n this.countdownIntervalComponent.stop();\n }\n this.onCountdownEnded.emit();\n }\n\n /**\n * Sets the tooltip message for a new realtime alarm indicator.\n * @returns Tooltip message.\n */\n getRealtimeIconTitle(): string {\n return this.isRealtimeToggleOn\n ? this.translateService.instant(gettext('Realtime active'))\n : this.translateService.instant(gettext('Realtime inactive'));\n }\n\n /**\n * Enables and starts the countdown timer.\n *\n * This method makes the countdown visible (`hideCountdown` is set to false) and then\n * starts the countdown process. It ensures the countdown timer is updated immediately\n * by triggering change detection with `cdRef.detectChanges()` before starting the countdown.\n * This method encapsulates the logic required to initiate the countdown timer.\n */\n enableCountdown(): void {\n this.hideCountdown = false;\n // Prevents the countdown from getting stuck on an initial value.\n this.cdRef.detectChanges();\n this.startCountdown();\n }\n\n /**\n * @inheritdoc\n */\n protected updateCountdownButtonTooltipText(customText?: string): void {\n if (customText) {\n this.toggleCountdownButtonTooltipText = customText;\n return;\n }\n this.toggleCountdownButtonTooltipText = this.isIntervalRefreshToggleOn\n ? this.translateService.instant(gettext('Disable auto refresh'))\n : this.translateService.instant(gettext('Enable auto refresh'));\n }\n}\n","<div\n class=\"m-l-auto d-flex p-t-4 p-b-4\"\n *ngIf=\"!globalAutoRefreshEnabled\"\n>\n <div class=\"m-l-auto d-flex a-i-center\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"isIntervalRefresh && refreshInterval && config.isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isRefreshDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"isIntervalRefresh && refreshInterval && config.isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-alarms-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event, WIDGET_TYPE_VALUES.ALARMS)\"\n />\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"\n !isNewAlarmMessageCleared\n ? (REALTIME_UPDATE_ALARMS_MESSAGE | translate)\n : ('Refresh' | translate)\n \"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isRefreshDisabled || (isLoading | async)\"\n (click)=\"reload()\"\n data-cy=\"c8y-alarms-widget--reload-button\"\n >\n <span\n class=\"tag tag--info m-r-8\"\n *ngIf=\"!isNewAlarmMessageCleared\"\n >\n {{ 'New alarms' | translate }}\n </span>\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn input-group-btn--last\"\n *ngIf=\"!isIntervalRefresh\"\n >\n <button\n class=\"c8y-realtime btn btn-default\"\n [attr.aria-label]=\"realtimeIconTitle\"\n [tooltip]=\"realtimeIconTitle\"\n placement=\"bottom\"\n type=\"button\"\n [container]=\"'body'\"\n (click)=\"toggleRealtimeState()\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-alarms-widget--realtime-indicator\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{\n active: isRealtimeToggleOn,\n inactive: !isRealtimeToggleOn\n }\"\n ></span>\n </button>\n </div>\n </div>\n </div>\n</div>","import {\n AfterViewInit,\n Component,\n Input,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { AlarmService, IAlarm, IResult, IResultList } from '@c8y/client';\nimport {\n AlarmRealtimeService,\n AlarmWithChildrenRealtimeService,\n AlertService,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n gettext,\n globalAutoRefreshLoading,\n WidgetGlobalAutoRefreshService\n} from '@c8y/ngx-components';\nimport {\n AlarmsViewService,\n AlarmsListComponent,\n AlarmsDateFilterComponent\n} from '@c8y/ngx-components/alarms';\nimport { isEmpty, isEqual } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { skip, takeUntil, tap } from 'rxjs/operators';\nimport {\n ASSET_ALARMS_WIDGET_ID,\n AlarmListWidgetConfig,\n RECENT_ALARMS_WIDGET_ID\n} from '../alarm-list-widget.model';\nimport { AlarmWidgetService } from '../alarm-widget.service';\nimport { AlarmWidgetAlarmsReloadComponent } from '../alarm-widget-alarms-reload.component';\nimport { Interval } from '@c8y/ngx-components/interval-picker';\nimport { NgIf, AsyncPipe } from '@angular/common';\n\n/**\n * To ensure backward compatibility, legacy widgets will be converted to the new implementation.\n */\n@Component({\n selector: 'c8y-alarm-list-widget',\n templateUrl: './alarm-list-widget.component.html',\n providers: [AlarmRealtimeService, AlarmWithChildrenRealtimeService],\n imports: [\n AlarmsListComponent,\n NgIf,\n AlarmsDateFilterComponent,\n AlarmWidgetAlarmsReloadComponent,\n AsyncPipe\n ]\n})\nexport class AlarmListWidgetComponent\n implements OnInit, AfterViewInit, OnDestroy, DynamicComponent\n{\n /**\n * Alarm widget config.\n */\n @Input() config: AlarmListWidgetConfig;\n /**\n * Represents current alarms.\n */\n alarms$: BehaviorSubject<IResultList<IAlarm> | null> = new BehaviorSubject(null);\n /**\n * Current isLoading state. Based on it next countdown cycle is being started.\n */\n isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(true);\n /**\n * State of this boolean depends on an Application Options \"alarmsRefreshType\" setting.\n */\n isIntervalRefresh: boolean;\n /**\n * Current refresh interval set in a widget config.\n */\n refreshInterval: number;\n\n @ViewChild(AlarmWidgetAlarmsReloadComponent)\n alarmWidgetAlarmsReloadComp: AlarmWidgetAlarmsReloadComponent;\n alerts: DynamicComponentAlertAggregator;\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 private destroy$: Subject<void> = new Subject();\n isDisabled = false;\n\n constructor(\n private alarmWidgetService: AlarmWidgetService,\n private alarmRealtimeService: AlarmRealtimeService,\n private alarmService: AlarmService,\n private alarmsViewService: AlarmsViewService,\n private alarmWithChildrenRealtimeService: AlarmWithChildrenRealtimeService,\n private dashboardChild: DashboardChildComponent,\n private alertService: AlertService,\n private widgetGlobalAutoRefresh: WidgetGlobalAutoRefreshService\n ) {\n this.isIntervalRefresh = this.alarmsViewService.isIntervalRefresh();\n }\n\n async ngOnInit(): Promise<void> {\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n if (this.alarmWidgetService.isOldAlarmConfigStructure(this.config)) {\n const mappedConfig = this.alarmWidgetService.mapToNewConfigStructure(\n this.config,\n this.isIntervalRefresh\n );\n Object.assign(this.config, mappedConfig);\n }\n\n if (this.config.widgetInstanceGlobalAutoRefreshContext && !this.config.isRealtime) {\n this.handleGlobalRefreshLoading();\n }\n const _config = this.dashboardChild['data']?.config;\n const isLegacyWidgetWithoutConfiguration =\n isEmpty(_config) ||\n isEqual(_config, { displaySettings: { globalAutoRefreshContext: true } }) ||\n isEqual(_config, {\n displaySettings: { globalAutoRefreshContext: true },\n device: _config.device\n });\n\n if (isLegacyWidgetWithoutConfiguration) {\n this.setLegacyRecentOrCriticalAlarmWidgetConfig();\n }\n\n this.updateWidgetRefreshMode();\n this.refreshInterval = !!this.config?.refreshInterval && this.config?.refreshInterval;\n await this.fetchAlarms();\n }\n\n ngAfterViewInit(): void {\n if (!this.isIntervalRefresh && this.config.refreshOption === 'interval') {\n this.handleRealtimeAlarms(this.config, this.alarmWidgetAlarmsReloadComp.isRealtimeToggleOn);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes?.config?.currentValue?.date) {\n this.config.dateFilter = changes.config.currentValue.date;\n }\n }\n\n ngOnDestroy(): void {\n if (this.config.isRealtime) {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.config.widgetInstanceGlobalAutoRefreshContext && this.isLoading$.value) {\n this.widgetGlobalAutoRefresh.decrementLoading();\n }\n }\n\n async fetchAlarms(): Promise<void> {\n this.updateDateFilter();\n this.alarms$.next(await this.getAlarms());\n }\n\n async onDateFilterChange(event: {\n selectedDates: [Date, Date];\n interval: Interval['id'];\n }): Promise<void> {\n this.config.dateFilter = event.selectedDates;\n this.config.interval = event.interval;\n await this.fetchAlarms();\n }\n\n handleRealTimeToggleChange(isRealtimeToggleOn: boolean): void {\n if (!isRealtimeToggleOn) {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n this.unsubscribe$ = new Subject();\n this.handleRealtimeAlarms(this.config, isRealtimeToggleOn);\n }\n\n /**\n * Updates the widget's date filter based on the currently selected interval.\n * If the interval is set to last hour, we will configure the date filter to dynamically show alarms only from the last hour.\n */\n private updateDateFilter(): void {\n if (this.config.interval === 'custom' || this.config.widgetInstanceGlobalTimeContext) {\n return;\n }\n\n if (!this.config.interval) {\n this.config.interval = 'none';\n }\n\n this.config.dateFilter = this.alarmsViewService.getDateTimeContextByInterval(\n this.config.interval\n );\n }\n\n /**\n * Updates the widget's refresh mode based on the current configuration and the interval refresh setting.\n * If the widget's 'isRealtime' configuration differs from the current global interval refresh setting (application options setting),\n * the widget's mode is updated to either 'realtime' or 'interval'. In 'realtime' mode, the refresh interval is null,\n * and in 'interval' mode, it is set to the default interval value.\n */\n private updateWidgetRefreshMode(): void {\n const isRefreshTypeSwitched = !!this.config.isRealtime !== !this.isIntervalRefresh;\n if (!isRefreshTypeSwitched) {\n return;\n }\n\n this.config.isRealtime = !this.isIntervalRefresh;\n\n if (this.config.isRealtime) {\n // Switching widget to realtime mode\n this.config.refreshInterval = null;\n this.config.refreshOption = null;\n this.config.widgetInstanceGlobalAutoRefreshContext = false;\n this.config.isAutoRefreshEnabled = true;\n } else {\n // Switching widget to interval mode\n this.config.refreshInterval = this.alarmsViewService.DEFAULT_INTERVAL_VALUE;\n this.config.refreshOption = this.alarmsViewService.DEFAULT_REFRESH_OPTION_VALUE;\n this.config.widgetInstanceGlobalAutoRefreshContext = false;\n }\n }\n\n private async getAlarms(): Promise<IResultList<IAlarm>> {\n try {\n this.isLoading$.next(true);\n return await this.alarmService.list(\n this.alarmWidgetService.mapConfigToQueryFilter(this.config)\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.isDisabled = true;\n return;\n }\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n /**\n * Handles the realtime updates of alarms based on the widget configuration.\n * If a specific device is provided in the widget configuration, all alarms\n * originating from that device and its children are filtered based on status, severity, and type.\n * Otherwise, it processes all incoming alarms and filters them according to status, severity, and type,\n * as specified in the widget configuration. If new alarms meet the specified criteria, it sets a flag\n * to indicate the presence of new alarms.\n *\n * @param config - The configuration settings of the alarm list widget.\n * @param isRealtimeToggleOn - A flag indicating whether the realtime toggle is on. If true, the alarm list will be refreshed.\n * If false, the presence of new alarms will be displayed as \"New Alarms\" entry on widget refresh button, but the list won't be refreshed automatically.\n */\n private handleRealtimeAlarms(config: AlarmListWidgetConfig, isRealtimeToggleOn: boolean): void {\n const callback = (data: number | IAlarm) => {\n if (\n this.alarmWidgetService.filterAlarmsByStatusSeverityAndType(\n data,\n this.alarms$.value.data,\n config\n )\n ) {\n if (isRealtimeToggleOn) {\n this.fetchAlarms();\n this.alarmWidgetAlarmsReloadComp.isNewAlarmMessageCleared = true;\n } else {\n this.alarmWidgetAlarmsReloadComp.isNewAlarmMessageCleared = false;\n }\n }\n };\n\n if (this.config.device) {\n this.handleRealtime(\n this.alarmWithChildrenRealtimeService.onAll$.bind(this.alarmWithChildrenRealtimeService),\n callback\n );\n } else {\n this.handleRealtime(\n this.alarmRealtimeService.onAll$.bind(this.alarmRealtimeService),\n callback\n );\n }\n }\n\n /**\n * Sets up a subscription to a realtime data stream. This function takes a subscriber function,\n * which is used to subscribe to the data stream, and a callback function, which is called with each\n * data update received from the stream.\n *\n * @param subscriberFn - A function that returns an observable stream of alarm data.\n * @param callback - A function to be executed with each alarm data update.\n */\n private handleRealtime(\n subscriberFn: (id?: string) => Observable<IResult<IAlarm>>,\n callback: (data: IAlarm) => void\n ): void {\n subscriberFn(this.config.device?.id)\n .pipe(\n tap(({ data }) => {\n callback(data);\n }),\n takeUntil(this.unsubscribe$)\n )\n .subscribe();\n }\n\n private setLegacyRecentOrCriticalAlarmWidgetConfig(): void {\n const widgetId = this.dashboardChild['data']?.componentId\n ? this.dashboardChild['data']?.componentId //property is used in cockpit dashboards\n : this.dashboardChild['data']?.name; //property is used in device management dashboards\n\n if (widgetId === RECENT_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n this.isIntervalRefresh,\n RECENT_ALARMS_WIDGET_ID\n );\n Object.assign(this.config, predefinedConfig);\n\n return;\n }\n\n if (widgetId === ASSET_ALARMS_WIDGET_ID) {\n const predefinedConfig = this.alarmWidgetService.getPredefinedConfiguration(\n this.isIntervalRefresh\n );\n Object.assign(this.config, predefinedConfig);\n }\n }\n\n private handleGlobalRefreshLoading(): void {\n this.isLoading$\n .pipe(\n skip(1),\n globalAutoRefreshLoading(this.widgetGlobalAutoRefresh),\n takeUntil(this.destroy$)\n )\n .subscribe();\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]=\"!isDisabled\"\n>\n <c8y-alarms-date-filter\n *ngIf=\"config.displayDateSelection\"\n [updateQueryParams]=\"false\"\n [date]=\"this.config.dateFilter\"\n [DEFAULT_INTERVAL]=\"config.interval || 'none'\"\n (dateFilterChange)=\"onDateFilterChange($event)\"\n ></c8y-alarms-date-filter>\n <c8y-alarm-widget-alarms-reload\n class=\"d-contents\"\n [isIntervalRefresh]=\"isIntervalRefresh\"\n [refreshInterval]=\"refreshInterval\"\n [config]=\"config\"\n [isLoading]=\"isLoading$\"\n [isScrolling]=\"list.isScrolling\"\n [isRefreshDisabled]=\"isDisabled\"\n (onCountdownEnded)=\"fetchAlarms()\"\n (onRealTimeToggleChanged)=\"handleRealTimeToggleChange($event)\"\n ></c8y-alarm-widget-alarms-reload>\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 { AlarmWidgetAlarmsReloadComponent } from './alarm-widget-alarms-reload.component';\nimport { SortingDescriptionPopoverMessagePipe } from './sorting-description-popover-message.pipe';\nimport { SeverityIconPipe } from './severity-icon.pipe';\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 AlarmWidgetAlarmsReloadComponent,\n SeverityIconPipe,\n SortingDescriptionPopoverMessagePipe\n ]\n})\nexport class AlarmsWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AlarmWidgetService","i3","i4","i2","FormsModule","NgCommonModule","NgFormsModule"],"mappings":"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"}
|