@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-datapoints-table.mjs","sources":["../../widgets/implementations/datapoints-table/datapoints-table-widget.model.ts","../../widgets/implementations/datapoints-table/datapoints-table.service.ts","../../widgets/implementations/datapoints-table/date-range-picker.component.ts","../../widgets/implementations/datapoints-table/date-range-picker.component.html","../../widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.html","../../widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.html","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.html","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.html","../../widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.ts"],"sourcesContent":["import { IFetchResponse, ISeries } from '@c8y/client';\nimport { AggregationOption, gettext } from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { MinMaxValues, SourceId, TimeStamp } from '@c8y/ngx-components/datapoints-export-selector';\nimport { Interval, INTERVAL_VALUES } from '@c8y/ngx-components/interval-picker';\n\nexport const DEFAULT_DPT_REFRESH_INTERVAL_VALUE = 30_000;\n\nexport type DatapointTableMapKey = `${TimeStamp}_${DeviceName}`;\n/**\n * Represents a mapping where the key is a datapoint identifier containing the date and device name, and the value is an array of data point table items or null.\n */\nexport type DataPointsTableMap = Map<DatapointTableMapKey, (DatapointTableItem | null)[]>;\n\ntype DeviceName = string;\n\n/**\n * Represents a map of datapoints series data.\n * The key of the map is a source, and the value is the data for requested series.\n */\nexport type DatapointsSeriesDataMap = Map<SourceId, ISeries>;\n/**\n * Determines which values will be displayed as values for datapoints.\n * e.g. if user chose 'min', only the minimum values will be displayed.\n */\nexport type RenderType = keyof typeof RENDER_TYPES_LABELS;\n/**\n * Represents an object where key is a timestamp and value is an array\n * where first record contains min and max values for a corresponding timestamp.\n */\nexport type MeasurementRanges = {\n [key: TimeStamp]: Array<MinMaxValues>;\n};\n/**\n * Represents a value object where key is an object with min and max properties with its corresponding values.\n */\nexport type Value = {\n [key in keyof MinMaxValues]: number;\n};\n\nexport const DATE_SELECTION_VALUES = {\n dashboard_context: 'dashboard_context',\n config: 'config',\n view_and_config: 'view_and_config'\n} as const;\n\nexport const DATE_SELECTION_VALUES_ARR = [\n DATE_SELECTION_VALUES.dashboard_context,\n DATE_SELECTION_VALUES.config,\n DATE_SELECTION_VALUES.view_and_config\n] as const;\n\nexport const DATE_SELECTION_LABELS = {\n config: gettext('Widget configuration') as 'Widget configuration',\n view_and_config: gettext('Widget and widget configuration') as 'Widget and widget configuration',\n dashboard_context: gettext('Dashboard time range') as 'Dashboard time range'\n} as const;\n\nexport const REFRESH_INTERVAL_VALUES_ARR = [5_000, 10_000, 15_000, 30_000, 60_000];\n\nexport const RENDER_TYPES_LABELS = {\n min: gettext('Minimum') as 'Minimum',\n max: gettext('Maximum') as 'Maximum',\n area: gettext('Area') as 'Area'\n} as const;\n\nexport const INTERVAL_VALUES_ARR = [\n INTERVAL_VALUES.minutes,\n INTERVAL_VALUES.hours,\n INTERVAL_VALUES.days,\n INTERVAL_VALUES.weeks,\n INTERVAL_VALUES.months,\n INTERVAL_VALUES.custom\n] as const;\n\nexport const TIME_RANGE_INTERVAL_LABELS = {\n minutes: gettext('Last minute') as 'Last minute',\n hours: gettext('Last hour') as 'Last hour',\n days: gettext('Last day') as 'Last day',\n weeks: gettext('Last week') as 'Last week',\n months: gettext('Last month') as 'Last month',\n custom: gettext('Custom') as 'Custom'\n} as const;\n\nexport const DURATION_OPTIONS = [\n {\n id: INTERVAL_VALUES.minutes,\n label: TIME_RANGE_INTERVAL_LABELS.minutes,\n unit: INTERVAL_VALUES.minutes,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.hours,\n label: TIME_RANGE_INTERVAL_LABELS.hours,\n unit: INTERVAL_VALUES.hours,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.days,\n label: TIME_RANGE_INTERVAL_LABELS.days,\n unit: INTERVAL_VALUES.days,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.weeks,\n label: TIME_RANGE_INTERVAL_LABELS.weeks,\n unit: INTERVAL_VALUES.weeks,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.months,\n label: TIME_RANGE_INTERVAL_LABELS.months,\n unit: INTERVAL_VALUES.months,\n amount: 1\n },\n { id: INTERVAL_VALUES.custom, label: TIME_RANGE_INTERVAL_LABELS.custom }\n];\n\nexport interface ColorRangeBoundaries {\n yellowRangeMin: number;\n yellowRangeMax: number;\n redRangeMin: number;\n redRangeMax: number;\n}\n\nexport interface DatapointWithValues extends KPIDetails {\n seriesUnit?: string;\n values: MeasurementRanges;\n}\n\nexport interface Duration {\n id: string;\n label: string;\n unit?: string;\n amount?: number;\n}\n\nexport interface TableColumnHeader {\n deviceName: string;\n label: string;\n renderType: string;\n unit: string;\n}\n\nexport interface DateRange {\n dateFrom: string;\n dateTo: string;\n}\n\nexport interface DatapointsTableConfig {\n aggregation?: AggregationOption | null;\n context?: number;\n datapoints: KPIDetails[];\n /**\n * Array that contains global time context dateFrom and dateTo.\n */\n date?: string[];\n dateFrom: string;\n dateTo: string;\n decimalPlaces?: number;\n displayDateSelection: boolean;\n displaySettings: {\n globalTimeContext: boolean;\n globalRealtimeContext: boolean;\n globalAggregationContext: boolean;\n globalAutoRefreshContext: boolean;\n };\n interval: Interval['id'];\n isAutoRefreshEnabled: boolean;\n realtime: boolean;\n refreshInterval?: number;\n selected?: object | null;\n widgetInstanceGlobalTimeContext?: boolean | null;\n widgetInstanceGlobalAutoRefreshContext: boolean;\n globalDateSelector?: keyof typeof DATE_SELECTION_VALUES;\n sliderChange?: boolean | null;\n}\n\nexport interface DatapointTableItem {\n dateAndTime: string;\n deviceName: string;\n fragment: string;\n label: string;\n redRangeMax?: number;\n redRangeMin?: number;\n renderType: string;\n series: string;\n value: Value;\n yellowRangeMax?: number;\n yellowRangeMin?: number;\n}\n\nexport interface GroupedDatapointTableItem {\n dateAndTime: string;\n deviceName: string;\n rowItems: ({\n fragment: string;\n label: string;\n redRangeMax?: number;\n redRangeMin?: number;\n renderType: string;\n series: string;\n value: Value;\n yellowRangeMax?: number;\n yellowRangeMin?: number;\n } | null)[];\n}\n\nexport interface SeriesDataWithResponse {\n source: SourceId;\n data: ISeries;\n res: IFetchResponse;\n}\n","import { Injectable } from '@angular/core';\nimport { DataFetchingService } from '@c8y/ngx-components/datapoints-export-selector';\nimport { INTERVAL_VALUES, Interval } from '@c8y/ngx-components/interval-picker';\nimport { DateRange } from './datapoints-table-widget.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsTableService {\n constructor(private dataFetchingService: DataFetchingService) {}\n\n calculateDateRange(interval: Interval['id']): DateRange {\n const now = new Date();\n const nowString = now.toISOString();\n\n let dateFrom: string;\n\n switch (interval) {\n case INTERVAL_VALUES.minutes:\n dateFrom = this.dataFetchingService.adjustDate(nowString, -1, true);\n break;\n case INTERVAL_VALUES.hours:\n const minutesInAnHourNegative = -60;\n dateFrom = this.dataFetchingService.adjustDate(nowString, minutesInAnHourNegative, true);\n break;\n case INTERVAL_VALUES.days:\n const minutesInADayNegative = -24 * 60;\n dateFrom = this.dataFetchingService.adjustDate(nowString, minutesInADayNegative, true);\n break;\n case INTERVAL_VALUES.weeks:\n const minutesInAWeekNegative = -7 * 24 * 60;\n dateFrom = this.dataFetchingService.adjustDate(nowString, minutesInAWeekNegative, true);\n break;\n case INTERVAL_VALUES.months:\n const oneMonthAgo = new Date(now);\n oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);\n dateFrom = this.dataFetchingService.adjustDate(oneMonthAgo.toISOString(), 0, true);\n break;\n default:\n throw new Error('Invalid time interval');\n }\n\n return {\n dateFrom: dateFrom,\n dateTo: this.dataFetchingService.adjustDate(nowString, 0, true)\n };\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n Output\n} from '@angular/core';\nimport { ControlContainer, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CoreModule, gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n standalone: true,\n imports: [CoreModule, CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n viewProviders: [\n {\n provide: ControlContainer,\n useFactory: () => inject(ControlContainer, { skipSelf: true })\n }\n ]\n})\nexport class DateRangePickerComponent {\n /**\n * If set to true, the component will be reactive and will emit the updatedDate on every change.\n * Otherwise, the component will use a non emitting variant of a template.\n */\n @Input() isEmittingDateChange = false;\n /**\n * Determines the display of from and to date picker labels.\n */\n @Input() showLabel = true;\n @Output() updatedDate: EventEmitter<{\n dateFrom?: string | null;\n dateTo?: string | null;\n }> = new EventEmitter<{\n dateFrom?: string | null;\n dateTo?: string | null;\n }>();\n\n readonly DATE_FROM = 'dateFrom';\n readonly DATE_TO = 'dateTo';\n readonly FROM_DATE = gettext('From`date`');\n readonly HAS_ERROR = 'has-error';\n readonly INVALID_DATE_TIME = 'invalidDateTime';\n readonly THIS_DATE_IS_INVALID = gettext('This date is invalid.');\n readonly THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE = gettext(\n 'This date is after the latest allowed date.'\n );\n readonly THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE = gettext(\n 'This date is before the earliest allowed date.'\n );\n readonly TO_DATE = gettext('To`date`');\n private parentContainer = inject(ControlContainer);\n\n onDateFromChange(dateFrom: string) {\n this.updatedDate.emit({\n dateFrom\n });\n }\n\n onDateToChange(dateTo: string) {\n this.updatedDate.emit({\n dateTo\n });\n }\n\n get parentFormGroup() {\n return this.parentContainer.control as FormGroup;\n }\n}\n","<div class=\"d-flex gap-8 a-i-center flex-wrap\">\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n class=\"form-group-sm\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"FROM_DATE | translate\"\n [for]=\"DATE_FROM\"\n >\n {{ FROM_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_FROM\"\n [maxDate]=\"parentFormGroup?.value.dateTo\"\n [placeholder]=\"FROM_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateFrom\"\n [ngClass]=\"parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateFromChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages\n class=\"text-nowrap\"\n [show]=\"parentFormGroup?.controls.dateFrom.errors\"\n >\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n class=\"form-group-sm\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"TO_DATE | translate\"\n [for]=\"DATE_TO\"\n >\n {{ TO_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_TO\"\n [minDate]=\"parentFormGroup?.value.dateFrom\"\n [placeholder]=\"TO_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateTo\"\n [ngClass]=\"parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateToChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"parentFormGroup?.controls.dateTo.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n</div>\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport {\n AbstractControl,\n FormBuilder,\n FormControl,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n AGGREGATION_LABELS,\n AGGREGATION_VALUES,\n AGGREGATION_VALUES_ARR,\n AggregationOption,\n AggregationOptionStatus,\n AggregationService,\n CoreModule\n} from '@c8y/ngx-components';\nimport { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';\nimport {\n DatapointAttributesFormConfig,\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport { dateRangeValidator } from '@c8y/ngx-components/datapoints-export-selector';\nimport { Interval, INTERVAL_VALUES } from '@c8y/ngx-components/interval-picker';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { merge, Subject, takeUntil } from 'rxjs';\nimport {\n DatapointsTableConfig,\n DATE_SELECTION_LABELS,\n DATE_SELECTION_VALUES,\n DATE_SELECTION_VALUES_ARR,\n DateRange,\n DEFAULT_DPT_REFRESH_INTERVAL_VALUE,\n INTERVAL_VALUES_ARR,\n REFRESH_INTERVAL_VALUES_ARR,\n TIME_RANGE_INTERVAL_LABELS\n} from '../datapoints-table-widget.model';\nimport { DatapointsTableService } from '../datapoints-table.service';\nimport { DateRangePickerComponent } from '../date-range-picker.component';\n\nexport function minOneDatapointActive(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const datapoints: KPIDetails[] = control.value;\n\n if (!datapoints || !datapoints.length) {\n return null;\n }\n\n const activeDatapoints = datapoints.filter(datapoint => datapoint.__active);\n\n if (activeDatapoints.length >= 1) {\n return null;\n }\n return { exactlyOneDatapointNeedsToBeActive: true };\n };\n}\n\n@Component({\n selector: 'c8y-datapoints-table-view-config',\n templateUrl: './datapoints-table-config.component.html',\n standalone: true,\n imports: [\n CoreModule,\n DatapointSelectorModule,\n DateRangePickerComponent,\n PopoverModule,\n ReactiveFormsModule\n ]\n})\nexport class DatapointsTableWidgetConfigComponent implements OnInit, OnDestroy {\n /**\n * Data points table widget config.\n */\n @Input() config: DatapointsTableConfig;\n\n readonly AGGREGATION_LABELS = AGGREGATION_LABELS;\n readonly DATE_SELECTION_LABELS = DATE_SELECTION_LABELS;\n readonly DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.dashboard_context;\n readonly DEFAULT_INTERVAL_VALUE = INTERVAL_VALUES.hours;\n readonly TIME_RANGE_INTERVAL_LABELS = TIME_RANGE_INTERVAL_LABELS;\n\n readonly AGGREGATION_VALUES_ARR = AGGREGATION_VALUES_ARR;\n readonly DATE_SELECTION_VALUES_ARR = DATE_SELECTION_VALUES_ARR;\n readonly INTERVAL_VALUES_ARR = INTERVAL_VALUES_ARR;\n readonly REFRESH_INTERVAL_VALUES_ARR = REFRESH_INTERVAL_VALUES_ARR;\n\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n disabledAggregationOptions: AggregationOptionStatus = {};\n defaultFormOptions: Partial<DatapointAttributesFormConfig> = {\n selectableChartLineTypes: [],\n selectableAxisTypes: [],\n showRedRange: true,\n showYellowRange: true\n };\n formGroup: ReturnType<DatapointsTableWidgetConfigComponent['createForm']>;\n isWidgetLinkedToGlobalTimeContext: boolean;\n\n private decimalLimits = {\n numberOfDecimalPlacesMin: 0,\n numberOfDecimalPlacesMax: 10\n } as const;\n\n /**\n * Indicate when the time interval selector item has been changed programmatically.\n *\n * This property is used to track changes in the time interval selector\n * that are not triggered by direct user interaction, but by the application itself.\n *\n * In our case, the date selector and the interval selector are linked.\n * So, when one of them changes, it affects the other.\n * For example, selecting \"Last hour\" in the interval selector should automatically update the date range to the last hour.\n * But without this flag, changing the date range would also update the interval selector, resulting in \"Custom date\" being selected.\n * This happens because the system would interpret the behavior this way.\n */\n private isIntervalSelectorChangedProgrammatically = false;\n private destroy$ = new Subject<void>();\n\n constructor(\n private aggregationService: AggregationService,\n private datapointsTableService: DatapointsTableService,\n private formBuilder: FormBuilder,\n private form: NgForm,\n private widgetConfig: WidgetConfigComponent\n ) {}\n\n ngOnInit(): void {\n if (this.widgetConfig.context?.id) {\n this.datapointSelectionConfig.contextAsset = this.widgetConfig?.context;\n }\n\n this.isWidgetLinkedToGlobalTimeContext =\n this.config.widgetInstanceGlobalAutoRefreshContext ?? true;\n\n this.initForm();\n\n this.handleAutoRefreshToggleChanges();\n this.handleIntervalSelectorChanges();\n this.handleDateSelectorChanges();\n this.handleGlobalDateSelectorChanges();\n\n this.updateDisabledAggregationOptions();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: DatapointsTableConfig): void {\n if (\n this.formGroup.value.aggregation === AGGREGATION_VALUES.none ||\n (!this.formGroup.value.aggregation && config.aggregation === AGGREGATION_VALUES.none)\n ) {\n // The 'NONE' aggregation type is not handled by a backend, so it simply needs to be deleted to get data without aggregation.\n this.deleteAggregationProperty(config);\n }\n this.updateTimeContext(config, this.formGroup.value.globalDateSelector);\n Object.assign(config, this.formGroup.value);\n }\n\n toggleRefreshIntervalControl(): void {\n this.formGroup.controls.isAutoRefreshEnabled.value\n ? this.formGroup.controls.refreshInterval.disable()\n : this.formGroup.controls.refreshInterval.enable();\n }\n\n private updateTimeContext(config: DatapointsTableConfig, selectedDateContext: string): void {\n switch (selectedDateContext) {\n case DATE_SELECTION_VALUES.dashboard_context:\n config.displayDateSelection = false;\n config.widgetInstanceGlobalAutoRefreshContext = true;\n if (config.aggregation !== 'NONE') {\n this.deleteAggregationProperty(config);\n }\n break;\n case DATE_SELECTION_VALUES.view_and_config:\n config.displayDateSelection = true;\n config.widgetInstanceGlobalAutoRefreshContext = false;\n break;\n case DATE_SELECTION_VALUES.config:\n default:\n config.displayDateSelection = false;\n config.widgetInstanceGlobalAutoRefreshContext = false;\n }\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n // When the 'NONE' aggregation is removed at the 'onBeforeSave' block,\n // and a Global Date Context forces widgets auto refresh to be enabled\n // then, the aggregation selector will be empty on initial load.\n this.config.aggregation = this.config.aggregation ?? AGGREGATION_VALUES.none;\n\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private createForm() {\n const { dateFrom, dateTo } = this.datapointsTableService.calculateDateRange(\n this.DEFAULT_INTERVAL_VALUE\n );\n const isLegacyWidget =\n this.config.hasOwnProperty('widgetInstanceGlobalTimeContext') &&\n !this.config.hasOwnProperty('decimalPlaces');\n\n return this.formBuilder.group(\n {\n aggregation: new FormControl({\n value: AGGREGATION_VALUES.none as AggregationOption,\n disabled: !this.isAutoRefershDisabled()\n }),\n datapoints: this.formBuilder.control(new Array<KPIDetails>(), [\n Validators.required,\n Validators.minLength(1),\n minOneDatapointActive()\n ]),\n globalDateSelector: new FormControl(\n isLegacyWidget\n ? this.determineGlobalDateSelectorValueForLegacyWidget()\n : this.DEFAULT_DATE_SELECTOR_VALUE\n ),\n dateFrom: new FormControl(dateFrom),\n dateTo: new FormControl(dateTo),\n decimalPlaces: [\n 2,\n [\n Validators.required,\n Validators.min(this.decimalLimits.numberOfDecimalPlacesMin),\n Validators.max(this.decimalLimits.numberOfDecimalPlacesMax),\n Validators.pattern('^[0-9]+$')\n ]\n ],\n interval: new FormControl(this.DEFAULT_INTERVAL_VALUE as Interval['id']),\n isAutoRefreshEnabled: isLegacyWidget ? this.config.realtime : [true],\n refreshInterval: new FormControl({\n value: DEFAULT_DPT_REFRESH_INTERVAL_VALUE,\n disabled: this.isAutoRefershDisabled()\n })\n },\n { validators: dateRangeValidator }\n );\n }\n\n private determineGlobalDateSelectorValueForLegacyWidget(): string {\n const { displayDateSelection, widgetInstanceGlobalAutoRefreshContext } = this.config;\n\n // State of widgetInstanceGlobalTimeContext was converted to widgetInstanceGlobalAutoRefreshContext.\n // That is why it use here in a legacy widget context.\n if (widgetInstanceGlobalAutoRefreshContext) {\n return DATE_SELECTION_VALUES.dashboard_context;\n }\n\n return displayDateSelection\n ? DATE_SELECTION_VALUES.view_and_config\n : DATE_SELECTION_VALUES.config;\n }\n\n private isAutoRefershDisabled(): boolean {\n const isInitialWidgetCreation =\n Object.keys(this.config).length === 1 && this.config['settings'];\n\n if (isInitialWidgetCreation) {\n return false;\n }\n\n const isLegacyWidgetRealtimeNotActive =\n !this.config.realtime &&\n !this.config.hasOwnProperty('decimalPlaces') &&\n !this.config.hasOwnProperty('refreshInterval') &&\n !this.config.hasOwnProperty('isAutoRefreshEnabled');\n\n if (isLegacyWidgetRealtimeNotActive) {\n return true;\n }\n\n return !this.config.isAutoRefreshEnabled;\n }\n\n /**\n * Handles changes to the auto-refresh toggle control and updates the aggregation control accordingly.\n *\n * This method subscribes to the value changes of the auto-refresh toggle form control.\n * When auto-refresh is enabled, the aggregation control's value is set to 'none' and the control is\n * visually disabled (but not programmatically disabled to ensure the value is saved).\n * When auto-refresh is disabled, the aggregation control is enabled.\n */\n private handleAutoRefreshToggleChanges(): void {\n this.formGroup.controls.isAutoRefreshEnabled.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((isAutoRefreshEnabled: boolean) => {\n const aggregationControl = this.formGroup.controls.aggregation;\n if (isAutoRefreshEnabled) {\n aggregationControl.setValue(AGGREGATION_VALUES.none);\n // Do not disable the control programmatically to ensure the value is saved.\n } else {\n aggregationControl.enable();\n }\n });\n }\n\n /**\n * Handles changes in the interval selector form control.\n */\n private handleIntervalSelectorChanges(): void {\n this.formGroup.controls.interval.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((selectedInterval: Interval['id']) => {\n if (selectedInterval === INTERVAL_VALUES.custom) {\n this.updateDisabledAggregationOptions();\n return;\n }\n\n this.handleNonCustomInterval(selectedInterval);\n });\n }\n\n private handleNonCustomInterval(selectedInterval: Interval['id']): void {\n this.isIntervalSelectorChangedProgrammatically = true;\n this.updateDateRange(selectedInterval);\n this.updateDisabledAggregationOptions();\n this.updateAggregationIfAutoRefreshDisabled(selectedInterval);\n }\n\n private updateDateRange(selectedInterval: Interval['id']): void {\n const dateRange: DateRange = this.datapointsTableService.calculateDateRange(selectedInterval);\n this.formGroup.controls.dateTo.setValue(dateRange.dateTo);\n\n // MTM-61351\n // Use requestAnimationFrame to queue the dateFrom update.\n // This prevents timing issues where rapid setValue calls might\n // cause the view to go out of sync with form control values,\n // especially during the first change after initialization.\n // requestAnimationFrame(() => {\n /**\n * Without this requestAnimationFrame or setTimeout, dateFrom won't change to a correct value after first selector change.\n * When form is saved it saves with a correct value, even without with this fix.\n * How to reproduce:\n * 1. set date values to e.g.: 01.05.2024-30.05.2024 and save it\n * 2. reopen a config and switch interval to last month\n */\n // This fix brakes a logic behind disabling non available aggregations.\n // Form will be still saved with correct date value, only view is out of a sync.\n this.formGroup.controls.dateFrom.setValue(dateRange.dateFrom);\n this.isIntervalSelectorChangedProgrammatically = false;\n // });\n }\n\n private updateDisabledAggregationOptions(): void {\n this.disabledAggregationOptions = this.aggregationService.getDisabledAggregationOptions(\n this.formGroup.controls.dateFrom.value,\n this.formGroup.controls.dateTo.value\n );\n }\n\n private updateAggregationIfAutoRefreshDisabled(selectedInterval: Interval['id']): void {\n const isAutoRefreshDisabled = !this.formGroup.controls.isAutoRefreshEnabled.value;\n if (isAutoRefreshDisabled) {\n this.setAggregationValue(selectedInterval);\n }\n }\n\n private setAggregationValue(interval: Interval['id']): void {\n const aggregationControl = this.formGroup.controls.aggregation;\n\n const newAggregationValue = this.aggregationService.determineAggregationValue(interval);\n aggregationControl.setValue(newAggregationValue);\n }\n\n /**\n * Handles changes in the date selector form control.\n */\n private handleDateSelectorChanges(): void {\n merge(\n this.formGroup.controls.dateFrom.valueChanges,\n this.formGroup.controls.dateTo.valueChanges\n )\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.handleDateChange());\n }\n\n private handleDateChange(): void {\n if (this.isIntervalSelectorChangedProgrammatically) {\n return;\n }\n\n const intervalControl = this.formGroup.controls.interval;\n if (intervalControl.value === INTERVAL_VALUES.custom) {\n this.handleCustomIntervalDateChange();\n } else {\n this.setIntervalToCustom(intervalControl);\n }\n this.setToFirstAvailableAggregationOptionIfCurrentAggregationIsDisabled();\n }\n\n private handleCustomIntervalDateChange(): void {\n this.updateDisabledAggregationOptions();\n }\n\n private setIntervalToCustom(intervalControl: AbstractControl): void {\n intervalControl.setValue(INTERVAL_VALUES.custom);\n }\n\n /**\n * Handles changes in the global date selector form control.\n */\n private handleGlobalDateSelectorChanges(): void {\n this.formGroup.controls.globalDateSelector.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((selected: string) => {\n if (selected === DATE_SELECTION_VALUES.dashboard_context) {\n this.handleDashboardContext();\n } else {\n this.handleNonDashboardContext();\n }\n });\n }\n\n private handleDashboardContext(): void {\n this.isWidgetLinkedToGlobalTimeContext = true;\n }\n\n private handleNonDashboardContext(): void {\n this.isWidgetLinkedToGlobalTimeContext = false;\n\n if (this.isConfigSavedWithoutDashboardTimeOption()) {\n return;\n }\n\n this.updateAggregationIfNecessary();\n this.setIntervalToCustom(this.formGroup.controls.interval);\n }\n\n private isConfigSavedWithoutDashboardTimeOption(): boolean {\n return !this.config.widgetInstanceGlobalAutoRefreshContext;\n }\n\n private updateAggregationIfNecessary(): void {\n const aggregationControl = this.formGroup.controls.aggregation;\n const isDashboardTimeOptionSetAggregationToNull = !aggregationControl.value;\n\n if (isDashboardTimeOptionSetAggregationToNull) {\n aggregationControl.setValue(AGGREGATION_VALUES.none);\n }\n }\n\n /**\n * Sets the aggregation control to the first available (non-disabled) option if the current option is disabled.\n *\n * This method:\n * - Retrieves the current value of the aggregation control.\n * - Checks if the current aggregation option is disabled.\n * - If the current option is disabled, sets the control to the first available (non-disabled) option based on the following order:\n * - If the current value is `DAILY`, it switches to `HOURLY` if it's not disabled, otherwise to `MINUTELY` if `HOURLY` is also disabled.\n * - If the current value is `HOURLY`, it switches to `MINUTELY` if it's not disabled.\n * - If all options are disabled, it sets the value to `NONE`.\n *\n * The disabled state is stored in the `disabledAggregationOptions` object,\n * where the key is the aggregation value and the value is a boolean indicating whether the option is disabled.\n *\n * The `AGGREGATION_VALUES` object defines the possible aggregation values.\n */\n private setToFirstAvailableAggregationOptionIfCurrentAggregationIsDisabled(): void {\n const aggregationControl = this.formGroup.controls.aggregation;\n const currentValue = aggregationControl.value;\n\n const newAggregationValue = this.aggregationService.determineFirstNewAvailableAggregationValue(\n currentValue,\n this.disabledAggregationOptions\n );\n\n if (newAggregationValue !== currentValue) {\n aggregationControl.setValue(newAggregationValue);\n }\n }\n\n private deleteAggregationProperty(config: DatapointsTableConfig): void {\n delete this.formGroup.value.aggregation;\n delete config.aggregation;\n }\n}\n","<form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n>\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date' | translate }}</legend>\n <!-- global-time-context-selector -->\n <div class=\"form-group form-group-sm m-b-16\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n 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>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li>\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 </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"row tight-grid d-flex flex-wrap\" *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\" >\n <c8y-form-group class=\"form-group-sm\">\n <label>{{ 'Date filter' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\" >\n <c8y-date-range-picker *ngIf=\"formGroup.value.interval === 'custom'\"></c8y-date-range-picker>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label>\n {{ 'Aggregation' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <c8y-form-group class=\"form-group-sm\">\n <label class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\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-4 a-i-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n</fieldset>\n\n<!-- decimal input -->\n<fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n</fieldset>\n\n\n <!-- <datapoints-selector> -->\n <c8y-datapoint-selection-list\n class=\"bg-inherit\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n \n</form>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { aggregationType as AggregationTypeEnum } from '@c8y/client';\nimport { AggregationOption } from '@c8y/ngx-components';\n\n/**\n * A pipe that adjusts the aggregated time range based on the aggregation type.\n *\n * ```html\n * '9:00' | adjustAggregatedTimeRange: config.aggregation (e.g.:HOURLY)\n * ```\n * The output will be '9:00-10:00'.\n */\n@Pipe({\n name: 'adjustAggregatedTimeRange',\n standalone: true\n})\nexport class AdjustAggregatedTimeRangePipe implements PipeTransform {\n /**\n * Transforms the input time based on the aggregation type.\n * @param inputTime The input time string.\n * @param aggregationType The type of aggregation (optional).\n * @returns The transformed time string.\n */\n transform(inputTime: string, aggregationType?: AggregationOption): string {\n if (!aggregationType) {\n return inputTime;\n }\n\n if (aggregationType === AggregationTypeEnum.DAILY) {\n return '';\n }\n\n const date = this.createDateFromInput(inputTime);\n const isTwelveHoursFormat = this.isTwelveHoursFormat(inputTime);\n\n switch (aggregationType) {\n case AggregationTypeEnum.HOURLY:\n return this.getHourlyTimeRange(date, isTwelveHoursFormat);\n case AggregationTypeEnum.MINUTELY:\n return this.getMinutelyTimeRange(date, isTwelveHoursFormat);\n default:\n throw new Error('Unsupported aggregation type');\n }\n }\n\n /**\n * Creates a date object from the input time string.\n * @param inputTime The input time string.\n * @returns The created Date object.\n */\n private createDateFromInput(inputTime: string): Date {\n const defaultDate = '1970-01-01 ';\n const isPM = /PM/i.test(inputTime);\n const cleanedTime = inputTime.replace(/AM|PM/i, '').trim();\n\n this.validateTimeFormat(cleanedTime, inputTime);\n\n const dateTimeString = `${defaultDate}${cleanedTime}`;\n const date = new Date(dateTimeString);\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid input time');\n }\n\n return this.adjustForPMTime(date, isPM);\n }\n\n /**\n * Validates if the time string matches the required format and has valid values.\n * @param time The time string to validate.\n * @param originalInput The original input string (including AM/PM if present).\n * @throws Error if the time format is invalid or values are out of range.\n */\n private validateTimeFormat(time: string, originalInput: string): void {\n const parts = time.split(':');\n this.validateTimeParts(parts);\n\n const [hoursStr, minutesStr, secondsStr] = parts;\n this.validateTimeDigits(hoursStr, minutesStr, secondsStr);\n\n const { hours, minutes, seconds } = this.parseTimeComponents(hoursStr, minutesStr, secondsStr);\n this.validateTimeRanges(hours, minutes, seconds);\n this.validateTimeFormat24Hour(hours, originalInput);\n }\n\n private validateTimeParts(parts: string[]): void {\n if (parts.length < 2 || parts.length > 3) {\n throw new Error('Invalid input time');\n }\n }\n\n private validateTimeDigits(hoursStr: string, minutesStr: string, secondsStr?: string): void {\n if (\n !this.isValidNumberString(hoursStr) ||\n !this.isValidNumberString(minutesStr) ||\n (secondsStr !== undefined && !this.isValidNumberString(secondsStr))\n ) {\n throw new Error('Invalid input time');\n }\n }\n\n private parseTimeComponents(hoursStr: string, minutesStr: string, secondsStr?: string) {\n return {\n hours: Number(hoursStr),\n minutes: Number(minutesStr),\n seconds: secondsStr ? Number(secondsStr) : 0\n };\n }\n\n private validateTimeRanges(hours: number, minutes: number, seconds: number): void {\n if (hours > 23 || hours < 0 || minutes > 59 || minutes < 0 || seconds > 59 || seconds < 0) {\n throw new Error('Invalid input time');\n }\n }\n\n private validateTimeFormat24Hour(hours: number, originalInput: string): void {\n if (hours > 12 && this.hasAmPm(originalInput)) {\n throw new Error('Invalid input time');\n }\n }\n\n /**\n * Checks if string contains only digits and is 1-2 characters long.\n * @param value String to check\n * @returns boolean indicating if string is valid\n */\n private isValidNumberString(value: string): boolean {\n return (\n value.length > 0 &&\n value.length <= 2 &&\n value.split('').every(char => char >= '0' && char <= '9')\n );\n }\n\n /**\n * Checks if the input time has AM/PM markers.\n * @param input The input time string to check.\n * @returns boolean indicating if the input contains AM/PM.\n */\n private hasAmPm(input: string): boolean {\n return /AM|PM/i.test(input);\n }\n\n /**\n * Adjusts the date for PM times by adding 12 hours when necessary.\n * @param date The date object to adjust.\n * @param isPM Boolean indicating if the time is PM.\n * @returns The adjusted Date object.\n */\n private adjustForPMTime(date: Date, isPM: boolean): Date {\n const hours = date.getHours();\n if (isPM && hours < 12) {\n date.setHours(hours + 12);\n } else if (!isPM && hours === 12) {\n date.setHours(0);\n }\n return date;\n }\n\n /**\n * Checks if the input time is in twelve hours format.\n * @param inputTime The input time string.\n * @returns True if the input time is in twelve hours format, false otherwise.\n */\n private isTwelveHoursFormat(inputTime: string): boolean {\n return /AM|PM/i.test(inputTime);\n }\n\n /**\n * Gets the hourly time range for the given date.\n * @param date The date object.\n * @param twelveHoursFormat Indicates whether to use twelve hours format.\n * @returns The hourly time range string.\n */\n private getHourlyTimeRange(date: Date, twelveHoursFormat: boolean): string {\n const nextHour = new Date(date.getTime());\n nextHour.setHours(date.getHours() + 1);\n return `${this.formatTime(date, twelveHoursFormat, true)}-${this.formatTime(nextHour, twelveHoursFormat, true)}`;\n }\n\n /**\n * Gets the minutely time range for the given date.\n * @param date The date object.\n * @param twelveHoursFormat Indicates whether to use twelve hours format.\n * @returns The minutely time range string.\n */\n private getMinutelyTimeRange(date: Date, twelveHoursFormat: boolean): string {\n const nextMinute = new Date(date.getTime());\n nextMinute.setMinutes(date.getMinutes() + 1);\n return `${this.formatTime(date, twelveHoursFormat, false)}-${this.formatTime(nextMinute, twelveHoursFormat, false)}`;\n }\n\n /**\n * Formats the given date into a time string.\n * @param date The date to format.\n * @param usePeriod Indicates whether to include the period (AM/PM) in the formatted time.\n * @param useHourOnly Indicates whether to include only the hour part in the formatted time.\n * @returns The formatted time string.\n */\n private formatTime(date: Date, usePeriod: boolean, useHourOnly: boolean): string {\n const hours = date.getHours();\n const minutes = date.getMinutes().toString().padStart(2, '0');\n if (usePeriod) {\n const period = hours >= 12 ? 'PM' : 'AM';\n const formattedHours = hours % 12 === 0 ? 12 : hours % 12;\n return `${formattedHours}:${useHourOnly ? '00' : minutes} ${period}`;\n } else {\n return `${hours.toString().padStart(2, '0')}:${useHourOnly ? '00' : minutes}`;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ColorRangeBoundaries } from '../datapoints-table-widget.model';\n\n/**\n * Applies CSS classes based on the value's range.\n */\n@Pipe({\n name: 'applyRangeClass',\n standalone: true\n})\nexport class ApplyRangeClassPipe implements PipeTransform {\n /**\n * Transforms the input value based on the specified ranges.\n *\n * @param value - Initial value used to determine the CSS class.\n * @param ranges - An object containing the min and max range values for yellow and red colors.\n * @returns The CSS class to be applied.\n */\n transform(value: number, ranges: ColorRangeBoundaries): string {\n if (value == null) {\n return;\n }\n\n if (value >= ranges.yellowRangeMin && value < ranges.yellowRangeMax) {\n return 'text-warning';\n } else if (value >= ranges.redRangeMin && value <= ranges.redRangeMax) {\n return 'text-danger';\n }\n return 'default';\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport {\n CommonModule,\n CountdownIntervalComponent,\n CountdownIntervalModule,\n GainsightService,\n IntervalBasedReload,\n ListGroupModule,\n WIDGET_TYPE_VALUES,\n WidgetGlobalAutoRefreshService,\n gettext\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, Subject, takeUntil, tap } from 'rxjs';\n\n@Component({\n selector: 'c8y-datapoints-reload',\n templateUrl: './datapoints-reload.component.html',\n standalone: true,\n imports: [CommonModule, CountdownIntervalModule, ListGroupModule, TooltipModule]\n})\nexport class DatapointsReloadComponent\n extends IntervalBasedReload\n implements OnChanges, AfterViewInit, OnDestroy\n{\n readonly WIDGET_TYPE_VALUES = WIDGET_TYPE_VALUES;\n\n @ViewChild(CountdownIntervalComponent, { static: false })\n countdownIntervalComponent: CountdownIntervalComponent;\n /**\n * @inheritdoc\n */\n @Input() isAutoRefreshEnabled: boolean;\n /**\n * @inheritdoc\n */\n @Input() isRefreshDisabled = false;\n /**\n * @inheritdoc\n */\n @Input() isLoading: BehaviorSubject<boolean>;\n\n @Input() isScrolling: boolean;\n\n @Input() isExportModalOpen: boolean;\n /**\n * @inheritdoc\n */\n @Input() refreshInterval: number;\n\n @Input() widgetInstanceGlobalAutoRefreshContext: boolean;\n /**\n * @inheritdoc\n */\n @Output() onCountdownEnded = new EventEmitter<void>();\n /**\n * @inheritdoc\n */\n isIntervalRefreshToggleOn: boolean;\n\n toggleCountdownButtonTooltipText: string;\n /**\n * @inheritdoc\n */\n protected manuallyDisabledCountdown = false;\n /**\n * @inheritdoc\n */\n protected hideCountdown: boolean;\n\n protected destroy$ = new Subject<void>();\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private translateService: TranslateService,\n private widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService,\n protected gainsightService: GainsightService\n ) {\n super();\n }\n\n ngAfterViewInit() {\n if (this.widgetInstanceGlobalAutoRefreshContext) {\n this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.onCountdownEnded.emit())\n )\n .subscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.isRefreshDisabled && this.isAutoRefreshEnabled) {\n this.isIntervalRefreshToggleOn = false;\n this.disableCountdown();\n return;\n }\n\n if (this.isExportModalOpen && this.canDisableCountdownWhenModalIsOpen()) {\n this.isIntervalRefreshToggleOn = !this.isIntervalRefreshToggleOn;\n this.disableCountdown();\n } else {\n if (this.canStartCountdown(changes)) {\n this.isIntervalRefreshToggleOn = true;\n this.startCountdown();\n }\n\n if (this.canHandleScrolling()) {\n this.handleScrolling();\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * @inheritdoc\n */\n countdownEnded(): void {\n /**\n * @inheritdoc\n */\n this.autoRefreshList();\n }\n\n reload(): void {\n /**\n * @inheritdoc\n */\n this.autoRefreshList();\n }\n\n /**\n * @inheritdoc\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(): void {\n this.toggleCountdownButtonTooltipText = this.isIntervalRefreshToggleOn\n ? this.translateService.instant(gettext('Disable auto refresh'))\n : this.translateService.instant(gettext('Enable auto refresh'));\n }\n\n private canStartCountdown(changes: SimpleChanges): boolean {\n const { isAutoRefreshEnabled, refreshInterval } = changes;\n return (\n (isAutoRefreshEnabled || refreshInterval) &&\n (this.isAutoRefreshEnabled || !!this.refreshInterval)\n );\n }\n\n private canHandleScrolling(): boolean {\n return !this.manuallyDisabledCountdown && this.isAutoRefreshEnabled;\n }\n\n private canDisableCountdownWhenModalIsOpen(): boolean {\n return (\n this.isAutoRefreshEnabled &&\n !!this.refreshInterval &&\n !this.manuallyDisabledCountdown &&\n !this.isScrolling &&\n !this.hideCountdown\n );\n }\n}\n","<ng-container *ngIf=\"!widgetInstanceGlobalAutoRefreshContext\">\n <div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\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=\"refreshInterval && 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=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event, WIDGET_TYPE_VALUES.DATA_POINTS_TABLE)\"\n />\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]=\"'Refresh' | translate\"\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-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport { IResult, ISeries, ISeriesFilter, aggregationType } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DataFetchingService,\n DatapointsValuesDataMap,\n MinMaxValues,\n SourceId\n} from '@c8y/ngx-components/datapoints-export-selector';\nimport { INTERVAL_VALUES, Interval } from '@c8y/ngx-components/interval-picker';\nimport {\n DURATION_OPTIONS,\n DataPointsTableMap,\n DatapointTableItem,\n DatapointTableMapKey,\n DatapointWithValues,\n DatapointsSeriesDataMap,\n DatapointsTableConfig,\n Duration,\n GroupedDatapointTableItem,\n MeasurementRanges,\n SeriesDataWithResponse,\n TableColumnHeader,\n Value\n} from '../datapoints-table-widget.model';\n\nfunction mapToSourceValueObject([key, value]: [SourceId, string[]]): {\n key: SourceId;\n value: string[];\n} {\n return { key, value };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsTableViewService {\n constructor(private dataFetchingService: DataFetchingService) {}\n\n /**\n * Filters out inactive data points from the given array.\n *\n * @param datapoints - The array of data points to filter.\n * @returns An array of data points that are active.\n */\n filterOutInactiveDatapoints(datapoints: KPIDetails[]): KPIDetails[] {\n return datapoints.filter((datapoint: KPIDetails) => datapoint.__active);\n }\n\n hasMultipleDatapoints(datapoints: KPIDetails[]): boolean {\n const ids = datapoints.map(dp => dp.__target.id);\n return ids.length > 1;\n }\n\n /**\n * Returns a map of active data points device IDs with their corresponding series.\n *\n * Example output:\n * ```typescript\n * new Map([\n * [\n * \"844657202\",\n * [\n * \"c8y_Temperature.T\"\n * ]\n * ],\n * [\n * \"32666427\",\n * [\n * \"c8y_Battery.Battery\"\n * ]\n * ]\n * ]);\n * ```\n * @param datapoints - An array of data points.\n * @returns A map where the key is the data point ID and the value is an array of data point series.\n */\n groupSeriesByDeviceId(activeDatapoints: KPIDetails[]): DatapointsValuesDataMap {\n return activeDatapoints.reduce(\n (map: DatapointsValuesDataMap, { fragment, series, __target: { id } }: KPIDetails) => {\n const value = `${fragment}.${series}`;\n const existingValue = map.get(id) ?? [];\n map.set(id, [...existingValue, value]);\n return map;\n },\n new Map<SourceId, string[]>()\n );\n }\n\n /**\n * Retrieves the active data points series data and returns it as a map.\n *\n * @param datapointsValuesDataMap - A map of data point sources with their associated series.\n * @param config - The configuration of the data points table.\n * @param roundSeconds - Whether to round the seconds or not.\n * If true, the seconds will be rounded to 0.\n * If false, the seconds will be displayed as they are.\n * @returns A Promise that resolves to a Map object with data point IDs as keys and DataObject as values or undefined when all series has forbidden access.\n */\n async getAllActiveSeriesDataMap(\n datapointsValuesDataMap: DatapointsValuesDataMap,\n config: DatapointsTableConfig,\n roundSeconds: boolean\n ): Promise<Map<string | number, ISeries>> {\n const promises = Array.from(datapointsValuesDataMap).map(async ([source, series]) => {\n const params: ISeriesFilter = {\n dateFrom: config.dateFrom,\n dateTo: config.dateTo,\n source,\n series,\n aggregationType: config.aggregation as aggregationType\n };\n const { data, res }: IResult<ISeries> = await this.dataFetchingService.fetchSeriesData(\n params,\n roundSeconds\n );\n\n return { source, data, res };\n });\n\n const results: SeriesDataWithResponse[] = await Promise.all(promises);\n\n const allSeriesHasForbiddenAccess = results.every(item => item.res?.status === 403);\n if (allSeriesHasForbiddenAccess) {\n throw new Error('Access forbidden: All series have a 403 status code');\n }\n\n const filteredResults: SeriesDataWithResponse[] =\n this.filterOutElementsWithForbiddenResponses(results);\n\n const resultMap: DatapointsSeriesDataMap = new Map<string | number, ISeries>();\n filteredResults.forEach(result => resultMap.set(result.source, result.data));\n\n return resultMap;\n }\n\n /**\n * Creates an array of DatapointsWithValues based on the provided datapoints and datapointsSeriesDataMap.\n *\n * Finds an index of a current data point within series object and based on that index filters values array.\n *\n * @param datapoints - An array of data points.\n * @param datapointsSeriesDataMap - A map containing series data for data points.\n * @returns An array of DatapointsWithValues.\n */\n getDatapointsWithValues(\n datapoints: KPIDetails[],\n datapointsSeriesDataMap: DatapointsSeriesDataMap\n ): DatapointWithValues[] {\n return datapoints.map((dp: KPIDetails) => {\n const seriesData: ISeries = datapointsSeriesDataMap.get(dp.__target.id);\n\n if (!seriesData) {\n return { ...dp, values: {} };\n }\n\n // Find an index of a corresponding datapoint data, within series object.\n const datapointSeriesArrayIndex = seriesData.series.findIndex(\n s => s.name === dp.series && s.type === dp.fragment\n );\n\n const valuesFilteredByDatapointSeriesArrayIndex: MeasurementRanges = Object.fromEntries(\n Object.entries(seriesData.values).map(([key, arr]) => [\n key,\n arr.filter((_, index) => index === datapointSeriesArrayIndex)\n ])\n );\n\n return {\n ...dp,\n seriesUnit: seriesData.series[datapointSeriesArrayIndex]?.unit,\n values: valuesFilteredByDatapointSeriesArrayIndex\n };\n });\n }\n\n /**\n * Creates the column headers for the devices in the data points table.\n *\n * @param datapointsWithValues - An array of data points.\n * @returns An array of column headers for the devices.\n */\n getColumnHeaders(datapointsWithValues: KPIDetails[]): TableColumnHeader[] {\n return datapointsWithValues.map(\n ({ __target: { name }, label, renderType, unit }): TableColumnHeader => {\n return { deviceName: name, label, renderType, unit };\n }\n );\n }\n\n mapDatapointsWithValuesToList(datapointsWithValues: DatapointWithValues[]): DatapointTableItem[] {\n return datapointsWithValues.flatMap(dp => {\n if (!dp.values) {\n return [];\n }\n return Object.entries(dp.values).flatMap(([date, valuesArray]) => {\n const value = this.findMinMaxValues(valuesArray);\n if (value == null) {\n return [];\n }\n return [\n {\n dateAndTime: date,\n deviceName: dp.__target.name,\n fragment: dp.fragment,\n label: dp.label,\n redRangeMax: dp.redRangeMax,\n redRangeMin: dp.redRangeMin,\n renderType: dp.renderType,\n series: dp.series,\n value: value,\n yellowRangeMax: dp.yellowRangeMax,\n yellowRangeMin: dp.yellowRangeMin\n }\n ];\n });\n });\n }\n\n /**\n * Finds the overall minimum and maximum values from an array of objects containing 'min' and 'max' properties.\n *\n * If the array contains only one object, that object's 'min' and 'max' values will be returned.\n *\n * @param valuesArray - An array with objects, where each contains 'min' and 'max' properties.\n * @returns An object with the smallest 'min' and largest 'max' values found in the array.\n *\n * @example\n * const values = [\n * { min: 1, max: 10 }\n * ];\n *\n * const result = findMinMaxValues(values);\n * // result is { min: 1, max: 10 }\n */\n findMinMaxValues(valuesArray: MinMaxValues[]): Value | null {\n const validItems = valuesArray.filter(\n (item): item is Value => item && item.min != null && item.max != null\n );\n\n if (validItems.length === 0) {\n return null;\n }\n\n const initialValue: Value = { min: validItems[0].min, max: validItems[0].max };\n\n return validItems.reduce<Value>(\n (acc, item) => ({\n min: Math.min(acc.min, item.min),\n max: Math.max(acc.max, item.max)\n }),\n initialValue\n );\n }\n\n /**\n * Groups a list of data points by date and device, based on given references.\n *\n * @param dataList - The list of data points to be grouped.\n * @param references - The column headers that serve as references for grouping.\n * @returns An array of grouped data points, where each group corresponds to a unique date and device.\n */\n groupByDateAndDevice(\n dataList: DatapointTableItem[],\n references: TableColumnHeader[]\n ): GroupedDatapointTableItem[] {\n const map = this.generateDataPointMap(dataList, references);\n return this.mergeDatapoints(map);\n }\n\n /**\n * Generates and populates a map with data points.\n *\n * This function processes the provided data points and organizes them into a map structure\n * where each key is a unique combination of date and device identifiers, and the value is an\n * array of data points (or null values) associated with that key. This structured data is then\n * used in the data point table to render the data appropriately.\n *\n * @param dataList - The list of data point table items to be processed.\n * @param columnsHeadersReferences - The list of column headers used to determine the order and structure of the map values.\n * @returns A map where the key is a datapoint identifier containing the date and device name, and the value is an array of data point table items or null.\n */\n generateDataPointMap(\n dataList: DatapointTableItem[],\n columnsHeadersReferences: TableColumnHeader[]\n ): DataPointsTableMap {\n // Map to store the data points indexed by a unique identifier.\n const map: DataPointsTableMap = new Map<DatapointTableMapKey, (DatapointTableItem | null)[]>();\n\n dataList.forEach(obj => {\n // Generate a unique identifier for each data point using the date and device name.\n const dateKey = this.toISOFormat(obj.dateAndTime);\n const datapointIdentifier: DatapointTableMapKey = `${dateKey}_${obj.deviceName}`;\n\n // Initialize the map entry if it does not exist with a unique identifier.\n if (!map.has(datapointIdentifier)) {\n map.set(datapointIdentifier, Array(columnsHeadersReferences.length).fill(null));\n }\n\n // Find the index of the reference that matches the current data point.\n const matchingColumnIndex = columnsHeadersReferences.findIndex(\n ref => ref.deviceName === obj.deviceName && ref.label === obj.label\n );\n\n // Update the map entry with the data point.\n const tableItem: DatapointTableItem[] = map.get(datapointIdentifier);\n if (tableItem) {\n tableItem[matchingColumnIndex] = { ...obj };\n }\n });\n\n return map;\n }\n\n /**\n * Merges the data points from the given map into an array of grouped data point table items.\n *\n * @param map - The map containing the data points to be merged.\n * @returns An array of grouped data point table items.\n */\n mergeDatapoints(map: DataPointsTableMap): GroupedDatapointTableItem[] {\n const mergedData: GroupedDatapointTableItem[] = [];\n\n map.forEach((values, datapointIdentifier) => {\n const [dateKey, deviceName] = datapointIdentifier.split('_');\n const validDataPoint = values.some(item => item && Object.keys(item.value).length > 0);\n\n if (validDataPoint) {\n mergedData.push({\n dateAndTime: dateKey,\n deviceName: deviceName,\n rowItems: values.map(item => (item ? { ...item } : null))\n });\n }\n });\n\n return mergedData;\n }\n\n sortDataByDateDescending(data: GroupedDatapointTableItem[]): GroupedDatapointTableItem[] {\n return data.sort(\n (a, b) => new Date(b.dateAndTime).getTime() - new Date(a.dateAndTime).getTime()\n );\n }\n\n /**\n * Prepares the updated time range based on the selected interval.\n *\n * In case of a 'custom' interval or no quantity, the original date range is returned.\n *\n * @param interval - The selected interval type.\n * @returns An object containing the `dateFrom` and `dateTo` in ISO string format.\n */\n prepareTimeRange(\n interval: Interval['id'],\n dateFromInput: string,\n dateToInput: string\n ): { dateFrom: string; dateTo: string } {\n if (!interval || interval === INTERVAL_VALUES.custom) {\n return { dateFrom: dateFromInput, dateTo: dateToInput };\n }\n\n const selected: Duration = DURATION_OPTIONS.find(\n selectedDuration => selectedDuration.id === interval\n );\n\n if (!selected?.amount) {\n return { dateFrom: dateFromInput, dateTo: dateToInput };\n }\n\n const now = new Date();\n\n return {\n dateFrom: this.subtractTime(now, selected.amount, selected.unit).toISOString(),\n dateTo: now.toISOString()\n };\n }\n\n /**\n * Subtracts an amount of time from a given date.\n *\n * @param date - The original date.\n * @param amount - The amount of time units to subtract.\n * @param unit - The unit of time to subtract (e.g., minutes, hours, days, weeks, months).\n * @returns A new date with the specified time subtracted.\n */\n subtractTime(date: Date, amount: number, unit: string): Date {\n const newDate = new Date(date);\n\n switch (unit) {\n case INTERVAL_VALUES.minutes:\n newDate.setUTCMinutes(newDate.getUTCMinutes() - amount);\n break;\n case INTERVAL_VALUES.hours:\n newDate.setUTCHours(newDate.getUTCHours() - amount);\n break;\n case INTERVAL_VALUES.days:\n newDate.setUTCDate(newDate.getUTCDate() - amount);\n break;\n case INTERVAL_VALUES.weeks:\n newDate.setUTCDate(newDate.getUTCDate() - amount * 7);\n break;\n case INTERVAL_VALUES.months:\n this.subtractMonthsAndAdjustDay(newDate, amount);\n break;\n }\n return newDate;\n }\n\n getSeriesWithoutPermissionToRead(\n activeDatapointsSeriesData: Map<string | number, ISeries> | undefined,\n activeDatapointsIdsWithSeries: DatapointsValuesDataMap\n ): { key: SourceId; value: string[] }[] {\n if (!activeDatapointsSeriesData) {\n // Returns all activeDatapointsIdsWithSeries entries if activeDatapointsSeriesData is undefined.\n // It means that the user does not have permission to see any of the selected datapoints data.\n return Array.from(activeDatapointsIdsWithSeries, mapToSourceValueObject);\n }\n\n const availableSources = new Set(activeDatapointsSeriesData.keys());\n\n return Array.from(activeDatapointsIdsWithSeries)\n .filter(([source]) => !availableSources.has(source))\n .map(mapToSourceValueObject);\n }\n\n hasSecondsAndMillisecondsEqualZero(timeString: string): boolean {\n if (!timeString) {\n return false;\n }\n\n const date = new Date(timeString);\n if (isNaN(date.getTime())) {\n return false;\n }\n\n return date.getUTCSeconds() === 0 && date.getUTCMilliseconds() === 0;\n }\n\n /**\n * Converts a date string to ISO format.\n *\n * @param dateStr - The date string to convert.\n * @returns The ISO format of the given date string.\n */\n private toISOFormat(dateStr: string): string {\n return new Date(dateStr).toISOString();\n }\n\n private filterOutElementsWithForbiddenResponses(\n seriesDataWithResponse: SeriesDataWithResponse[]\n ): SeriesDataWithResponse[] {\n return seriesDataWithResponse.filter(item => {\n return !(item.res?.status === 403);\n });\n }\n\n private subtractMonthsAndAdjustDay(date: Date, monthsToSubtract: number): void {\n const currentMonth = date.getUTCMonth();\n const expectedTargetMonth = this.calculateTargetMonth(currentMonth, monthsToSubtract);\n\n date.setUTCMonth(currentMonth - monthsToSubtract);\n\n const actualMonth = date.getUTCMonth();\n const dayDoesNotExistInTargetMonth = actualMonth !== expectedTargetMonth;\n\n if (dayDoesNotExistInTargetMonth) {\n this.setToLastDayOfPreviousMonth(date);\n }\n }\n\n /**\n * Calculates the target month number (0-11) after subtracting months from the current month.\n * Handles negative month numbers by normalizing them to the valid 0-11 range.\n *\n * Examples:\n * - January(0) - 1 month = December(11)\n * - March(2) - 4 months = November(10)\n * - December(11) - 1 month = November(10)\n *\n * @param currentMonth - Current month (0-11, where 0 is January)\n * @param monthsToSubtract - Number of months to subtract\n * @returns Normalized month number in range 0-11\n */\n private calculateTargetMonth(currentMonth: number, monthsToSubtract: number): number {\n return (currentMonth - monthsToSubtract + 12) % 12;\n }\n\n /**\n * Sets the date to the last day of the previous month.\n * Using 0 as dateValue makes JavaScript automatically calculate\n * last day of previous month, per JavaScript Date API behavior.\n * @param date - Date to modify\n */\n private setToLastDayOfPreviousMonth(date: Date): void {\n date.setUTCDate(0);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TableColumnHeader, RENDER_TYPES_LABELS } from '../datapoints-table-widget.model';\n\n/**\n * Creates a column header title message.\n *\n * ```html\n * title=\"{{ header | columnTitle }}\"\n * ```\n * The output will be e.g.: 'c8y_Temperature → T [T] (Area)'.\n */\n@Pipe({\n name: 'columnTitle',\n standalone: true\n})\nexport class ColumnTitlePipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms the column header into a formatted string with label and optionally unit and render type.\n *\n * @param columnHeader - The column header object.\n * @returns The formatted string with label, unit, and render type.\n */\n transform(columnHeader: TableColumnHeader): string {\n const label = columnHeader.label.trim();\n const unit = columnHeader.unit ? `[${columnHeader.unit.trim()}]` : '';\n const renderType = columnHeader.renderType\n ? this.translateService.instant(RENDER_TYPES_LABELS[columnHeader.renderType])\n : '';\n\n if (!renderType) {\n return `${label} ${unit}`.trim();\n }\n\n return `${label} ${unit} (${renderType})`.trim();\n }\n}\n","import {\n AfterViewInit,\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnDestroy,\n Output\n} from '@angular/core';\n\n/**\n * Directive to listen for scroll events on a virtual scroll container.\n * Emits `scrolled` and `scrolledToTop` events.\n *\n * The directive listens for scroll events on a virtual scroll container.\n * - When the container is scrolled by at least 50 pixels (or a custom threshold), the `scrolled` event is emitted.\n * - When the container is scrolled to the top, the `scrolledToTop` event is emitted.\n *\n */\n@Directive({\n selector: '[c8yVirtualScrollListener]',\n standalone: true\n})\nexport class VirtualScrollListenerDirective implements AfterViewInit, OnDestroy {\n /**\n * Pixel threshold for emitting the scrolled event.\n */\n @Input() scrollThreshold = 50;\n /**\n * Event emitted when the virtual scroll container is scrolled by at least 50 pixels.\n */\n @Output() scrolled = new EventEmitter<void>();\n /**\n * Event emitted when the virtual scroll container is scrolled to the top.\n */\n @Output() scrolledToTop = new EventEmitter<void>();\n\n private virtualScrollContainer: HTMLElement;\n private lastScrollTop = 0;\n\n constructor(\n private el: ElementRef,\n private ngZone: NgZone\n ) {}\n\n ngAfterViewInit(): void {\n this.virtualScrollContainer = this.el.nativeElement.querySelector(\n '.cdk-virtual-scroll-viewport'\n );\n\n if (this.virtualScrollContainer) {\n this.ngZone.runOutsideAngular(() => {\n this.virtualScrollContainer.addEventListener('scroll', this.onScroll.bind(this));\n });\n }\n }\n\n ngOnDestroy(): void {\n if (this.virtualScrollContainer) {\n this.virtualScrollContainer.removeEventListener('scroll', this.onScroll.bind(this));\n }\n }\n\n /**\n * Handles the scroll event. Emits `scrolled` event if scrolled by at least `scrollThreshold` pixels\n * and `scrolledToTop` event if scrolled to the top.\n * @param event - The scroll event.\n */\n private onScroll(event: Event): void {\n const target = event.target as HTMLElement;\n const scrollTop = target.scrollTop;\n\n if (Math.abs(scrollTop - this.lastScrollTop) > this.scrollThreshold) {\n this.lastScrollTop = scrollTop;\n this.ngZone.run(() => this.scrolled.emit());\n }\n\n if (scrollTop === 0) {\n this.ngZone.run(() => this.scrolledToTop.emit());\n }\n }\n}\n","import { Directive, ElementRef, Input, OnInit, Renderer2 } from '@angular/core';\n\n@Directive({\n selector: '[c8yDynamicColumn]',\n standalone: true\n})\nexport class DynamicColumnDirective implements OnInit {\n @Input('c8yDynamicColumn') numberOfColumns: number;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2\n ) {}\n\n ngOnInit() {\n this.updateColumnClass();\n }\n\n private updateColumnClass() {\n let className = '';\n switch (this.numberOfColumns) {\n case 1:\n className = 'col-md-12';\n break;\n case 2:\n className = 'col-md-6';\n break;\n default:\n if (this.numberOfColumns >= 3) {\n className = 'col-md-3';\n }\n break;\n }\n\n if (className) {\n this.renderer.addClass(this.el.nativeElement, className);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output\n} from '@angular/core';\nimport {\n AggregationOption,\n CommonModule,\n DocsModule,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n DynamicComponentModule,\n ListGroupModule,\n gettext\n} from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n ColorRangeBoundaries,\n TableColumnHeader,\n GroupedDatapointTableItem\n} from '../../datapoints-table-widget.model';\nimport { AdjustAggregatedTimeRangePipe } from '../adjust-aggregated-time-range.pipe';\nimport { ApplyRangeClassPipe } from '../apply-range-class.pipe';\nimport { ColumnTitlePipe } from '../column-title.pipe';\nimport { VirtualScrollListenerDirective } from '../virtual-scroll-listener.directive';\nimport { DynamicColumnDirective } from './dynamic-column.directive';\n\n@Component({\n selector: 'c8y-datapoints-table',\n templateUrl: './datapoints-table.component.html',\n host: { class: 'd-col flex-grow' },\n standalone: true,\n imports: [\n AdjustAggregatedTimeRangePipe,\n ApplyRangeClassPipe,\n ColumnTitlePipe,\n CommonModule,\n DocsModule,\n DynamicColumnDirective,\n DynamicComponentModule,\n ListGroupModule,\n VirtualScrollListenerDirective\n ],\n /**\n * Used to prevent 'getRangeValues' from being called on every change detection cycle.\n */\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DatapointsTableComponent implements OnInit, OnChanges {\n @Input() aggregationType: AggregationOption;\n @Input() datapointsTableItems: GroupedDatapointTableItem[];\n @Input() devicesColumnHeaders: TableColumnHeader[];\n @Input() decimalPlaces: number;\n @Input() hasMultipleDatapoints: boolean;\n @Input() isLoading: boolean;\n @Input() seriesWithoutPermissionToReadCount: number;\n @Output() isScrolling = new EventEmitter<boolean>();\n\n hasNoPermissionsToReadAnyMeasurement = false;\n missingAllPermissionsAlert = new DynamicComponentAlertAggregator();\n\n /**\n * Default fraction size format for numbers with decimal places.\n */\n private fractionSize = '1.2-2';\n\n ngOnInit(): void {\n if (typeof this.decimalPlaces === 'number' && !Number.isNaN(this.decimalPlaces)) {\n this.fractionSize = `1.${this.decimalPlaces}-${this.decimalPlaces}`;\n }\n }\n\n ngOnChanges(): void {\n if (!this.seriesWithoutPermissionToReadCount) {\n return;\n }\n\n this.missingAllPermissionsAlert.clear();\n this.handleNoPermissionErrorMessage();\n }\n\n onListScrolled(): void {\n this.isScrolling.emit(true);\n }\n\n onListScrolledToTop(): void {\n this.isScrolling.emit(false);\n }\n\n getRangeValues(row: KPIDetails): ColorRangeBoundaries {\n return {\n yellowRangeMin: row.yellowRangeMin,\n yellowRangeMax: row.yellowRangeMax,\n redRangeMin: row.redRangeMin,\n redRangeMax: row.redRangeMax\n };\n }\n\n /**\n * Determines the fraction size format based on whether the number is an integer or has decimal places.\n *\n * @param value - The number to be formatted.\n * @returns Returns '1.0-0' if the number is an integer, otherwise returns the current fraction size.\n */\n getFractionSize(value: number): string {\n return value % 1 === 0 ? '1.0-0' : this.fractionSize;\n }\n\n private handleNoPermissionErrorMessage(): void {\n this.hasNoPermissionsToReadAnyMeasurement =\n this.seriesWithoutPermissionToReadCount === this.devicesColumnHeaders.length;\n\n if (this.hasNoPermissionsToReadAnyMeasurement) {\n this.showMessageForMissingPermissionsForAllSeries();\n }\n }\n\n private showMessageForMissingPermissionsForAllSeries(): void {\n this.missingAllPermissionsAlert.addAlerts(\n new DynamicComponentAlert({\n allowHtml: true,\n text: gettext(`<p>To view data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>`),\n type: 'system'\n })\n );\n }\n}\n","<ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ header.label }} {{ header.unit }}\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- The record list -->\n <ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\"\n >\n {{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, OnDestroy, OnInit, Optional, signal } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ISeries } from '@c8y/client';\nimport {\n AlertService,\n CommonModule,\n DismissAlertStrategy,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n WidgetGlobalAutoRefreshService,\n gettext,\n globalAutoRefreshLoading\n} from '@c8y/ngx-components';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DataFetchingService,\n DatapointsExportSelectorComponent,\n DatapointsValuesDataMap,\n ExportConfig,\n SourceId,\n dateRangeValidator\n} from '@c8y/ngx-components/datapoints-export-selector';\nimport { INTERVAL_VALUES } from '@c8y/ngx-components/interval-picker';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subject, Subscription, debounceTime, takeUntil } from 'rxjs';\nimport {\n DEFAULT_DPT_REFRESH_INTERVAL_VALUE,\n DatapointTableItem,\n DatapointWithValues,\n DatapointsTableConfig,\n GroupedDatapointTableItem,\n TableColumnHeader\n} from '../datapoints-table-widget.model';\nimport { DatapointsTableService } from '../datapoints-table.service';\nimport { DateRangePickerComponent } from '../date-range-picker.component';\nimport { DatapointsReloadComponent } from './datapoints-reload/datapoints-reload.component';\nimport { DatapointsTableViewService } from './datapoints-table-view.service';\nimport { DatapointsTableComponent } from './datapoints-table/datapoints-table.component';\n\n@Component({\n selector: 'c8y-datapoints-table-view',\n templateUrl: './datapoints-table-view.component.html',\n host: { class: 'd-col fit-h' },\n standalone: true,\n imports: [\n CommonModule,\n DatapointsExportSelectorComponent,\n DatapointsReloadComponent,\n DatapointsTableComponent,\n DateRangePickerComponent,\n ReactiveFormsModule\n ]\n})\nexport class DatapointsTableViewWidgetComponent implements OnInit, OnDestroy {\n /**\n * Data points table widget config.\n */\n @Input() config: DatapointsTableConfig;\n\n alerts: DynamicComponentAlertAggregator;\n\n /**\n * Represents the data points where __active property is set to true.\n */\n activeDatapoints: KPIDetails[] = [];\n /**\n * Represents the custom CSS style for the export selector component.\n */\n containerClass: string;\n /**\n * An array of objects representing datapoints with their corresponding values.\n * Used to populate the CSV/Excel file with data.\n */\n datapointsWithValues: DatapointWithValues[];\n /**\n * An array of `GroupedDatapointTableItem` objects representing the datapoints table items.\n * Used to populate the table with data.\n */\n datapointsTableItems: GroupedDatapointTableItem[] = [];\n\n devicesColumnHeaders: TableColumnHeader[];\n /**\n * Represents a configuration options used by a c8y-datapoints-export-selector.\n */\n exportConfig: ExportConfig;\n\n formGroup: ReturnType<DatapointsTableViewWidgetComponent['createForm']>;\n /**\n * Indicates whether there is more than one data point.\n * If is true, then a column 'Device' will be displayed in the table.\n */\n hasMultipleDatapoints: boolean;\n /**\n * Indicates whether refreshing should be enabled or disabled.\n * It's 'true' when user is not allowed to view a measurements.\n */\n isRefreshDisabled = false;\n /**\n * Indicates whether the component is in the initial request state\n * where data for a table structure is being prepared.\n */\n isInitialRequest = true;\n /**\n * Current isLoading state. Indicates whether the data is being loaded.\n */\n isLoading$ = new BehaviorSubject<boolean>(true);\n\n isExportModalOpen = false;\n\n isScrolling = signal(false);\n\n seriesWithoutPermissionToRead: { key: SourceId; value: string[] }[];\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\n private destroy$: Subject<void> = new Subject();\n private scrollingSubject$: Subject<boolean> = new Subject<boolean>();\n private subscription: Subscription;\n private isFailedToFetchSeriesData: boolean;\n /**\n * Indicates if the alert has already been displayed and can be dismissed.\n * The message is only displayed when a component is initialized.\n */\n private isMissingAnyPermissionAlertShown = false;\n\n constructor(\n private alertService: AlertService,\n private dataFetchingService: DataFetchingService,\n private datapointsTableConfigService: DatapointsTableService,\n private datapointsTableViewService: DatapointsTableViewService,\n private formBuilder: FormBuilder,\n private translateService: TranslateService,\n private widgetGlobalAutoRefresh: WidgetGlobalAutoRefreshService,\n @Optional() private dashboardContextComponent: ContextDashboardComponent\n ) {}\n\n async ngOnInit(): Promise<void> {\n if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n this.containerClass = 'a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto';\n }\n\n /**\n * Legacy widget used realtime so it must be converted to refresh approach\n * if it was enabled before migration.\n */\n if (this.config.widgetInstanceGlobalTimeContext) {\n this.config.widgetInstanceGlobalAutoRefreshContext = true;\n this.config.widgetInstanceGlobalTimeContext = false;\n this.config.displaySettings.globalAutoRefreshContext = true;\n }\n\n if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n this.handleGlobalRefreshLoading();\n this.handleGlobalTimeContextSettings();\n }\n\n this.setScrollingSubscription();\n\n const isLegacyWidgetRealtimeActive =\n this.config.realtime &&\n !this.config.hasOwnProperty('decimalPlaces') &&\n !this.config.hasOwnProperty('refreshInterval') &&\n !this.config.hasOwnProperty('isAutoRefreshEnabled');\n\n if (isLegacyWidgetRealtimeActive) {\n this.setDefaultRefreshRelatedProperties();\n }\n\n if (this.config.interval !== INTERVAL_VALUES.custom) {\n this.recalculateIntervalToMatchFromNowDate();\n }\n\n if (this.config.displayDateSelection) {\n this.prepareDateRangeForm();\n }\n\n await this.prepareTableData();\n\n this.exportConfig = {\n aggregation: this.config.aggregation,\n dateFrom: this.config.dateFrom,\n dateTo: this.config.dateTo,\n datapointDetails: this.activeDatapoints.map(({ __target, fragment, series }) => ({\n deviceName: __target.name,\n source: __target.id,\n valueFragmentSeries: series,\n valueFragmentType: fragment\n }))\n };\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onDateChange(data: { dateFrom?: string | null; dateTo?: string | null }): void {\n if (this.formGroup.invalid) {\n return;\n }\n\n if (data.dateFrom) {\n this.config.dateFrom = data.dateFrom;\n }\n if (data.dateTo) {\n this.config.dateTo = data.dateTo;\n }\n this.prepareTableData();\n\n this.updateExportConfigDateRange();\n }\n\n onExportModalOpen(isOpened: boolean): void {\n this.isExportModalOpen = isOpened;\n }\n\n onScrolling(value: boolean): void {\n this.scrollingSubject$.next(value);\n }\n\n async onCountdownEnded(): Promise<void> {\n const dateRange = this.datapointsTableViewService.prepareTimeRange(\n this.config.interval,\n this.config.dateFrom,\n this.config.dateTo\n );\n\n this.config.dateFrom = dateRange.dateFrom;\n this.config.dateTo = dateRange.dateTo;\n\n this.updateExportConfigDateRange();\n await this.prepareTableData(false);\n\n this.onScrolling(false);\n }\n\n private handleGlobalTimeContextSettings(): void {\n this.config.dateFrom = this.dataFetchingService.adjustDate(this.config.date[0], 0, false);\n this.config.dateTo = this.dataFetchingService.adjustDate(this.config.date[1], 0, false);\n }\n\n /**\n * Sets up the scrolling subscription.\n *\n * Ensures similar UX as in the alarms countdown-pause logic.\n */\n private setScrollingSubscription(): void {\n this.subscription = this.scrollingSubject$\n .pipe(debounceTime(300))\n .subscribe(value => this.isScrolling.set(value));\n }\n\n private setDefaultRefreshRelatedProperties(): void {\n this.config.isAutoRefreshEnabled = true;\n this.config.refreshInterval = DEFAULT_DPT_REFRESH_INTERVAL_VALUE;\n }\n\n private recalculateIntervalToMatchFromNowDate(): void {\n if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n return;\n }\n\n const { dateFrom, dateTo } = this.datapointsTableConfigService.calculateDateRange(\n this.config.interval\n );\n this.config.dateFrom = dateFrom;\n this.config.dateTo = dateTo;\n }\n\n private prepareDateRangeForm() {\n this.formGroup = this.createForm();\n }\n\n private createForm() {\n return this.formBuilder.group(\n {\n dateFrom: new FormControl(this.config.dateFrom),\n dateTo: new FormControl(this.config.dateTo)\n },\n { validators: dateRangeValidator }\n );\n }\n\n /**\n * Prepares the table data by:\n * - filtering out inactive data points,\n * - checking if there are multiple devices as a source of data points,\n * - getting the column headers for devices,\n * - getting the series data for active data points (API call),\n * - preparing data points with values list,\n * - mapping data points with values to list items,\n * - grouping data points by date and device,\n * - sorting data by date descending.\n *\n * @param roundSeconds - Whether to round the seconds or not.\n * If true, the seconds will be rounded to 0.\n * If false, the seconds will be displayed as they are.\n */\n private async prepareTableData(roundSeconds = true): Promise<void> {\n this.isLoading$.next(true);\n\n if (this.isInitialRequest) {\n if (this.config.datapoints?.length) {\n this.config.datapoints.forEach(datapoint =>\n this.assignContextFromContextDashboard(datapoint)\n );\n }\n\n this.activeDatapoints = this.datapointsTableViewService.filterOutInactiveDatapoints(\n this.config.datapoints\n );\n\n this.hasMultipleDatapoints = this.datapointsTableViewService.hasMultipleDatapoints(\n this.activeDatapoints\n );\n\n this.devicesColumnHeaders = this.datapointsTableViewService.getColumnHeaders(\n this.activeDatapoints\n );\n\n this.isInitialRequest = false;\n }\n\n const activeDatapointsIdsWithSeries: DatapointsValuesDataMap =\n this.datapointsTableViewService.groupSeriesByDeviceId(this.activeDatapoints);\n\n const activeDatapointsSeriesData: Map<string | number, ISeries> =\n await this.getActiveDatapointsSeriesDataMap(\n activeDatapointsIdsWithSeries,\n this.config,\n roundSeconds\n );\n\n if (this.isFailedToFetchSeriesData) {\n return;\n }\n\n this.seriesWithoutPermissionToRead =\n this.datapointsTableViewService.getSeriesWithoutPermissionToRead(\n activeDatapointsSeriesData,\n activeDatapointsIdsWithSeries\n );\n\n if (\n !this.isMissingAnyPermissionAlertShown &&\n this.seriesWithoutPermissionToRead?.length > 0 &&\n activeDatapointsSeriesData?.size\n ) {\n this.handleMissingAnyPermissionErrorMessage();\n this.isMissingAnyPermissionAlertShown = true;\n }\n\n if (!activeDatapointsSeriesData) {\n return;\n }\n\n this.datapointsWithValues = this.datapointsTableViewService.getDatapointsWithValues(\n this.activeDatapoints,\n activeDatapointsSeriesData\n );\n\n const datapointsListItems: DatapointTableItem[] =\n this.datapointsTableViewService.mapDatapointsWithValuesToList(this.datapointsWithValues);\n\n const groupedDatapointsListItems: GroupedDatapointTableItem[] =\n this.datapointsTableViewService.groupByDateAndDevice(\n datapointsListItems,\n this.devicesColumnHeaders\n );\n\n this.datapointsTableItems = this.datapointsTableViewService.sortDataByDateDescending(\n groupedDatapointsListItems\n );\n\n this.isLoading$.next(false);\n }\n\n /**\n * Retrieves the active data points series data and returns it as a map.\n *\n * It's a wrapper method with try-catch block.\n *\n * @param datapointsIdsWithSeries - A map of data point IDs with their associated series.\n * @param config - The configuration of the data points table.\n * @param roundSeconds - Whether to round the seconds or not.\n * If true, the seconds will be rounded to 0.\n * If false, the seconds will be displayed as they are.\n * @returns A Promise that resolves to a Map object with data point IDs as keys and DataObject as values.\n */\n private async getActiveDatapointsSeriesDataMap(\n datapointsIdsWithSeries: DatapointsValuesDataMap,\n config: DatapointsTableConfig,\n roundSeconds: boolean\n ): Promise<Map<string | number, ISeries>> {\n try {\n this.isFailedToFetchSeriesData = false;\n return await this.datapointsTableViewService.getAllActiveSeriesDataMap(\n datapointsIdsWithSeries,\n config,\n roundSeconds\n );\n } catch (error) {\n this.isLoading$.next(false);\n this.handleFetchError(error);\n }\n }\n\n private handleFetchError(error: Error): void {\n if (error?.message.includes('403')) {\n this.alerts.setAlertGroupDismissStrategy('warning', DismissAlertStrategy.NONE);\n this.isRefreshDisabled = true;\n return;\n }\n\n const isTimeoutError = error?.name === 'TimeoutError';\n const errorMessage = isTimeoutError\n ? this.TIMEOUT_ERROR_TEXT\n : (error?.message ?? this.SERVER_ERROR_TEXT);\n\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text: errorMessage\n })\n );\n\n this.isFailedToFetchSeriesData = true;\n this.alertService.addServerFailure(error);\n }\n\n private handleMissingAnyPermissionErrorMessage() {\n this.alerts.setAlertGroupDismissStrategy('system', DismissAlertStrategy.TEMPORARY);\n\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n allowHtml: true,\n text: this.getMissingPermissionsMessage(),\n type: 'system'\n })\n );\n }\n\n private getMissingPermissionsMessage(): string {\n const baseMessage = this.translateService.instant(\n gettext(`You don't have permissions to read the following series:`)\n );\n\n const formattedList = this.seriesWithoutPermissionToRead\n .map(datapoint => `<li>${datapoint.key.valueOf()}_${datapoint.value}</li>`)\n .join('');\n\n return `\n <div>\n <p>${baseMessage}</p>\n <ul>\n ${formattedList}\n </ul>\n <p><strong>Note:</strong> The name convention for each list item is: <code>[source]_[fragment.series]</code></p>\n </div>\n `;\n }\n\n private handleGlobalRefreshLoading(): void {\n this.isLoading$\n .pipe(globalAutoRefreshLoading(this.widgetGlobalAutoRefresh), takeUntil(this.destroy$))\n .subscribe();\n }\n\n private updateExportConfigDateRange(): void {\n this.config.dateTo = this.adjustTargetDateBasedOnConditionTime(\n this.config.dateFrom,\n this.config.dateTo\n );\n\n this.config.dateFrom = this.adjustTargetDateBasedOnConditionTime(\n this.config.dateTo,\n this.config.dateFrom\n );\n\n this.syncExportConfigDates();\n }\n\n private adjustTargetDateBasedOnConditionTime(conditionDate: string, targetDate: string): string {\n if (this.datapointsTableViewService.hasSecondsAndMillisecondsEqualZero(conditionDate)) {\n return this.dataFetchingService.adjustDate(targetDate, 0, true);\n }\n return targetDate;\n }\n\n private syncExportConfigDates(): void {\n this.exportConfig.dateFrom = this.config.dateFrom;\n this.exportConfig.dateTo = this.config.dateTo;\n }\n\n private assignContextFromContextDashboard(datapoint: KPIDetails) {\n if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.dashboardContextComponent?.context;\n if (context?.id) {\n const { name, id } = context;\n datapoint.__target = { name, id };\n }\n }\n}\n","<div class=\"d-flex gap-16 p-l-16 p-r-16 flex-wrap\">\n <ng-container *ngIf=\"config.displayDateSelection\">\n <form [formGroup]=\"formGroup\">\n <c8y-date-range-picker\n class=\"d-contents\"\n [isEmittingDateChange]=\"true\"\n [showLabel]=\"true\"\n (updatedDate)=\"onDateChange($event)\"\n ></c8y-date-range-picker>\n </form>\n </ng-container>\n <ng-container *ngIf=\"config.datapoints.length > 0\">\n <c8y-datapoints-reload\n class=\"d-contents\"\n [isAutoRefreshEnabled]=\"config.isAutoRefreshEnabled\"\n [refreshInterval]=\"config.refreshInterval\"\n [isRefreshDisabled]=\"isRefreshDisabled\"\n [isLoading]=\"isLoading$\"\n [isScrolling]=\"isScrolling()\"\n [isExportModalOpen]=\"isExportModalOpen\"\n [widgetInstanceGlobalAutoRefreshContext]=\"config.widgetInstanceGlobalAutoRefreshContext\"\n (onCountdownEnded)=\"onCountdownEnded()\"\n ></c8y-datapoints-reload>\n </ng-container>\n <c8y-datapoints-export-selector\n class=\"d-contents\"\n [containerClass]=\"containerClass\"\n [exportConfig]=\"exportConfig\"\n (isOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector>\n</div>\n<ng-container *ngIf=\"devicesColumnHeaders\">\n <c8y-datapoints-table\n [aggregationType]=\"config.aggregation\"\n [datapointsTableItems]=\"datapointsTableItems\"\n [decimalPlaces]=\"config.decimalPlaces\"\n [devicesColumnHeaders]=\"devicesColumnHeaders\"\n [hasMultipleDatapoints]=\"hasMultipleDatapoints\"\n [isLoading]=\"isLoading$ | async\"\n [seriesWithoutPermissionToReadCount]=\"seriesWithoutPermissionToRead?.length\"\n (isScrolling)=\"onScrolling($event)\"\n ></c8y-datapoints-table>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.DatapointsTableService","i5","aggregationType","AggregationTypeEnum","i2","CommonModule","i3","i4","i3.DatapointsTableService","i4.DatapointsTableViewService","i6","i7","i8"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-datapoints-table.mjs","sources":["../../widgets/implementations/datapoints-table/datapoints-table-widget.model.ts","../../widgets/implementations/datapoints-table/datapoints-table.service.ts","../../widgets/implementations/datapoints-table/date-range-picker.component.ts","../../widgets/implementations/datapoints-table/date-range-picker.component.html","../../widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.html","../../widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.html","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.html","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.ts","../../widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.html","../../widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.ts"],"sourcesContent":["import { IFetchResponse, ISeries } from '@c8y/client';\nimport { AggregationOption, gettext } from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { MinMaxValues, SourceId, TimeStamp } from '@c8y/ngx-components/datapoints-export-selector';\nimport { Interval, INTERVAL_VALUES } from '@c8y/ngx-components/interval-picker';\n\nexport const DEFAULT_DPT_REFRESH_INTERVAL_VALUE = 30_000;\n\nexport type DatapointTableMapKey = `${TimeStamp}_${DeviceName}`;\n/**\n * Represents a mapping where the key is a datapoint identifier containing the date and device name, and the value is an array of data point table items or null.\n */\nexport type DataPointsTableMap = Map<DatapointTableMapKey, (DatapointTableItem | null)[]>;\n\ntype DeviceName = string;\n\n/**\n * Represents a map of datapoints series data.\n * The key of the map is a source, and the value is the data for requested series.\n */\nexport type DatapointsSeriesDataMap = Map<SourceId, ISeries>;\n/**\n * Determines which values will be displayed as values for datapoints.\n * e.g. if user chose 'min', only the minimum values will be displayed.\n */\nexport type RenderType = keyof typeof RENDER_TYPES_LABELS;\n/**\n * Represents an object where key is a timestamp and value is an array\n * where first record contains min and max values for a corresponding timestamp.\n */\nexport type MeasurementRanges = {\n [key: TimeStamp]: Array<MinMaxValues>;\n};\n/**\n * Represents a value object where key is an object with min and max properties with its corresponding values.\n */\nexport type Value = {\n [key in keyof MinMaxValues]: number;\n};\n\nexport const DATE_SELECTION_VALUES = {\n dashboard_context: 'dashboard_context',\n config: 'config',\n view_and_config: 'view_and_config'\n} as const;\n\nexport const DATE_SELECTION_VALUES_ARR = [\n DATE_SELECTION_VALUES.dashboard_context,\n DATE_SELECTION_VALUES.config,\n DATE_SELECTION_VALUES.view_and_config\n] as const;\n\nexport const DATE_SELECTION_LABELS = {\n config: gettext('Widget configuration') as 'Widget configuration',\n view_and_config: gettext('Widget and widget configuration') as 'Widget and widget configuration',\n dashboard_context: gettext('Dashboard time range') as 'Dashboard time range'\n} as const;\n\nexport const REFRESH_INTERVAL_VALUES_ARR = [5_000, 10_000, 15_000, 30_000, 60_000];\n\nexport const RENDER_TYPES_LABELS = {\n min: gettext('Minimum') as 'Minimum',\n max: gettext('Maximum') as 'Maximum',\n area: gettext('Area') as 'Area'\n} as const;\n\nexport const INTERVAL_VALUES_ARR = [\n INTERVAL_VALUES.minutes,\n INTERVAL_VALUES.hours,\n INTERVAL_VALUES.days,\n INTERVAL_VALUES.weeks,\n INTERVAL_VALUES.months,\n INTERVAL_VALUES.custom\n] as const;\n\nexport const TIME_RANGE_INTERVAL_LABELS = {\n minutes: gettext('Last minute') as 'Last minute',\n hours: gettext('Last hour') as 'Last hour',\n days: gettext('Last day') as 'Last day',\n weeks: gettext('Last week') as 'Last week',\n months: gettext('Last month') as 'Last month',\n custom: gettext('Custom') as 'Custom'\n} as const;\n\nexport const DURATION_OPTIONS = [\n {\n id: INTERVAL_VALUES.minutes,\n label: TIME_RANGE_INTERVAL_LABELS.minutes,\n unit: INTERVAL_VALUES.minutes,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.hours,\n label: TIME_RANGE_INTERVAL_LABELS.hours,\n unit: INTERVAL_VALUES.hours,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.days,\n label: TIME_RANGE_INTERVAL_LABELS.days,\n unit: INTERVAL_VALUES.days,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.weeks,\n label: TIME_RANGE_INTERVAL_LABELS.weeks,\n unit: INTERVAL_VALUES.weeks,\n amount: 1\n },\n {\n id: INTERVAL_VALUES.months,\n label: TIME_RANGE_INTERVAL_LABELS.months,\n unit: INTERVAL_VALUES.months,\n amount: 1\n },\n { id: INTERVAL_VALUES.custom, label: TIME_RANGE_INTERVAL_LABELS.custom }\n];\n\nexport interface ColorRangeBoundaries {\n yellowRangeMin: number;\n yellowRangeMax: number;\n redRangeMin: number;\n redRangeMax: number;\n}\n\nexport interface DatapointWithValues extends KPIDetails {\n seriesUnit?: string;\n values: MeasurementRanges;\n}\n\nexport interface Duration {\n id: string;\n label: string;\n unit?: string;\n amount?: number;\n}\n\nexport interface TableColumnHeader {\n deviceName: string;\n label: string;\n renderType: string;\n unit: string;\n}\n\nexport interface DateRange {\n dateFrom: string;\n dateTo: string;\n}\n\nexport interface DatapointsTableConfig {\n aggregation?: AggregationOption | null;\n context?: number;\n datapoints: KPIDetails[];\n /**\n * Array that contains global time context dateFrom and dateTo.\n */\n date?: string[];\n dateFrom: string;\n dateTo: string;\n decimalPlaces?: number;\n displayDateSelection: boolean;\n displaySettings: {\n globalTimeContext: boolean;\n globalRealtimeContext: boolean;\n globalAggregationContext: boolean;\n globalAutoRefreshContext: boolean;\n };\n interval: Interval['id'];\n isAutoRefreshEnabled: boolean;\n realtime: boolean;\n refreshInterval?: number;\n selected?: object | null;\n widgetInstanceGlobalTimeContext?: boolean | null;\n widgetInstanceGlobalAutoRefreshContext: boolean;\n globalDateSelector?: keyof typeof DATE_SELECTION_VALUES;\n sliderChange?: boolean | null;\n}\n\nexport interface DatapointTableItem {\n dateAndTime: string;\n deviceName: string;\n fragment: string;\n label: string;\n redRangeMax?: number;\n redRangeMin?: number;\n renderType: string;\n series: string;\n value: Value;\n yellowRangeMax?: number;\n yellowRangeMin?: number;\n}\n\nexport interface GroupedDatapointTableItem {\n dateAndTime: string;\n deviceName: string;\n rowItems: ({\n fragment: string;\n label: string;\n redRangeMax?: number;\n redRangeMin?: number;\n renderType: string;\n series: string;\n value: Value;\n yellowRangeMax?: number;\n yellowRangeMin?: number;\n } | null)[];\n}\n\nexport interface SeriesDataWithResponse {\n source: SourceId;\n data: ISeries;\n res: IFetchResponse;\n}\n","import { Injectable } from '@angular/core';\nimport { DataFetchingService } from '@c8y/ngx-components/datapoints-export-selector';\nimport { INTERVAL_VALUES, Interval } from '@c8y/ngx-components/interval-picker';\nimport { DateRange } from './datapoints-table-widget.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsTableService {\n constructor(private dataFetchingService: DataFetchingService) {}\n\n calculateDateRange(interval: Interval['id']): DateRange {\n const now = new Date();\n const nowString = now.toISOString();\n\n let dateFrom: string;\n\n switch (interval) {\n case INTERVAL_VALUES.minutes:\n dateFrom = this.dataFetchingService.adjustDate(nowString, -1, true);\n break;\n case INTERVAL_VALUES.hours:\n const minutesInAnHourNegative = -60;\n dateFrom = this.dataFetchingService.adjustDate(nowString, minutesInAnHourNegative, true);\n break;\n case INTERVAL_VALUES.days:\n const minutesInADayNegative = -24 * 60;\n dateFrom = this.dataFetchingService.adjustDate(nowString, minutesInADayNegative, true);\n break;\n case INTERVAL_VALUES.weeks:\n const minutesInAWeekNegative = -7 * 24 * 60;\n dateFrom = this.dataFetchingService.adjustDate(nowString, minutesInAWeekNegative, true);\n break;\n case INTERVAL_VALUES.months:\n const oneMonthAgo = new Date(now);\n oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);\n dateFrom = this.dataFetchingService.adjustDate(oneMonthAgo.toISOString(), 0, true);\n break;\n default:\n throw new Error('Invalid time interval');\n }\n\n return {\n dateFrom: dateFrom,\n dateTo: this.dataFetchingService.adjustDate(nowString, 0, true)\n };\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n Output\n} from '@angular/core';\nimport { ControlContainer, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { CoreModule, gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n standalone: true,\n imports: [CoreModule, CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n viewProviders: [\n {\n provide: ControlContainer,\n useFactory: () => inject(ControlContainer, { skipSelf: true })\n }\n ]\n})\nexport class DateRangePickerComponent {\n /**\n * If set to true, the component will be reactive and will emit the updatedDate on every change.\n * Otherwise, the component will use a non emitting variant of a template.\n */\n @Input() isEmittingDateChange = false;\n /**\n * Determines the display of from and to date picker labels.\n */\n @Input() showLabel = true;\n @Output() updatedDate: EventEmitter<{\n dateFrom?: string | null;\n dateTo?: string | null;\n }> = new EventEmitter<{\n dateFrom?: string | null;\n dateTo?: string | null;\n }>();\n\n readonly DATE_FROM = 'dateFrom';\n readonly DATE_TO = 'dateTo';\n readonly FROM_DATE = gettext('From`date`');\n readonly HAS_ERROR = 'has-error';\n readonly INVALID_DATE_TIME = 'invalidDateTime';\n readonly THIS_DATE_IS_INVALID = gettext('This date is invalid.');\n readonly THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE = gettext(\n 'This date is after the latest allowed date.'\n );\n readonly THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE = gettext(\n 'This date is before the earliest allowed date.'\n );\n readonly TO_DATE = gettext('To`date`');\n private parentContainer = inject(ControlContainer);\n\n onDateFromChange(dateFrom: string) {\n this.updatedDate.emit({\n dateFrom\n });\n }\n\n onDateToChange(dateTo: string) {\n this.updatedDate.emit({\n dateTo\n });\n }\n\n get parentFormGroup() {\n return this.parentContainer.control as FormGroup;\n }\n}\n","<div class=\"d-flex gap-8 a-i-center flex-wrap\">\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n class=\"form-group-sm\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"FROM_DATE | translate\"\n [for]=\"DATE_FROM\"\n >\n {{ FROM_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_FROM\"\n [maxDate]=\"parentFormGroup?.value.dateTo\"\n [placeholder]=\"FROM_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateFrom\"\n [ngClass]=\"parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateFromChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages\n class=\"text-nowrap\"\n [show]=\"parentFormGroup?.controls.dateFrom.errors\"\n >\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n class=\"form-group-sm\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"TO_DATE | translate\"\n [for]=\"DATE_TO\"\n >\n {{ TO_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_TO\"\n [minDate]=\"parentFormGroup?.value.dateFrom\"\n [placeholder]=\"TO_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateTo\"\n [ngClass]=\"parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateToChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"parentFormGroup?.controls.dateTo.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n</div>\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport {\n AbstractControl,\n FormBuilder,\n FormControl,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n AGGREGATION_LABELS,\n AGGREGATION_VALUES,\n AGGREGATION_VALUES_ARR,\n AggregationOption,\n AggregationOptionStatus,\n AggregationService,\n CoreModule\n} from '@c8y/ngx-components';\nimport { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';\nimport {\n DatapointAttributesFormConfig,\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport { dateRangeValidator } from '@c8y/ngx-components/datapoints-export-selector';\nimport { Interval, INTERVAL_VALUES } from '@c8y/ngx-components/interval-picker';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { merge, Subject, takeUntil } from 'rxjs';\nimport {\n DatapointsTableConfig,\n DATE_SELECTION_LABELS,\n DATE_SELECTION_VALUES,\n DATE_SELECTION_VALUES_ARR,\n DateRange,\n DEFAULT_DPT_REFRESH_INTERVAL_VALUE,\n INTERVAL_VALUES_ARR,\n REFRESH_INTERVAL_VALUES_ARR,\n TIME_RANGE_INTERVAL_LABELS\n} from '../datapoints-table-widget.model';\nimport { DatapointsTableService } from '../datapoints-table.service';\nimport { DateRangePickerComponent } from '../date-range-picker.component';\n\nexport function minOneDatapointActive(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const datapoints: KPIDetails[] = control.value;\n\n if (!datapoints || !datapoints.length) {\n return null;\n }\n\n const activeDatapoints = datapoints.filter(datapoint => datapoint.__active);\n\n if (activeDatapoints.length >= 1) {\n return null;\n }\n return { exactlyOneDatapointNeedsToBeActive: true };\n };\n}\n\n@Component({\n selector: 'c8y-datapoints-table-view-config',\n templateUrl: './datapoints-table-config.component.html',\n standalone: true,\n imports: [\n CoreModule,\n DatapointSelectorModule,\n DateRangePickerComponent,\n PopoverModule,\n ReactiveFormsModule\n ]\n})\nexport class DatapointsTableWidgetConfigComponent implements OnInit, OnDestroy {\n /**\n * Data points table widget config.\n */\n @Input() config: DatapointsTableConfig;\n\n readonly AGGREGATION_LABELS = AGGREGATION_LABELS;\n readonly DATE_SELECTION_LABELS = DATE_SELECTION_LABELS;\n readonly DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.dashboard_context;\n readonly DEFAULT_INTERVAL_VALUE = INTERVAL_VALUES.hours;\n readonly TIME_RANGE_INTERVAL_LABELS = TIME_RANGE_INTERVAL_LABELS;\n\n readonly AGGREGATION_VALUES_ARR = AGGREGATION_VALUES_ARR;\n readonly DATE_SELECTION_VALUES_ARR = DATE_SELECTION_VALUES_ARR;\n readonly INTERVAL_VALUES_ARR = INTERVAL_VALUES_ARR;\n readonly REFRESH_INTERVAL_VALUES_ARR = REFRESH_INTERVAL_VALUES_ARR;\n\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n disabledAggregationOptions: AggregationOptionStatus = {};\n defaultFormOptions: Partial<DatapointAttributesFormConfig> = {\n selectableChartLineTypes: [],\n selectableAxisTypes: [],\n showRedRange: true,\n showYellowRange: true\n };\n formGroup: ReturnType<DatapointsTableWidgetConfigComponent['createForm']>;\n isWidgetLinkedToGlobalTimeContext: boolean;\n\n private decimalLimits = {\n numberOfDecimalPlacesMin: 0,\n numberOfDecimalPlacesMax: 10\n } as const;\n\n /**\n * Indicate when the time interval selector item has been changed programmatically.\n *\n * This property is used to track changes in the time interval selector\n * that are not triggered by direct user interaction, but by the application itself.\n *\n * In our case, the date selector and the interval selector are linked.\n * So, when one of them changes, it affects the other.\n * For example, selecting \"Last hour\" in the interval selector should automatically update the date range to the last hour.\n * But without this flag, changing the date range would also update the interval selector, resulting in \"Custom date\" being selected.\n * This happens because the system would interpret the behavior this way.\n */\n private isIntervalSelectorChangedProgrammatically = false;\n private destroy$ = new Subject<void>();\n\n constructor(\n private aggregationService: AggregationService,\n private datapointsTableService: DatapointsTableService,\n private formBuilder: FormBuilder,\n private form: NgForm,\n private widgetConfig: WidgetConfigComponent\n ) {}\n\n ngOnInit(): void {\n if (this.widgetConfig.context?.id) {\n this.datapointSelectionConfig.contextAsset = this.widgetConfig?.context;\n }\n\n this.isWidgetLinkedToGlobalTimeContext =\n this.config.widgetInstanceGlobalAutoRefreshContext ?? true;\n\n this.initForm();\n\n this.handleAutoRefreshToggleChanges();\n this.handleIntervalSelectorChanges();\n this.handleDateSelectorChanges();\n this.handleGlobalDateSelectorChanges();\n\n this.updateDisabledAggregationOptions();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: DatapointsTableConfig): void {\n if (\n this.formGroup.value.aggregation === AGGREGATION_VALUES.none ||\n (!this.formGroup.value.aggregation && config.aggregation === AGGREGATION_VALUES.none)\n ) {\n // The 'NONE' aggregation type is not handled by a backend, so it simply needs to be deleted to get data without aggregation.\n this.deleteAggregationProperty(config);\n }\n this.updateTimeContext(config, this.formGroup.value.globalDateSelector);\n Object.assign(config, this.formGroup.value);\n }\n\n toggleRefreshIntervalControl(): void {\n this.formGroup.controls.isAutoRefreshEnabled.value\n ? this.formGroup.controls.refreshInterval.disable()\n : this.formGroup.controls.refreshInterval.enable();\n }\n\n private updateTimeContext(config: DatapointsTableConfig, selectedDateContext: string): void {\n switch (selectedDateContext) {\n case DATE_SELECTION_VALUES.dashboard_context:\n config.displayDateSelection = false;\n config.widgetInstanceGlobalAutoRefreshContext = true;\n if (config.aggregation !== 'NONE') {\n this.deleteAggregationProperty(config);\n }\n break;\n case DATE_SELECTION_VALUES.view_and_config:\n config.displayDateSelection = true;\n config.widgetInstanceGlobalAutoRefreshContext = false;\n break;\n case DATE_SELECTION_VALUES.config:\n default:\n config.displayDateSelection = false;\n config.widgetInstanceGlobalAutoRefreshContext = false;\n }\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n // When the 'NONE' aggregation is removed at the 'onBeforeSave' block,\n // and a Global Date Context forces widgets auto refresh to be enabled\n // then, the aggregation selector will be empty on initial load.\n this.config.aggregation = this.config.aggregation ?? AGGREGATION_VALUES.none;\n\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private createForm() {\n const { dateFrom, dateTo } = this.datapointsTableService.calculateDateRange(\n this.DEFAULT_INTERVAL_VALUE\n );\n const isLegacyWidget =\n this.config.hasOwnProperty('widgetInstanceGlobalTimeContext') &&\n !this.config.hasOwnProperty('decimalPlaces');\n\n return this.formBuilder.group(\n {\n aggregation: new FormControl({\n value: AGGREGATION_VALUES.none as AggregationOption,\n disabled: !this.isAutoRefershDisabled()\n }),\n datapoints: this.formBuilder.control(new Array<KPIDetails>(), [\n Validators.required,\n Validators.minLength(1),\n minOneDatapointActive()\n ]),\n globalDateSelector: new FormControl(\n isLegacyWidget\n ? this.determineGlobalDateSelectorValueForLegacyWidget()\n : this.DEFAULT_DATE_SELECTOR_VALUE\n ),\n dateFrom: new FormControl(dateFrom),\n dateTo: new FormControl(dateTo),\n decimalPlaces: [\n 2,\n [\n Validators.required,\n Validators.min(this.decimalLimits.numberOfDecimalPlacesMin),\n Validators.max(this.decimalLimits.numberOfDecimalPlacesMax),\n Validators.pattern('^[0-9]+$')\n ]\n ],\n interval: new FormControl(this.DEFAULT_INTERVAL_VALUE as Interval['id']),\n isAutoRefreshEnabled: isLegacyWidget ? this.config.realtime : [true],\n refreshInterval: new FormControl({\n value: DEFAULT_DPT_REFRESH_INTERVAL_VALUE,\n disabled: this.isAutoRefershDisabled()\n })\n },\n { validators: dateRangeValidator }\n );\n }\n\n private determineGlobalDateSelectorValueForLegacyWidget(): string {\n const { displayDateSelection, widgetInstanceGlobalAutoRefreshContext } = this.config;\n\n // State of widgetInstanceGlobalTimeContext was converted to widgetInstanceGlobalAutoRefreshContext.\n // That is why it use here in a legacy widget context.\n if (widgetInstanceGlobalAutoRefreshContext) {\n return DATE_SELECTION_VALUES.dashboard_context;\n }\n\n return displayDateSelection\n ? DATE_SELECTION_VALUES.view_and_config\n : DATE_SELECTION_VALUES.config;\n }\n\n private isAutoRefershDisabled(): boolean {\n const isInitialWidgetCreation =\n Object.keys(this.config).length === 1 && this.config['settings'];\n\n if (isInitialWidgetCreation) {\n return false;\n }\n\n const isLegacyWidgetRealtimeNotActive =\n !this.config.realtime &&\n !this.config.hasOwnProperty('decimalPlaces') &&\n !this.config.hasOwnProperty('refreshInterval') &&\n !this.config.hasOwnProperty('isAutoRefreshEnabled');\n\n if (isLegacyWidgetRealtimeNotActive) {\n return true;\n }\n\n return !this.config.isAutoRefreshEnabled;\n }\n\n /**\n * Handles changes to the auto-refresh toggle control and updates the aggregation control accordingly.\n *\n * This method subscribes to the value changes of the auto-refresh toggle form control.\n * When auto-refresh is enabled, the aggregation control's value is set to 'none' and the control is\n * visually disabled (but not programmatically disabled to ensure the value is saved).\n * When auto-refresh is disabled, the aggregation control is enabled.\n */\n private handleAutoRefreshToggleChanges(): void {\n this.formGroup.controls.isAutoRefreshEnabled.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((isAutoRefreshEnabled: boolean) => {\n const aggregationControl = this.formGroup.controls.aggregation;\n if (isAutoRefreshEnabled) {\n aggregationControl.setValue(AGGREGATION_VALUES.none);\n // Do not disable the control programmatically to ensure the value is saved.\n } else {\n aggregationControl.enable();\n }\n });\n }\n\n /**\n * Handles changes in the interval selector form control.\n */\n private handleIntervalSelectorChanges(): void {\n this.formGroup.controls.interval.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((selectedInterval: Interval['id']) => {\n if (selectedInterval === INTERVAL_VALUES.custom) {\n this.updateDisabledAggregationOptions();\n return;\n }\n\n this.handleNonCustomInterval(selectedInterval);\n });\n }\n\n private handleNonCustomInterval(selectedInterval: Interval['id']): void {\n this.isIntervalSelectorChangedProgrammatically = true;\n this.updateDateRange(selectedInterval);\n this.updateDisabledAggregationOptions();\n this.updateAggregationIfAutoRefreshDisabled(selectedInterval);\n }\n\n private updateDateRange(selectedInterval: Interval['id']): void {\n const dateRange: DateRange = this.datapointsTableService.calculateDateRange(selectedInterval);\n this.formGroup.controls.dateTo.setValue(dateRange.dateTo);\n\n // MTM-61351\n // Use requestAnimationFrame to queue the dateFrom update.\n // This prevents timing issues where rapid setValue calls might\n // cause the view to go out of sync with form control values,\n // especially during the first change after initialization.\n // requestAnimationFrame(() => {\n /**\n * Without this requestAnimationFrame or setTimeout, dateFrom won't change to a correct value after first selector change.\n * When form is saved it saves with a correct value, even without with this fix.\n * How to reproduce:\n * 1. set date values to e.g.: 01.05.2024-30.05.2024 and save it\n * 2. reopen a config and switch interval to last month\n */\n // This fix brakes a logic behind disabling non available aggregations.\n // Form will be still saved with correct date value, only view is out of a sync.\n this.formGroup.controls.dateFrom.setValue(dateRange.dateFrom);\n this.isIntervalSelectorChangedProgrammatically = false;\n // });\n }\n\n private updateDisabledAggregationOptions(): void {\n this.disabledAggregationOptions = this.aggregationService.getDisabledAggregationOptions(\n this.formGroup.controls.dateFrom.value,\n this.formGroup.controls.dateTo.value\n );\n }\n\n private updateAggregationIfAutoRefreshDisabled(selectedInterval: Interval['id']): void {\n const isAutoRefreshDisabled = !this.formGroup.controls.isAutoRefreshEnabled.value;\n if (isAutoRefreshDisabled) {\n this.setAggregationValue(selectedInterval);\n }\n }\n\n private setAggregationValue(interval: Interval['id']): void {\n const aggregationControl = this.formGroup.controls.aggregation;\n\n const newAggregationValue = this.aggregationService.determineAggregationValue(interval);\n aggregationControl.setValue(newAggregationValue);\n }\n\n /**\n * Handles changes in the date selector form control.\n */\n private handleDateSelectorChanges(): void {\n merge(\n this.formGroup.controls.dateFrom.valueChanges,\n this.formGroup.controls.dateTo.valueChanges\n )\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.handleDateChange());\n }\n\n private handleDateChange(): void {\n if (this.isIntervalSelectorChangedProgrammatically) {\n return;\n }\n\n const intervalControl = this.formGroup.controls.interval;\n if (intervalControl.value === INTERVAL_VALUES.custom) {\n this.handleCustomIntervalDateChange();\n } else {\n this.setIntervalToCustom(intervalControl);\n }\n this.setToFirstAvailableAggregationOptionIfCurrentAggregationIsDisabled();\n }\n\n private handleCustomIntervalDateChange(): void {\n this.updateDisabledAggregationOptions();\n }\n\n private setIntervalToCustom(intervalControl: AbstractControl): void {\n intervalControl.setValue(INTERVAL_VALUES.custom);\n }\n\n /**\n * Handles changes in the global date selector form control.\n */\n private handleGlobalDateSelectorChanges(): void {\n this.formGroup.controls.globalDateSelector.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe((selected: string) => {\n if (selected === DATE_SELECTION_VALUES.dashboard_context) {\n this.handleDashboardContext();\n } else {\n this.handleNonDashboardContext();\n }\n });\n }\n\n private handleDashboardContext(): void {\n this.isWidgetLinkedToGlobalTimeContext = true;\n }\n\n private handleNonDashboardContext(): void {\n this.isWidgetLinkedToGlobalTimeContext = false;\n\n if (this.isConfigSavedWithoutDashboardTimeOption()) {\n return;\n }\n\n this.updateAggregationIfNecessary();\n this.setIntervalToCustom(this.formGroup.controls.interval);\n }\n\n private isConfigSavedWithoutDashboardTimeOption(): boolean {\n return !this.config.widgetInstanceGlobalAutoRefreshContext;\n }\n\n private updateAggregationIfNecessary(): void {\n const aggregationControl = this.formGroup.controls.aggregation;\n const isDashboardTimeOptionSetAggregationToNull = !aggregationControl.value;\n\n if (isDashboardTimeOptionSetAggregationToNull) {\n aggregationControl.setValue(AGGREGATION_VALUES.none);\n }\n }\n\n /**\n * Sets the aggregation control to the first available (non-disabled) option if the current option is disabled.\n *\n * This method:\n * - Retrieves the current value of the aggregation control.\n * - Checks if the current aggregation option is disabled.\n * - If the current option is disabled, sets the control to the first available (non-disabled) option based on the following order:\n * - If the current value is `DAILY`, it switches to `HOURLY` if it's not disabled, otherwise to `MINUTELY` if `HOURLY` is also disabled.\n * - If the current value is `HOURLY`, it switches to `MINUTELY` if it's not disabled.\n * - If all options are disabled, it sets the value to `NONE`.\n *\n * The disabled state is stored in the `disabledAggregationOptions` object,\n * where the key is the aggregation value and the value is a boolean indicating whether the option is disabled.\n *\n * The `AGGREGATION_VALUES` object defines the possible aggregation values.\n */\n private setToFirstAvailableAggregationOptionIfCurrentAggregationIsDisabled(): void {\n const aggregationControl = this.formGroup.controls.aggregation;\n const currentValue = aggregationControl.value;\n\n const newAggregationValue = this.aggregationService.determineFirstNewAvailableAggregationValue(\n currentValue,\n this.disabledAggregationOptions\n );\n\n if (newAggregationValue !== currentValue) {\n aggregationControl.setValue(newAggregationValue);\n }\n }\n\n private deleteAggregationProperty(config: DatapointsTableConfig): void {\n delete this.formGroup.value.aggregation;\n delete config.aggregation;\n }\n}\n","<form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n>\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Date' | translate }}</legend>\n <!-- global-time-context-selector -->\n <div class=\"form-group form-group-sm m-b-16\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n 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>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li>\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 </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n <div class=\"row tight-grid d-flex flex-wrap\" *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\" >\n <c8y-form-group class=\"form-group-sm\">\n <label>{{ 'Date filter' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\" >\n <c8y-date-range-picker *ngIf=\"formGroup.value.interval === 'custom'\"></c8y-date-range-picker>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label>\n {{ 'Aggregation' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <c8y-form-group class=\"form-group-sm\">\n <label class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\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-4 a-i-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n</fieldset>\n\n<!-- decimal input -->\n<fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n</fieldset>\n\n\n <!-- <datapoints-selector> -->\n <c8y-datapoint-selection-list\n class=\"bg-inherit\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n \n</form>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { aggregationType as AggregationTypeEnum } from '@c8y/client';\nimport { AggregationOption } from '@c8y/ngx-components';\n\n/**\n * A pipe that adjusts the aggregated time range based on the aggregation type.\n *\n * ```html\n * '9:00' | adjustAggregatedTimeRange: config.aggregation (e.g.:HOURLY)\n * ```\n * The output will be '9:00-10:00'.\n */\n@Pipe({\n name: 'adjustAggregatedTimeRange',\n standalone: true\n})\nexport class AdjustAggregatedTimeRangePipe implements PipeTransform {\n /**\n * Transforms the input time based on the aggregation type.\n * @param inputTime The input time string.\n * @param aggregationType The type of aggregation (optional).\n * @returns The transformed time string.\n */\n transform(inputTime: string, aggregationType?: AggregationOption): string {\n if (!aggregationType) {\n return inputTime;\n }\n\n if (aggregationType === AggregationTypeEnum.DAILY) {\n return '';\n }\n\n const date = this.createDateFromInput(inputTime);\n const isTwelveHoursFormat = this.isTwelveHoursFormat(inputTime);\n\n switch (aggregationType) {\n case AggregationTypeEnum.HOURLY:\n return this.getHourlyTimeRange(date, isTwelveHoursFormat);\n case AggregationTypeEnum.MINUTELY:\n return this.getMinutelyTimeRange(date, isTwelveHoursFormat);\n default:\n throw new Error('Unsupported aggregation type');\n }\n }\n\n /**\n * Creates a date object from the input time string.\n * @param inputTime The input time string.\n * @returns The created Date object.\n */\n private createDateFromInput(inputTime: string): Date {\n const defaultDate = '1970-01-01 ';\n const isPM = /PM/i.test(inputTime);\n const cleanedTime = inputTime.replace(/AM|PM/i, '').trim();\n\n this.validateTimeFormat(cleanedTime, inputTime);\n\n const dateTimeString = `${defaultDate}${cleanedTime}`;\n const date = new Date(dateTimeString);\n\n if (isNaN(date.getTime())) {\n throw new Error('Invalid input time');\n }\n\n return this.adjustForPMTime(date, isPM);\n }\n\n /**\n * Validates if the time string matches the required format and has valid values.\n * @param time The time string to validate.\n * @param originalInput The original input string (including AM/PM if present).\n * @throws Error if the time format is invalid or values are out of range.\n */\n private validateTimeFormat(time: string, originalInput: string): void {\n const parts = time.split(':');\n this.validateTimeParts(parts);\n\n const [hoursStr, minutesStr, secondsStr] = parts;\n this.validateTimeDigits(hoursStr, minutesStr, secondsStr);\n\n const { hours, minutes, seconds } = this.parseTimeComponents(hoursStr, minutesStr, secondsStr);\n this.validateTimeRanges(hours, minutes, seconds);\n this.validateTimeFormat24Hour(hours, originalInput);\n }\n\n private validateTimeParts(parts: string[]): void {\n if (parts.length < 2 || parts.length > 3) {\n throw new Error('Invalid input time');\n }\n }\n\n private validateTimeDigits(hoursStr: string, minutesStr: string, secondsStr?: string): void {\n if (\n !this.isValidNumberString(hoursStr) ||\n !this.isValidNumberString(minutesStr) ||\n (secondsStr !== undefined && !this.isValidNumberString(secondsStr))\n ) {\n throw new Error('Invalid input time');\n }\n }\n\n private parseTimeComponents(hoursStr: string, minutesStr: string, secondsStr?: string) {\n return {\n hours: Number(hoursStr),\n minutes: Number(minutesStr),\n seconds: secondsStr ? Number(secondsStr) : 0\n };\n }\n\n private validateTimeRanges(hours: number, minutes: number, seconds: number): void {\n if (hours > 23 || hours < 0 || minutes > 59 || minutes < 0 || seconds > 59 || seconds < 0) {\n throw new Error('Invalid input time');\n }\n }\n\n private validateTimeFormat24Hour(hours: number, originalInput: string): void {\n if (hours > 12 && this.hasAmPm(originalInput)) {\n throw new Error('Invalid input time');\n }\n }\n\n /**\n * Checks if string contains only digits and is 1-2 characters long.\n * @param value String to check\n * @returns boolean indicating if string is valid\n */\n private isValidNumberString(value: string): boolean {\n return (\n value.length > 0 &&\n value.length <= 2 &&\n value.split('').every(char => char >= '0' && char <= '9')\n );\n }\n\n /**\n * Checks if the input time has AM/PM markers.\n * @param input The input time string to check.\n * @returns boolean indicating if the input contains AM/PM.\n */\n private hasAmPm(input: string): boolean {\n return /AM|PM/i.test(input);\n }\n\n /**\n * Adjusts the date for PM times by adding 12 hours when necessary.\n * @param date The date object to adjust.\n * @param isPM Boolean indicating if the time is PM.\n * @returns The adjusted Date object.\n */\n private adjustForPMTime(date: Date, isPM: boolean): Date {\n const hours = date.getHours();\n if (isPM && hours < 12) {\n date.setHours(hours + 12);\n } else if (!isPM && hours === 12) {\n date.setHours(0);\n }\n return date;\n }\n\n /**\n * Checks if the input time is in twelve hours format.\n * @param inputTime The input time string.\n * @returns True if the input time is in twelve hours format, false otherwise.\n */\n private isTwelveHoursFormat(inputTime: string): boolean {\n return /AM|PM/i.test(inputTime);\n }\n\n /**\n * Gets the hourly time range for the given date.\n * @param date The date object.\n * @param twelveHoursFormat Indicates whether to use twelve hours format.\n * @returns The hourly time range string.\n */\n private getHourlyTimeRange(date: Date, twelveHoursFormat: boolean): string {\n const nextHour = new Date(date.getTime());\n nextHour.setHours(date.getHours() + 1);\n return `${this.formatTime(date, twelveHoursFormat, true)}-${this.formatTime(nextHour, twelveHoursFormat, true)}`;\n }\n\n /**\n * Gets the minutely time range for the given date.\n * @param date The date object.\n * @param twelveHoursFormat Indicates whether to use twelve hours format.\n * @returns The minutely time range string.\n */\n private getMinutelyTimeRange(date: Date, twelveHoursFormat: boolean): string {\n const nextMinute = new Date(date.getTime());\n nextMinute.setMinutes(date.getMinutes() + 1);\n return `${this.formatTime(date, twelveHoursFormat, false)}-${this.formatTime(nextMinute, twelveHoursFormat, false)}`;\n }\n\n /**\n * Formats the given date into a time string.\n * @param date The date to format.\n * @param usePeriod Indicates whether to include the period (AM/PM) in the formatted time.\n * @param useHourOnly Indicates whether to include only the hour part in the formatted time.\n * @returns The formatted time string.\n */\n private formatTime(date: Date, usePeriod: boolean, useHourOnly: boolean): string {\n const hours = date.getHours();\n const minutes = date.getMinutes().toString().padStart(2, '0');\n if (usePeriod) {\n const period = hours >= 12 ? 'PM' : 'AM';\n const formattedHours = hours % 12 === 0 ? 12 : hours % 12;\n return `${formattedHours}:${useHourOnly ? '00' : minutes} ${period}`;\n } else {\n return `${hours.toString().padStart(2, '0')}:${useHourOnly ? '00' : minutes}`;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ColorRangeBoundaries } from '../datapoints-table-widget.model';\n\n/**\n * Applies CSS classes based on the value's range.\n */\n@Pipe({\n name: 'applyRangeClass',\n standalone: true\n})\nexport class ApplyRangeClassPipe implements PipeTransform {\n /**\n * Transforms the input value based on the specified ranges.\n *\n * @param value - Initial value used to determine the CSS class.\n * @param ranges - An object containing the min and max range values for yellow and red colors.\n * @returns The CSS class to be applied.\n */\n transform(value: number, ranges: ColorRangeBoundaries): string {\n if (value == null) {\n return;\n }\n\n if (value >= ranges.yellowRangeMin && value < ranges.yellowRangeMax) {\n return 'text-warning';\n } else if (value >= ranges.redRangeMin && value <= ranges.redRangeMax) {\n return 'text-danger';\n }\n return 'default';\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport {\n CommonModule,\n CountdownIntervalComponent,\n CountdownIntervalModule,\n GainsightService,\n IntervalBasedReload,\n ListGroupModule,\n WIDGET_TYPE_VALUES,\n WidgetGlobalAutoRefreshService,\n gettext\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, Subject, takeUntil, tap } from 'rxjs';\n\n@Component({\n selector: 'c8y-datapoints-reload',\n templateUrl: './datapoints-reload.component.html',\n standalone: true,\n imports: [CommonModule, CountdownIntervalModule, ListGroupModule, TooltipModule]\n})\nexport class DatapointsReloadComponent\n extends IntervalBasedReload\n implements OnChanges, AfterViewInit, OnDestroy\n{\n readonly WIDGET_TYPE_VALUES = WIDGET_TYPE_VALUES;\n\n @ViewChild(CountdownIntervalComponent, { static: false })\n countdownIntervalComponent: CountdownIntervalComponent;\n /**\n * @inheritdoc\n */\n @Input() isAutoRefreshEnabled: boolean;\n /**\n * @inheritdoc\n */\n @Input() isRefreshDisabled = false;\n /**\n * @inheritdoc\n */\n @Input() isLoading: BehaviorSubject<boolean>;\n\n @Input() isScrolling: boolean;\n\n @Input() isExportModalOpen: boolean;\n /**\n * @inheritdoc\n */\n @Input() refreshInterval: number;\n\n @Input() widgetInstanceGlobalAutoRefreshContext: boolean;\n /**\n * @inheritdoc\n */\n @Output() onCountdownEnded = new EventEmitter<void>();\n /**\n * @inheritdoc\n */\n isIntervalRefreshToggleOn: boolean;\n\n toggleCountdownButtonTooltipText: string;\n /**\n * @inheritdoc\n */\n protected manuallyDisabledCountdown = false;\n /**\n * @inheritdoc\n */\n protected hideCountdown: boolean;\n\n protected destroy$ = new Subject<void>();\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private translateService: TranslateService,\n private widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService,\n protected gainsightService: GainsightService\n ) {\n super();\n }\n\n ngAfterViewInit() {\n if (this.widgetInstanceGlobalAutoRefreshContext) {\n this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.onCountdownEnded.emit())\n )\n .subscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.isRefreshDisabled && this.isAutoRefreshEnabled) {\n this.isIntervalRefreshToggleOn = false;\n this.disableCountdown();\n return;\n }\n\n if (this.isExportModalOpen && this.canDisableCountdownWhenModalIsOpen()) {\n this.isIntervalRefreshToggleOn = !this.isIntervalRefreshToggleOn;\n this.disableCountdown();\n } else {\n if (this.canStartCountdown(changes)) {\n this.isIntervalRefreshToggleOn = true;\n this.startCountdown();\n }\n\n if (this.canHandleScrolling()) {\n this.handleScrolling();\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.countdownSubscription) {\n this.countdownSubscription.unsubscribe();\n }\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * @inheritdoc\n */\n countdownEnded(): void {\n /**\n * @inheritdoc\n */\n this.autoRefreshList();\n }\n\n reload(): void {\n /**\n * @inheritdoc\n */\n this.autoRefreshList();\n }\n\n /**\n * @inheritdoc\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(): void {\n this.toggleCountdownButtonTooltipText = this.isIntervalRefreshToggleOn\n ? this.translateService.instant(gettext('Disable auto refresh'))\n : this.translateService.instant(gettext('Enable auto refresh'));\n }\n\n private canStartCountdown(changes: SimpleChanges): boolean {\n const { isAutoRefreshEnabled, refreshInterval } = changes;\n return (\n (isAutoRefreshEnabled || refreshInterval) &&\n (this.isAutoRefreshEnabled || !!this.refreshInterval)\n );\n }\n\n private canHandleScrolling(): boolean {\n return !this.manuallyDisabledCountdown && this.isAutoRefreshEnabled;\n }\n\n private canDisableCountdownWhenModalIsOpen(): boolean {\n return (\n this.isAutoRefreshEnabled &&\n !!this.refreshInterval &&\n !this.manuallyDisabledCountdown &&\n !this.isScrolling &&\n !this.hideCountdown\n );\n }\n}\n","<ng-container *ngIf=\"!widgetInstanceGlobalAutoRefreshContext\">\n <div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\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=\"refreshInterval && 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=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event, WIDGET_TYPE_VALUES.DATA_POINTS_TABLE)\"\n />\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]=\"'Refresh' | translate\"\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-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport { IResult, ISeries, ISeriesFilter, aggregationType } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DataFetchingService,\n DatapointsValuesDataMap,\n MinMaxValues,\n SourceId\n} from '@c8y/ngx-components/datapoints-export-selector';\nimport { INTERVAL_VALUES, Interval } from '@c8y/ngx-components/interval-picker';\nimport {\n DURATION_OPTIONS,\n DataPointsTableMap,\n DatapointTableItem,\n DatapointTableMapKey,\n DatapointWithValues,\n DatapointsSeriesDataMap,\n DatapointsTableConfig,\n Duration,\n GroupedDatapointTableItem,\n MeasurementRanges,\n SeriesDataWithResponse,\n TableColumnHeader,\n Value\n} from '../datapoints-table-widget.model';\n\nfunction mapToSourceValueObject([key, value]: [SourceId, string[]]): {\n key: SourceId;\n value: string[];\n} {\n return { key, value };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsTableViewService {\n constructor(private dataFetchingService: DataFetchingService) {}\n\n /**\n * Filters out inactive data points from the given array.\n *\n * @param datapoints - The array of data points to filter.\n * @returns An array of data points that are active.\n */\n filterOutInactiveDatapoints(datapoints: KPIDetails[]): KPIDetails[] {\n return datapoints.filter((datapoint: KPIDetails) => datapoint.__active);\n }\n\n hasMultipleDatapoints(datapoints: KPIDetails[]): boolean {\n const ids = datapoints.map(dp => dp.__target.id);\n return ids.length > 1;\n }\n\n /**\n * Returns a map of active data points device IDs with their corresponding series.\n *\n * Example output:\n * ```typescript\n * new Map([\n * [\n * \"844657202\",\n * [\n * \"c8y_Temperature.T\"\n * ]\n * ],\n * [\n * \"32666427\",\n * [\n * \"c8y_Battery.Battery\"\n * ]\n * ]\n * ]);\n * ```\n * @param datapoints - An array of data points.\n * @returns A map where the key is the data point ID and the value is an array of data point series.\n */\n groupSeriesByDeviceId(activeDatapoints: KPIDetails[]): DatapointsValuesDataMap {\n return activeDatapoints.reduce(\n (map: DatapointsValuesDataMap, { fragment, series, __target: { id } }: KPIDetails) => {\n const value = `${fragment}.${series}`;\n const existingValue = map.get(id) ?? [];\n map.set(id, [...existingValue, value]);\n return map;\n },\n new Map<SourceId, string[]>()\n );\n }\n\n /**\n * Retrieves the active data points series data and returns it as a map.\n *\n * @param datapointsValuesDataMap - A map of data point sources with their associated series.\n * @param config - The configuration of the data points table.\n * @param roundSeconds - Whether to round the seconds or not.\n * If true, the seconds will be rounded to 0.\n * If false, the seconds will be displayed as they are.\n * @returns A Promise that resolves to a Map object with data point IDs as keys and DataObject as values or undefined when all series has forbidden access.\n */\n async getAllActiveSeriesDataMap(\n datapointsValuesDataMap: DatapointsValuesDataMap,\n config: DatapointsTableConfig,\n roundSeconds: boolean\n ): Promise<Map<string | number, ISeries>> {\n const promises = Array.from(datapointsValuesDataMap).map(async ([source, series]) => {\n const params: ISeriesFilter = {\n dateFrom: config.dateFrom,\n dateTo: config.dateTo,\n source,\n series,\n aggregationType: config.aggregation as aggregationType\n };\n const { data, res }: IResult<ISeries> = await this.dataFetchingService.fetchSeriesData(\n params,\n roundSeconds\n );\n\n return { source, data, res };\n });\n\n const results: SeriesDataWithResponse[] = await Promise.all(promises);\n\n const allSeriesHasForbiddenAccess = results.every(item => item.res?.status === 403);\n if (allSeriesHasForbiddenAccess) {\n throw new Error('Access forbidden: All series have a 403 status code');\n }\n\n const filteredResults: SeriesDataWithResponse[] =\n this.filterOutElementsWithForbiddenResponses(results);\n\n const resultMap: DatapointsSeriesDataMap = new Map<string | number, ISeries>();\n filteredResults.forEach(result => resultMap.set(result.source, result.data));\n\n return resultMap;\n }\n\n /**\n * Creates an array of DatapointsWithValues based on the provided datapoints and datapointsSeriesDataMap.\n *\n * Finds an index of a current data point within series object and based on that index filters values array.\n *\n * @param datapoints - An array of data points.\n * @param datapointsSeriesDataMap - A map containing series data for data points.\n * @returns An array of DatapointsWithValues.\n */\n getDatapointsWithValues(\n datapoints: KPIDetails[],\n datapointsSeriesDataMap: DatapointsSeriesDataMap\n ): DatapointWithValues[] {\n return datapoints.map((dp: KPIDetails) => {\n const seriesData: ISeries = datapointsSeriesDataMap.get(dp.__target.id);\n\n if (!seriesData) {\n return { ...dp, values: {} };\n }\n\n // Find an index of a corresponding datapoint data, within series object.\n const datapointSeriesArrayIndex = seriesData.series.findIndex(\n s => s.name === dp.series && s.type === dp.fragment\n );\n\n const valuesFilteredByDatapointSeriesArrayIndex: MeasurementRanges = Object.fromEntries(\n Object.entries(seriesData.values).map(([key, arr]) => [\n key,\n arr.filter((_, index) => index === datapointSeriesArrayIndex)\n ])\n );\n\n return {\n ...dp,\n seriesUnit: seriesData.series[datapointSeriesArrayIndex]?.unit,\n values: valuesFilteredByDatapointSeriesArrayIndex\n };\n });\n }\n\n /**\n * Creates the column headers for the devices in the data points table.\n *\n * @param datapointsWithValues - An array of data points.\n * @returns An array of column headers for the devices.\n */\n getColumnHeaders(datapointsWithValues: KPIDetails[]): TableColumnHeader[] {\n return datapointsWithValues.map(\n ({ __target: { name }, label, renderType, unit }): TableColumnHeader => {\n return { deviceName: name, label, renderType, unit };\n }\n );\n }\n\n mapDatapointsWithValuesToList(datapointsWithValues: DatapointWithValues[]): DatapointTableItem[] {\n return datapointsWithValues.flatMap(dp => {\n if (!dp.values) {\n return [];\n }\n return Object.entries(dp.values).flatMap(([date, valuesArray]) => {\n const value = this.findMinMaxValues(valuesArray);\n if (value == null) {\n return [];\n }\n return [\n {\n dateAndTime: date,\n deviceName: dp.__target.name,\n fragment: dp.fragment,\n label: dp.label,\n redRangeMax: dp.redRangeMax,\n redRangeMin: dp.redRangeMin,\n renderType: dp.renderType,\n series: dp.series,\n value: value,\n yellowRangeMax: dp.yellowRangeMax,\n yellowRangeMin: dp.yellowRangeMin\n }\n ];\n });\n });\n }\n\n /**\n * Finds the overall minimum and maximum values from an array of objects containing 'min' and 'max' properties.\n *\n * If the array contains only one object, that object's 'min' and 'max' values will be returned.\n *\n * @param valuesArray - An array with objects, where each contains 'min' and 'max' properties.\n * @returns An object with the smallest 'min' and largest 'max' values found in the array.\n *\n * @example\n * const values = [\n * { min: 1, max: 10 }\n * ];\n *\n * const result = findMinMaxValues(values);\n * // result is { min: 1, max: 10 }\n */\n findMinMaxValues(valuesArray: MinMaxValues[]): Value | null {\n const validItems = valuesArray.filter(\n (item): item is Value => item && item.min != null && item.max != null\n );\n\n if (validItems.length === 0) {\n return null;\n }\n\n const initialValue: Value = { min: validItems[0].min, max: validItems[0].max };\n\n return validItems.reduce<Value>(\n (acc, item) => ({\n min: Math.min(acc.min, item.min),\n max: Math.max(acc.max, item.max)\n }),\n initialValue\n );\n }\n\n /**\n * Groups a list of data points by date and device, based on given references.\n *\n * @param dataList - The list of data points to be grouped.\n * @param references - The column headers that serve as references for grouping.\n * @returns An array of grouped data points, where each group corresponds to a unique date and device.\n */\n groupByDateAndDevice(\n dataList: DatapointTableItem[],\n references: TableColumnHeader[]\n ): GroupedDatapointTableItem[] {\n const map = this.generateDataPointMap(dataList, references);\n return this.mergeDatapoints(map);\n }\n\n /**\n * Generates and populates a map with data points.\n *\n * This function processes the provided data points and organizes them into a map structure\n * where each key is a unique combination of date and device identifiers, and the value is an\n * array of data points (or null values) associated with that key. This structured data is then\n * used in the data point table to render the data appropriately.\n *\n * @param dataList - The list of data point table items to be processed.\n * @param columnsHeadersReferences - The list of column headers used to determine the order and structure of the map values.\n * @returns A map where the key is a datapoint identifier containing the date and device name, and the value is an array of data point table items or null.\n */\n generateDataPointMap(\n dataList: DatapointTableItem[],\n columnsHeadersReferences: TableColumnHeader[]\n ): DataPointsTableMap {\n // Map to store the data points indexed by a unique identifier.\n const map: DataPointsTableMap = new Map<DatapointTableMapKey, (DatapointTableItem | null)[]>();\n\n dataList.forEach(obj => {\n // Generate a unique identifier for each data point using the date and device name.\n const dateKey = this.toISOFormat(obj.dateAndTime);\n const datapointIdentifier: DatapointTableMapKey = `${dateKey}_${obj.deviceName}`;\n\n // Initialize the map entry if it does not exist with a unique identifier.\n if (!map.has(datapointIdentifier)) {\n map.set(datapointIdentifier, Array(columnsHeadersReferences.length).fill(null));\n }\n\n // Find the index of the reference that matches the current data point.\n const matchingColumnIndex = columnsHeadersReferences.findIndex(\n ref => ref.deviceName === obj.deviceName && ref.label === obj.label\n );\n\n // Update the map entry with the data point.\n const tableItem: DatapointTableItem[] = map.get(datapointIdentifier);\n if (tableItem) {\n tableItem[matchingColumnIndex] = { ...obj };\n }\n });\n\n return map;\n }\n\n /**\n * Merges the data points from the given map into an array of grouped data point table items.\n *\n * @param map - The map containing the data points to be merged.\n * @returns An array of grouped data point table items.\n */\n mergeDatapoints(map: DataPointsTableMap): GroupedDatapointTableItem[] {\n const mergedData: GroupedDatapointTableItem[] = [];\n\n map.forEach((values, datapointIdentifier) => {\n const [dateKey, deviceName] = datapointIdentifier.split('_');\n const validDataPoint = values.some(item => item && Object.keys(item.value).length > 0);\n\n if (validDataPoint) {\n mergedData.push({\n dateAndTime: dateKey,\n deviceName: deviceName,\n rowItems: values.map(item => (item ? { ...item } : null))\n });\n }\n });\n\n return mergedData;\n }\n\n sortDataByDateDescending(data: GroupedDatapointTableItem[]): GroupedDatapointTableItem[] {\n return data.sort(\n (a, b) => new Date(b.dateAndTime).getTime() - new Date(a.dateAndTime).getTime()\n );\n }\n\n /**\n * Prepares the updated time range based on the selected interval.\n *\n * In case of a 'custom' interval or no quantity, the original date range is returned.\n *\n * @param interval - The selected interval type.\n * @returns An object containing the `dateFrom` and `dateTo` in ISO string format.\n */\n prepareTimeRange(\n interval: Interval['id'],\n dateFromInput: string,\n dateToInput: string\n ): { dateFrom: string; dateTo: string } {\n if (!interval || interval === INTERVAL_VALUES.custom) {\n return { dateFrom: dateFromInput, dateTo: dateToInput };\n }\n\n const selected: Duration = DURATION_OPTIONS.find(\n selectedDuration => selectedDuration.id === interval\n );\n\n if (!selected?.amount) {\n return { dateFrom: dateFromInput, dateTo: dateToInput };\n }\n\n const now = new Date();\n\n return {\n dateFrom: this.subtractTime(now, selected.amount, selected.unit).toISOString(),\n dateTo: now.toISOString()\n };\n }\n\n /**\n * Subtracts an amount of time from a given date.\n *\n * @param date - The original date.\n * @param amount - The amount of time units to subtract.\n * @param unit - The unit of time to subtract (e.g., minutes, hours, days, weeks, months).\n * @returns A new date with the specified time subtracted.\n */\n subtractTime(date: Date, amount: number, unit: string): Date {\n const newDate = new Date(date);\n\n switch (unit) {\n case INTERVAL_VALUES.minutes:\n newDate.setUTCMinutes(newDate.getUTCMinutes() - amount);\n break;\n case INTERVAL_VALUES.hours:\n newDate.setUTCHours(newDate.getUTCHours() - amount);\n break;\n case INTERVAL_VALUES.days:\n newDate.setUTCDate(newDate.getUTCDate() - amount);\n break;\n case INTERVAL_VALUES.weeks:\n newDate.setUTCDate(newDate.getUTCDate() - amount * 7);\n break;\n case INTERVAL_VALUES.months:\n this.subtractMonthsAndAdjustDay(newDate, amount);\n break;\n }\n return newDate;\n }\n\n getSeriesWithoutPermissionToRead(\n activeDatapointsSeriesData: Map<string | number, ISeries> | undefined,\n activeDatapointsIdsWithSeries: DatapointsValuesDataMap\n ): { key: SourceId; value: string[] }[] {\n if (!activeDatapointsSeriesData) {\n // Returns all activeDatapointsIdsWithSeries entries if activeDatapointsSeriesData is undefined.\n // It means that the user does not have permission to see any of the selected datapoints data.\n return Array.from(activeDatapointsIdsWithSeries, mapToSourceValueObject);\n }\n\n const availableSources = new Set(activeDatapointsSeriesData.keys());\n\n return Array.from(activeDatapointsIdsWithSeries)\n .filter(([source]) => !availableSources.has(source))\n .map(mapToSourceValueObject);\n }\n\n hasSecondsAndMillisecondsEqualZero(timeString: string): boolean {\n if (!timeString) {\n return false;\n }\n\n const date = new Date(timeString);\n if (isNaN(date.getTime())) {\n return false;\n }\n\n return date.getUTCSeconds() === 0 && date.getUTCMilliseconds() === 0;\n }\n\n /**\n * Converts a date string to ISO format.\n *\n * @param dateStr - The date string to convert.\n * @returns The ISO format of the given date string.\n */\n private toISOFormat(dateStr: string): string {\n return new Date(dateStr).toISOString();\n }\n\n private filterOutElementsWithForbiddenResponses(\n seriesDataWithResponse: SeriesDataWithResponse[]\n ): SeriesDataWithResponse[] {\n return seriesDataWithResponse.filter(item => {\n return !(item.res?.status === 403);\n });\n }\n\n private subtractMonthsAndAdjustDay(date: Date, monthsToSubtract: number): void {\n const currentMonth = date.getUTCMonth();\n const expectedTargetMonth = this.calculateTargetMonth(currentMonth, monthsToSubtract);\n\n date.setUTCMonth(currentMonth - monthsToSubtract);\n\n const actualMonth = date.getUTCMonth();\n const dayDoesNotExistInTargetMonth = actualMonth !== expectedTargetMonth;\n\n if (dayDoesNotExistInTargetMonth) {\n this.setToLastDayOfPreviousMonth(date);\n }\n }\n\n /**\n * Calculates the target month number (0-11) after subtracting months from the current month.\n * Handles negative month numbers by normalizing them to the valid 0-11 range.\n *\n * Examples:\n * - January(0) - 1 month = December(11)\n * - March(2) - 4 months = November(10)\n * - December(11) - 1 month = November(10)\n *\n * @param currentMonth - Current month (0-11, where 0 is January)\n * @param monthsToSubtract - Number of months to subtract\n * @returns Normalized month number in range 0-11\n */\n private calculateTargetMonth(currentMonth: number, monthsToSubtract: number): number {\n return (currentMonth - monthsToSubtract + 12) % 12;\n }\n\n /**\n * Sets the date to the last day of the previous month.\n * Using 0 as dateValue makes JavaScript automatically calculate\n * last day of previous month, per JavaScript Date API behavior.\n * @param date - Date to modify\n */\n private setToLastDayOfPreviousMonth(date: Date): void {\n date.setUTCDate(0);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TableColumnHeader, RENDER_TYPES_LABELS } from '../datapoints-table-widget.model';\n\n/**\n * Creates a column header title message.\n *\n * ```html\n * title=\"{{ header | columnTitle }}\"\n * ```\n * The output will be e.g.: 'c8y_Temperature → T [T] (Area)'.\n */\n@Pipe({\n name: 'columnTitle',\n standalone: true\n})\nexport class ColumnTitlePipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n /**\n * Transforms the column header into a formatted string with label and optionally unit and render type.\n *\n * @param columnHeader - The column header object.\n * @returns The formatted string with label, unit, and render type.\n */\n transform(columnHeader: TableColumnHeader): string {\n const label = columnHeader.label.trim();\n const unit = columnHeader.unit ? `[${columnHeader.unit.trim()}]` : '';\n const renderType = columnHeader.renderType\n ? this.translateService.instant(RENDER_TYPES_LABELS[columnHeader.renderType])\n : '';\n\n if (!renderType) {\n return `${label} ${unit}`.trim();\n }\n\n return `${label} ${unit} (${renderType})`.trim();\n }\n}\n","import {\n AfterViewInit,\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnDestroy,\n Output\n} from '@angular/core';\n\n/**\n * Directive to listen for scroll events on a virtual scroll container.\n * Emits `scrolled` and `scrolledToTop` events.\n *\n * The directive listens for scroll events on a virtual scroll container.\n * - When the container is scrolled by at least 50 pixels (or a custom threshold), the `scrolled` event is emitted.\n * - When the container is scrolled to the top, the `scrolledToTop` event is emitted.\n *\n */\n@Directive({\n selector: '[c8yVirtualScrollListener]',\n standalone: true\n})\nexport class VirtualScrollListenerDirective implements AfterViewInit, OnDestroy {\n /**\n * Pixel threshold for emitting the scrolled event.\n */\n @Input() scrollThreshold = 50;\n /**\n * Event emitted when the virtual scroll container is scrolled by at least 50 pixels.\n */\n @Output() scrolled = new EventEmitter<void>();\n /**\n * Event emitted when the virtual scroll container is scrolled to the top.\n */\n @Output() scrolledToTop = new EventEmitter<void>();\n\n private virtualScrollContainer: HTMLElement;\n private lastScrollTop = 0;\n\n constructor(\n private el: ElementRef,\n private ngZone: NgZone\n ) {}\n\n ngAfterViewInit(): void {\n this.virtualScrollContainer = this.el.nativeElement.querySelector(\n '.cdk-virtual-scroll-viewport'\n );\n\n if (this.virtualScrollContainer) {\n this.ngZone.runOutsideAngular(() => {\n this.virtualScrollContainer.addEventListener('scroll', this.onScroll.bind(this));\n });\n }\n }\n\n ngOnDestroy(): void {\n if (this.virtualScrollContainer) {\n this.virtualScrollContainer.removeEventListener('scroll', this.onScroll.bind(this));\n }\n }\n\n /**\n * Handles the scroll event. Emits `scrolled` event if scrolled by at least `scrollThreshold` pixels\n * and `scrolledToTop` event if scrolled to the top.\n * @param event - The scroll event.\n */\n private onScroll(event: Event): void {\n const target = event.target as HTMLElement;\n const scrollTop = target.scrollTop;\n\n if (Math.abs(scrollTop - this.lastScrollTop) > this.scrollThreshold) {\n this.lastScrollTop = scrollTop;\n this.ngZone.run(() => this.scrolled.emit());\n }\n\n if (scrollTop === 0) {\n this.ngZone.run(() => this.scrolledToTop.emit());\n }\n }\n}\n","import { Directive, ElementRef, Input, OnInit, Renderer2 } from '@angular/core';\n\n@Directive({\n selector: '[c8yDynamicColumn]',\n standalone: true\n})\nexport class DynamicColumnDirective implements OnInit {\n @Input('c8yDynamicColumn') numberOfColumns: number;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2\n ) {}\n\n ngOnInit() {\n this.updateColumnClass();\n }\n\n private updateColumnClass() {\n let className = '';\n switch (this.numberOfColumns) {\n case 1:\n className = 'col-md-12';\n break;\n case 2:\n className = 'col-md-6';\n break;\n default:\n if (this.numberOfColumns >= 3) {\n className = 'col-md-3';\n }\n break;\n }\n\n if (className) {\n this.renderer.addClass(this.el.nativeElement, className);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output\n} from '@angular/core';\nimport {\n AggregationOption,\n CommonModule,\n DocsModule,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n DynamicComponentModule,\n ListGroupModule,\n gettext\n} from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n ColorRangeBoundaries,\n TableColumnHeader,\n GroupedDatapointTableItem\n} from '../../datapoints-table-widget.model';\nimport { AdjustAggregatedTimeRangePipe } from '../adjust-aggregated-time-range.pipe';\nimport { ApplyRangeClassPipe } from '../apply-range-class.pipe';\nimport { ColumnTitlePipe } from '../column-title.pipe';\nimport { VirtualScrollListenerDirective } from '../virtual-scroll-listener.directive';\nimport { DynamicColumnDirective } from './dynamic-column.directive';\n\n@Component({\n selector: 'c8y-datapoints-table',\n templateUrl: './datapoints-table.component.html',\n host: { class: 'd-col flex-grow' },\n standalone: true,\n imports: [\n AdjustAggregatedTimeRangePipe,\n ApplyRangeClassPipe,\n ColumnTitlePipe,\n CommonModule,\n DocsModule,\n DynamicColumnDirective,\n DynamicComponentModule,\n ListGroupModule,\n VirtualScrollListenerDirective\n ],\n /**\n * Used to prevent 'getRangeValues' from being called on every change detection cycle.\n */\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DatapointsTableComponent implements OnInit, OnChanges {\n @Input() aggregationType: AggregationOption;\n @Input() datapointsTableItems: GroupedDatapointTableItem[];\n @Input() devicesColumnHeaders: TableColumnHeader[];\n @Input() decimalPlaces: number;\n @Input() hasMultipleDatapoints: boolean;\n @Input() isLoading: boolean;\n @Input() seriesWithoutPermissionToReadCount: number;\n @Output() isScrolling = new EventEmitter<boolean>();\n\n hasNoPermissionsToReadAnyMeasurement = false;\n missingAllPermissionsAlert = new DynamicComponentAlertAggregator();\n\n /**\n * Default fraction size format for numbers with decimal places.\n */\n private fractionSize = '1.2-2';\n\n ngOnInit(): void {\n if (typeof this.decimalPlaces === 'number' && !Number.isNaN(this.decimalPlaces)) {\n this.fractionSize = `1.${this.decimalPlaces}-${this.decimalPlaces}`;\n }\n }\n\n ngOnChanges(): void {\n if (!this.seriesWithoutPermissionToReadCount) {\n return;\n }\n\n this.missingAllPermissionsAlert.clear();\n this.handleNoPermissionErrorMessage();\n }\n\n onListScrolled(): void {\n this.isScrolling.emit(true);\n }\n\n onListScrolledToTop(): void {\n this.isScrolling.emit(false);\n }\n\n getRangeValues(row: KPIDetails): ColorRangeBoundaries {\n return {\n yellowRangeMin: row.yellowRangeMin,\n yellowRangeMax: row.yellowRangeMax,\n redRangeMin: row.redRangeMin,\n redRangeMax: row.redRangeMax\n };\n }\n\n /**\n * Determines the fraction size format based on whether the number is an integer or has decimal places.\n *\n * @param value - The number to be formatted.\n * @returns Returns '1.0-0' if the number is an integer, otherwise returns the current fraction size.\n */\n getFractionSize(value: number): string {\n return value % 1 === 0 ? '1.0-0' : this.fractionSize;\n }\n\n private handleNoPermissionErrorMessage(): void {\n this.hasNoPermissionsToReadAnyMeasurement =\n this.seriesWithoutPermissionToReadCount === this.devicesColumnHeaders.length;\n\n if (this.hasNoPermissionsToReadAnyMeasurement) {\n this.showMessageForMissingPermissionsForAllSeries();\n }\n }\n\n private showMessageForMissingPermissionsForAllSeries(): void {\n this.missingAllPermissionsAlert.addAlerts(\n new DynamicComponentAlert({\n allowHtml: true,\n text: gettext(`<p>To view data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>`),\n type: 'system'\n })\n );\n }\n}\n","<ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ header.label }} {{ header.unit }}\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- The record list -->\n <ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\"\n >\n {{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.max ?? '' | number: getFractionSize(row.value.max) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, OnDestroy, OnInit, Optional, signal } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ISeries } from '@c8y/client';\nimport {\n AlertService,\n CommonModule,\n DismissAlertStrategy,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n WidgetGlobalAutoRefreshService,\n gettext,\n globalAutoRefreshLoading\n} from '@c8y/ngx-components';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DataFetchingService,\n DatapointsExportSelectorComponent,\n DatapointsValuesDataMap,\n ExportConfig,\n SourceId,\n dateRangeValidator\n} from '@c8y/ngx-components/datapoints-export-selector';\nimport { INTERVAL_VALUES } from '@c8y/ngx-components/interval-picker';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subject, Subscription, debounceTime, takeUntil } from 'rxjs';\nimport {\n DEFAULT_DPT_REFRESH_INTERVAL_VALUE,\n DatapointTableItem,\n DatapointWithValues,\n DatapointsTableConfig,\n GroupedDatapointTableItem,\n TableColumnHeader\n} from '../datapoints-table-widget.model';\nimport { DatapointsTableService } from '../datapoints-table.service';\nimport { DateRangePickerComponent } from '../date-range-picker.component';\nimport { DatapointsReloadComponent } from './datapoints-reload/datapoints-reload.component';\nimport { DatapointsTableViewService } from './datapoints-table-view.service';\nimport { DatapointsTableComponent } from './datapoints-table/datapoints-table.component';\n\n@Component({\n selector: 'c8y-datapoints-table-view',\n templateUrl: './datapoints-table-view.component.html',\n host: { class: 'd-col fit-h' },\n standalone: true,\n imports: [\n CommonModule,\n DatapointsExportSelectorComponent,\n DatapointsReloadComponent,\n DatapointsTableComponent,\n DateRangePickerComponent,\n ReactiveFormsModule\n ]\n})\nexport class DatapointsTableViewWidgetComponent implements OnInit, OnDestroy {\n /**\n * Data points table widget config.\n */\n @Input() config: DatapointsTableConfig;\n\n alerts: DynamicComponentAlertAggregator;\n\n /**\n * Represents the data points where __active property is set to true.\n */\n activeDatapoints: KPIDetails[] = [];\n /**\n * Represents the custom CSS style for the export selector component.\n */\n containerClass: string;\n /**\n * An array of objects representing datapoints with their corresponding values.\n * Used to populate the CSV/Excel file with data.\n */\n datapointsWithValues: DatapointWithValues[];\n /**\n * An array of `GroupedDatapointTableItem` objects representing the datapoints table items.\n * Used to populate the table with data.\n */\n datapointsTableItems: GroupedDatapointTableItem[] = [];\n\n devicesColumnHeaders: TableColumnHeader[];\n /**\n * Represents a configuration options used by a c8y-datapoints-export-selector.\n */\n exportConfig: ExportConfig;\n\n formGroup: ReturnType<DatapointsTableViewWidgetComponent['createForm']>;\n /**\n * Indicates whether there is more than one data point.\n * If is true, then a column 'Device' will be displayed in the table.\n */\n hasMultipleDatapoints: boolean;\n /**\n * Indicates whether refreshing should be enabled or disabled.\n * It's 'true' when user is not allowed to view a measurements.\n */\n isRefreshDisabled = false;\n /**\n * Indicates whether the component is in the initial request state\n * where data for a table structure is being prepared.\n */\n isInitialRequest = true;\n /**\n * Current isLoading state. Indicates whether the data is being loaded.\n */\n isLoading$ = new BehaviorSubject<boolean>(true);\n\n isExportModalOpen = false;\n\n isScrolling = signal(false);\n\n seriesWithoutPermissionToRead: { key: SourceId; value: string[] }[];\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\n private destroy$: Subject<void> = new Subject();\n private scrollingSubject$: Subject<boolean> = new Subject<boolean>();\n private subscription: Subscription;\n private isFailedToFetchSeriesData: boolean;\n /**\n * Indicates if the alert has already been displayed and can be dismissed.\n * The message is only displayed when a component is initialized.\n */\n private isMissingAnyPermissionAlertShown = false;\n\n constructor(\n private alertService: AlertService,\n private dataFetchingService: DataFetchingService,\n private datapointsTableConfigService: DatapointsTableService,\n private datapointsTableViewService: DatapointsTableViewService,\n private formBuilder: FormBuilder,\n private translateService: TranslateService,\n private widgetGlobalAutoRefresh: WidgetGlobalAutoRefreshService,\n @Optional() private dashboardContextComponent: ContextDashboardComponent\n ) {}\n\n async ngOnInit(): Promise<void> {\n if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n this.containerClass = 'a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto';\n }\n\n /**\n * Legacy widget used realtime so it must be converted to refresh approach\n * if it was enabled before migration.\n */\n if (this.config.widgetInstanceGlobalTimeContext) {\n this.config.widgetInstanceGlobalAutoRefreshContext = true;\n this.config.widgetInstanceGlobalTimeContext = false;\n this.config.displaySettings.globalAutoRefreshContext = true;\n }\n\n if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n this.handleGlobalRefreshLoading();\n this.handleGlobalTimeContextSettings();\n }\n\n this.setScrollingSubscription();\n\n const isLegacyWidgetRealtimeActive =\n this.config.realtime &&\n !this.config.hasOwnProperty('decimalPlaces') &&\n !this.config.hasOwnProperty('refreshInterval') &&\n !this.config.hasOwnProperty('isAutoRefreshEnabled');\n\n if (isLegacyWidgetRealtimeActive) {\n this.setDefaultRefreshRelatedProperties();\n }\n\n if (this.config.interval !== INTERVAL_VALUES.custom) {\n this.recalculateIntervalToMatchFromNowDate();\n }\n\n if (this.config.displayDateSelection) {\n this.prepareDateRangeForm();\n }\n\n await this.prepareTableData();\n\n this.exportConfig = {\n aggregation: this.config.aggregation,\n dateFrom: this.config.dateFrom,\n dateTo: this.config.dateTo,\n datapointDetails: this.activeDatapoints.map(({ __target, fragment, series }) => ({\n deviceName: __target.name,\n source: __target.id,\n valueFragmentSeries: series,\n valueFragmentType: fragment\n }))\n };\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onDateChange(data: { dateFrom?: string | null; dateTo?: string | null }): void {\n if (this.formGroup.invalid) {\n return;\n }\n\n if (data.dateFrom) {\n this.config.dateFrom = data.dateFrom;\n }\n if (data.dateTo) {\n this.config.dateTo = data.dateTo;\n }\n this.prepareTableData();\n\n this.updateExportConfigDateRange();\n }\n\n onExportModalOpen(isOpened: boolean): void {\n this.isExportModalOpen = isOpened;\n }\n\n onScrolling(value: boolean): void {\n this.scrollingSubject$.next(value);\n }\n\n async onCountdownEnded(): Promise<void> {\n const dateRange = this.datapointsTableViewService.prepareTimeRange(\n this.config.interval,\n this.config.dateFrom,\n this.config.dateTo\n );\n\n this.config.dateFrom = dateRange.dateFrom;\n this.config.dateTo = dateRange.dateTo;\n\n this.updateExportConfigDateRange();\n await this.prepareTableData(false);\n\n this.onScrolling(false);\n }\n\n private handleGlobalTimeContextSettings(): void {\n this.config.dateFrom = this.dataFetchingService.adjustDate(this.config.date[0], 0, false);\n this.config.dateTo = this.dataFetchingService.adjustDate(this.config.date[1], 0, false);\n }\n\n /**\n * Sets up the scrolling subscription.\n *\n * Ensures similar UX as in the alarms countdown-pause logic.\n */\n private setScrollingSubscription(): void {\n this.subscription = this.scrollingSubject$\n .pipe(debounceTime(300))\n .subscribe(value => this.isScrolling.set(value));\n }\n\n private setDefaultRefreshRelatedProperties(): void {\n this.config.isAutoRefreshEnabled = true;\n this.config.refreshInterval = DEFAULT_DPT_REFRESH_INTERVAL_VALUE;\n }\n\n private recalculateIntervalToMatchFromNowDate(): void {\n if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n return;\n }\n\n const { dateFrom, dateTo } = this.datapointsTableConfigService.calculateDateRange(\n this.config.interval\n );\n this.config.dateFrom = dateFrom;\n this.config.dateTo = dateTo;\n }\n\n private prepareDateRangeForm() {\n this.formGroup = this.createForm();\n }\n\n private createForm() {\n return this.formBuilder.group(\n {\n dateFrom: new FormControl(this.config.dateFrom),\n dateTo: new FormControl(this.config.dateTo)\n },\n { validators: dateRangeValidator }\n );\n }\n\n /**\n * Prepares the table data by:\n * - filtering out inactive data points,\n * - checking if there are multiple devices as a source of data points,\n * - getting the column headers for devices,\n * - getting the series data for active data points (API call),\n * - preparing data points with values list,\n * - mapping data points with values to list items,\n * - grouping data points by date and device,\n * - sorting data by date descending.\n *\n * @param roundSeconds - Whether to round the seconds or not.\n * If true, the seconds will be rounded to 0.\n * If false, the seconds will be displayed as they are.\n */\n private async prepareTableData(roundSeconds = true): Promise<void> {\n this.isLoading$.next(true);\n\n if (this.isInitialRequest) {\n if (this.config.datapoints?.length) {\n this.config.datapoints.forEach(datapoint =>\n this.assignContextFromContextDashboard(datapoint)\n );\n }\n\n this.activeDatapoints = this.datapointsTableViewService.filterOutInactiveDatapoints(\n this.config.datapoints\n );\n\n this.hasMultipleDatapoints = this.datapointsTableViewService.hasMultipleDatapoints(\n this.activeDatapoints\n );\n\n this.devicesColumnHeaders = this.datapointsTableViewService.getColumnHeaders(\n this.activeDatapoints\n );\n\n this.isInitialRequest = false;\n }\n\n const activeDatapointsIdsWithSeries: DatapointsValuesDataMap =\n this.datapointsTableViewService.groupSeriesByDeviceId(this.activeDatapoints);\n\n const activeDatapointsSeriesData: Map<string | number, ISeries> =\n await this.getActiveDatapointsSeriesDataMap(\n activeDatapointsIdsWithSeries,\n this.config,\n roundSeconds\n );\n\n if (this.isFailedToFetchSeriesData) {\n return;\n }\n\n this.seriesWithoutPermissionToRead =\n this.datapointsTableViewService.getSeriesWithoutPermissionToRead(\n activeDatapointsSeriesData,\n activeDatapointsIdsWithSeries\n );\n\n if (\n !this.isMissingAnyPermissionAlertShown &&\n this.seriesWithoutPermissionToRead?.length > 0 &&\n activeDatapointsSeriesData?.size\n ) {\n this.handleMissingAnyPermissionErrorMessage();\n this.isMissingAnyPermissionAlertShown = true;\n }\n\n if (!activeDatapointsSeriesData) {\n return;\n }\n\n this.datapointsWithValues = this.datapointsTableViewService.getDatapointsWithValues(\n this.activeDatapoints,\n activeDatapointsSeriesData\n );\n\n const datapointsListItems: DatapointTableItem[] =\n this.datapointsTableViewService.mapDatapointsWithValuesToList(this.datapointsWithValues);\n\n const groupedDatapointsListItems: GroupedDatapointTableItem[] =\n this.datapointsTableViewService.groupByDateAndDevice(\n datapointsListItems,\n this.devicesColumnHeaders\n );\n\n this.datapointsTableItems = this.datapointsTableViewService.sortDataByDateDescending(\n groupedDatapointsListItems\n );\n\n this.isLoading$.next(false);\n }\n\n /**\n * Retrieves the active data points series data and returns it as a map.\n *\n * It's a wrapper method with try-catch block.\n *\n * @param datapointsIdsWithSeries - A map of data point IDs with their associated series.\n * @param config - The configuration of the data points table.\n * @param roundSeconds - Whether to round the seconds or not.\n * If true, the seconds will be rounded to 0.\n * If false, the seconds will be displayed as they are.\n * @returns A Promise that resolves to a Map object with data point IDs as keys and DataObject as values.\n */\n private async getActiveDatapointsSeriesDataMap(\n datapointsIdsWithSeries: DatapointsValuesDataMap,\n config: DatapointsTableConfig,\n roundSeconds: boolean\n ): Promise<Map<string | number, ISeries>> {\n try {\n this.isFailedToFetchSeriesData = false;\n return await this.datapointsTableViewService.getAllActiveSeriesDataMap(\n datapointsIdsWithSeries,\n config,\n roundSeconds\n );\n } catch (error) {\n this.isLoading$.next(false);\n this.handleFetchError(error);\n }\n }\n\n private handleFetchError(error: Error): void {\n // handle HTTP 422 errors (Unprocessable Entity), which occur when the user provides a series in an invalid format\n if (error['status'] === 422) {\n this.alerts.setAlertGroupDismissStrategy('warning', DismissAlertStrategy.NONE);\n\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'danger',\n text: error.message,\n allowHtml: true\n })\n );\n this.isRefreshDisabled = true;\n return;\n }\n\n if (error?.message.includes('403')) {\n this.alerts.setAlertGroupDismissStrategy('warning', DismissAlertStrategy.NONE);\n this.isRefreshDisabled = true;\n return;\n }\n\n const isTimeoutError = error?.name === 'TimeoutError';\n const errorMessage = isTimeoutError\n ? this.TIMEOUT_ERROR_TEXT\n : (error?.message ?? this.SERVER_ERROR_TEXT);\n\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text: errorMessage\n })\n );\n\n this.isFailedToFetchSeriesData = true;\n this.alertService.addServerFailure(error);\n }\n\n private handleMissingAnyPermissionErrorMessage() {\n this.alerts.setAlertGroupDismissStrategy('system', DismissAlertStrategy.TEMPORARY);\n\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n allowHtml: true,\n text: this.getMissingPermissionsMessage(),\n type: 'system'\n })\n );\n }\n\n private getMissingPermissionsMessage(): string {\n const baseMessage = this.translateService.instant(\n gettext(`You don't have permissions to read the following series:`)\n );\n\n const formattedList = this.seriesWithoutPermissionToRead\n .map(datapoint => `<li>${datapoint.key.valueOf()}_${datapoint.value}</li>`)\n .join('');\n\n return `\n <div>\n <p>${baseMessage}</p>\n <ul>\n ${formattedList}\n </ul>\n <p><strong>Note:</strong> The name convention for each list item is: <code>[source]_[fragment.series]</code></p>\n </div>\n `;\n }\n\n private handleGlobalRefreshLoading(): void {\n this.isLoading$\n .pipe(globalAutoRefreshLoading(this.widgetGlobalAutoRefresh), takeUntil(this.destroy$))\n .subscribe();\n }\n\n private updateExportConfigDateRange(): void {\n this.config.dateTo = this.adjustTargetDateBasedOnConditionTime(\n this.config.dateFrom,\n this.config.dateTo\n );\n\n this.config.dateFrom = this.adjustTargetDateBasedOnConditionTime(\n this.config.dateTo,\n this.config.dateFrom\n );\n\n this.syncExportConfigDates();\n }\n\n private adjustTargetDateBasedOnConditionTime(conditionDate: string, targetDate: string): string {\n if (this.datapointsTableViewService.hasSecondsAndMillisecondsEqualZero(conditionDate)) {\n return this.dataFetchingService.adjustDate(targetDate, 0, true);\n }\n return targetDate;\n }\n\n private syncExportConfigDates(): void {\n if (!this.exportConfig) {\n return;\n }\n this.exportConfig.dateFrom = this.config.dateFrom;\n this.exportConfig.dateTo = this.config.dateTo;\n }\n\n private assignContextFromContextDashboard(datapoint: KPIDetails) {\n if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.dashboardContextComponent?.context;\n if (context?.id) {\n const { name, id } = context;\n datapoint.__target = { name, id };\n }\n }\n}\n","<div class=\"d-flex gap-16 p-l-16 p-r-16 flex-wrap\">\n <ng-container *ngIf=\"config.displayDateSelection\">\n <form [formGroup]=\"formGroup\">\n <c8y-date-range-picker\n class=\"d-contents\"\n [isEmittingDateChange]=\"true\"\n [showLabel]=\"true\"\n (updatedDate)=\"onDateChange($event)\"\n ></c8y-date-range-picker>\n </form>\n </ng-container>\n <ng-container *ngIf=\"config.datapoints.length > 0\">\n <c8y-datapoints-reload\n class=\"d-contents\"\n [isAutoRefreshEnabled]=\"config.isAutoRefreshEnabled\"\n [refreshInterval]=\"config.refreshInterval\"\n [isRefreshDisabled]=\"isRefreshDisabled\"\n [isLoading]=\"isLoading$\"\n [isScrolling]=\"isScrolling()\"\n [isExportModalOpen]=\"isExportModalOpen\"\n [widgetInstanceGlobalAutoRefreshContext]=\"config.widgetInstanceGlobalAutoRefreshContext\"\n (onCountdownEnded)=\"onCountdownEnded()\"\n ></c8y-datapoints-reload>\n </ng-container>\n <c8y-datapoints-export-selector\n class=\"d-contents\"\n [containerClass]=\"containerClass\"\n [exportConfig]=\"exportConfig\"\n (isOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector>\n</div>\n<ng-container *ngIf=\"devicesColumnHeaders\">\n <c8y-datapoints-table\n [aggregationType]=\"config.aggregation\"\n [datapointsTableItems]=\"datapointsTableItems\"\n [decimalPlaces]=\"config.decimalPlaces\"\n [devicesColumnHeaders]=\"devicesColumnHeaders\"\n [hasMultipleDatapoints]=\"hasMultipleDatapoints\"\n [isLoading]=\"isLoading$ | async\"\n [seriesWithoutPermissionToReadCount]=\"seriesWithoutPermissionToRead?.length\"\n (isScrolling)=\"onScrolling($event)\"\n ></c8y-datapoints-table>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.DatapointsTableService","i5","aggregationType","AggregationTypeEnum","i2","CommonModule","i3","i4","i3.DatapointsTableService","i4.DatapointsTableViewService","i6","i7","i8"],"mappings":"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"}
|