@c8y/ngx-components 1023.76.0 → 1023.78.1
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/alarms/cockpit/index.d.ts.map +1 -1
- package/alarms/devicemanagement/index.d.ts.map +1 -1
- package/alarms/index.d.ts +2 -25
- package/alarms/index.d.ts.map +1 -1
- package/asset-properties/index.d.ts +63 -0
- package/asset-properties/index.d.ts.map +1 -1
- package/assets-navigator/index.d.ts +4 -0
- package/assets-navigator/index.d.ts.map +1 -1
- package/exports/list/index.d.ts +7 -4
- package/exports/list/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-advanced-software-management.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +12 -12
- package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +21 -21
- package/fesm2022/c8y-ngx-components-ai.mjs +3 -3
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +40 -40
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +15 -10
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +11 -37
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +91 -132
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-api.mjs +7 -7
- package/fesm2022/c8y-ngx-components-app-logs.mjs +10 -10
- package/fesm2022/c8y-ngx-components-application-access-list.mjs +12 -12
- package/fesm2022/c8y-ngx-components-application-access-user-application-access-user-details-wrapper.mjs +3 -3
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +223 -69
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-CEphJoqx.mjs → c8y-ngx-components-asset-property-grid.component-BJOPTjF1.mjs} +13 -13
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-CEphJoqx.mjs.map → c8y-ngx-components-asset-property-grid.component-BJOPTjF1.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +36 -32
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +120 -120
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs +7 -7
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +13 -13
- 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-extra-css-branding-editor.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor-lazy.mjs +3 -3
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +15 -15
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +6 -6
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +36 -36
- package/fesm2022/c8y-ngx-components-branding-shared.mjs +13 -13
- package/fesm2022/c8y-ngx-components-child-devices.mjs +13 -13
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +40 -40
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-DX9Rgjgl.mjs → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-tP8yUdy3.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-DX9Rgjgl.mjs.map → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-tP8yUdy3.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CRpLJ5H7.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-wNQ45CJ1.mjs} +11 -11
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CRpLJ5H7.mjs.map → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-wNQ45CJ1.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-2rDsrxcs.mjs → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-BrYcCHYL.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-2rDsrxcs.mjs.map → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-BrYcCHYL.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-BJNoqWZf.mjs → c8y-ngx-components-computed-asset-properties-event-count-config.component-BBKuA2rZ.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-BJNoqWZf.mjs.map → c8y-ngx-components-computed-asset-properties-event-count-config.component-BBKuA2rZ.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DYac6foX.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-uEdtPWC0.mjs} +5 -5
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DYac6foX.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-uEdtPWC0.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-3yTe6lIr.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-BGhex-OP.mjs} +5 -5
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-3yTe6lIr.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-BGhex-OP.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
- package/fesm2022/c8y-ngx-components-connectivity.mjs +53 -53
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +11 -11
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C7yXSDYC.mjs → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-BkwPfkeK.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C7yXSDYC.mjs.map → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-BkwPfkeK.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-w8N16Z3t.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-4aO0U4qs.mjs} +10 -10
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-w8N16Z3t.mjs.map → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-4aO0U4qs.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component--1OYYpR2.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-1xx4pGiq.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component--1OYYpR2.mjs.map → c8y-ngx-components-context-dashboard-dashboard-version-history.component-1xx4pGiq.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs +3 -3
- package/fesm2022/c8y-ngx-components-context-dashboard-state.mjs +3 -3
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +108 -108
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DVEnCRzW.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DFytXNdc.mjs} +16 -16
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DVEnCRzW.mjs.map → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DFytXNdc.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +12 -12
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs +6 -6
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +22 -22
- package/fesm2022/c8y-ngx-components-data-broker.mjs +7 -7
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs +3 -3
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +24 -24
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +13 -13
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-services.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs +4 -4
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +43 -43
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +36 -36
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs +16 -16
- package/fesm2022/c8y-ngx-components-device-enrolment-modal.mjs +9 -9
- package/fesm2022/c8y-ngx-components-device-enrolment.mjs +6 -6
- package/fesm2022/c8y-ngx-components-device-grid.mjs +43 -43
- package/fesm2022/c8y-ngx-components-device-list.mjs +22 -22
- package/fesm2022/c8y-ngx-components-device-map.mjs +12 -12
- package/fesm2022/c8y-ngx-components-device-profile.mjs +34 -34
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs +3 -3
- package/fesm2022/c8y-ngx-components-device-protocols.mjs +16 -16
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +13 -13
- package/fesm2022/c8y-ngx-components-device-shell.mjs +31 -31
- package/fesm2022/c8y-ngx-components-diagnostics.mjs +13 -13
- package/fesm2022/c8y-ngx-components-echart.mjs +32 -32
- 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-archived-confirm.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +10 -10
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +46 -46
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +82 -82
- package/fesm2022/c8y-ngx-components-editor.mjs +6 -6
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +3 -3
- package/fesm2022/c8y-ngx-components-events.mjs +33 -33
- package/fesm2022/c8y-ngx-components-exports-list.mjs +39 -14
- package/fesm2022/c8y-ngx-components-exports-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-feature-toggles-list.mjs +6 -6
- package/fesm2022/c8y-ngx-components-file-preview.mjs +7 -7
- package/fesm2022/c8y-ngx-components-files-repository.mjs +19 -19
- package/fesm2022/c8y-ngx-components-global-context.mjs +170 -130
- package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-group-breadcrumbs.mjs +6 -6
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +19 -19
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +3 -3
- package/fesm2022/c8y-ngx-components-location.mjs +28 -28
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-map.mjs +39 -51
- 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-operation-picker.mjs +9 -9
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +19 -19
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +3 -3
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +12 -12
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +12 -12
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-shared.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations.mjs +7 -7
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs +7 -7
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs +10 -10
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +38 -38
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +58 -58
- package/fesm2022/c8y-ngx-components-register-device.mjs +58 -58
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +9 -9
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +6 -6
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +6 -6
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +3 -3
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +6 -6
- package/fesm2022/c8y-ngx-components-replace-device.mjs +10 -10
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +16 -16
- package/fesm2022/c8y-ngx-components-reports.mjs +19 -19
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +48 -48
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +33 -33
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +34 -34
- package/fesm2022/c8y-ngx-components-repository-software.mjs +42 -42
- package/fesm2022/c8y-ngx-components-repository.mjs +4 -4
- package/fesm2022/c8y-ngx-components-search.mjs +19 -19
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +6 -6
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs +7 -7
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +3 -3
- package/fesm2022/c8y-ngx-components-services-shared.mjs +3 -3
- package/fesm2022/c8y-ngx-components-services.mjs +29 -29
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs +7 -7
- package/fesm2022/c8y-ngx-components-static-assets-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +9 -9
- package/fesm2022/c8y-ngx-components-static-assets.mjs +6 -6
- package/fesm2022/c8y-ngx-components-sub-assets.mjs +64 -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-time-context.mjs +6 -6
- package/fesm2022/c8y-ngx-components-tracking.mjs +12 -12
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +12 -12
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +6 -6
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +33 -33
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +4 -4
- package/fesm2022/c8y-ngx-components-upgrade.mjs +41 -41
- package/fesm2022/c8y-ngx-components-user-roles.mjs +10 -10
- package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +3 -5
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +27 -24
- 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-table.mjs +111 -40
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.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-welcome.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +13 -11
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +13 -13
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +75 -60
- 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-management-welcome.mjs +10 -10
- package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +24 -24
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +18 -18
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +18 -18
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs +9 -9
- package/fesm2022/c8y-ngx-components.mjs +1398 -1398
- package/global-context/index.d.ts +2 -0
- package/global-context/index.d.ts.map +1 -1
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -1
- package/locales/de.po +0 -6
- package/locales/es.po +0 -6
- package/locales/fr.po +0 -6
- package/locales/ja_JP.po +0 -6
- package/locales/ko.po +0 -6
- package/locales/locales.pot +3 -6
- package/locales/nl.po +0 -6
- package/locales/pl.po +0 -6
- package/locales/pt_BR.po +0 -6
- package/locales/zh_CN.po +0 -6
- package/locales/zh_TW.po +0 -6
- package/map/index.d.ts +12 -1
- package/map/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/sub-assets/index.d.ts +4 -0
- package/sub-assets/index.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/implementations/alarms/index.d.ts +2 -0
- package/widgets/implementations/alarms/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-graph/index.d.ts +1 -0
- package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/index.d.ts +16 -8
- package/widgets/implementations/datapoints-table/index.d.ts.map +1 -1
- package/widgets/implementations/html-widget/index.d.ts +2 -0
- package/widgets/implementations/html-widget/index.d.ts.map +1 -1
|
@@ -106,10 +106,10 @@ class DatapointsListService {
|
|
|
106
106
|
timestamp: new Date(measurement.time)
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
110
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
109
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
110
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListService, providedIn: 'root' }); }
|
|
111
111
|
}
|
|
112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListService, decorators: [{
|
|
113
113
|
type: Injectable,
|
|
114
114
|
args: [{
|
|
115
115
|
providedIn: 'root'
|
|
@@ -264,10 +264,10 @@ class DatapointsListFetchService {
|
|
|
264
264
|
getDatapointId(datapoint, fallbackIndex) {
|
|
265
265
|
return datapoint.__target?.id?.toString() || `dp-${fallbackIndex}`;
|
|
266
266
|
}
|
|
267
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
268
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
267
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListFetchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
268
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListFetchService, providedIn: 'root' }); }
|
|
269
269
|
}
|
|
270
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
270
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListFetchService, decorators: [{
|
|
271
271
|
type: Injectable,
|
|
272
272
|
args: [{
|
|
273
273
|
providedIn: 'root'
|
|
@@ -388,12 +388,12 @@ class DatapointsListViewComponent {
|
|
|
388
388
|
}
|
|
389
389
|
onContextChange(event) {
|
|
390
390
|
const { diff, context } = event;
|
|
391
|
+
this.contextConfig.set(context);
|
|
391
392
|
if (diff.isAutoRefreshEnabled === false &&
|
|
392
393
|
Object.keys(diff).length === 1 &&
|
|
393
394
|
context.refreshOption === REFRESH_OPTION.LIVE) {
|
|
394
395
|
return;
|
|
395
396
|
}
|
|
396
|
-
this.contextConfig.set(context);
|
|
397
397
|
this.isLoading.set(true);
|
|
398
398
|
this.loadDatapoints();
|
|
399
399
|
}
|
|
@@ -532,10 +532,10 @@ class DatapointsListViewComponent {
|
|
|
532
532
|
type: 'system'
|
|
533
533
|
}));
|
|
534
534
|
}
|
|
535
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
536
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: DatapointsListViewComponent, isStandalone: true, selector: "c8y-datapoints-list", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isInPreviewMode: { classPropertyName: "isInPreviewMode", publicName: "isInPreviewMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "d-col fit-h" }, ngImport: i0, template: "@if (!isInPreviewMode()) {\n <div class=\"d-flex gap-16 p-r-16 inner-scroll h-auto min-width-0\">\n @if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n [dashboardChild]=\"getDashboardChild()!\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n } @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n }\n </div>\n}\n\n@if (!isInPreviewMode() && exportConfig(); as config) {\n <c8y-widget-action>\n <c8y-datapoints-export-selector\n [displayMode]=\"'icon-only'\"\n [exportConfig]=\"config\"\n [containerClass]=\"'d-contents'\"\n (isOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector>\n </c8y-widget-action>\n}\n\n@if (!hasNoPermissionsToReadAnyMeasurement()) {\n <!-- the .page-sticky-header -->\n @if (dataPoints().length > 0) {\n <div class=\"hidden-xs hidden-sm c8y-list__item\">\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__icon\">\n <i style=\"width: 22px\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n <div\n [class]=\"\n column.id === 'kpi' || column.id === 'asset'\n ? 'col-md-3 flex-grow min-width-0'\n : column.id == 'diff' || column.id == 'diffPercentage'\n ? 'col-md-1 flex-grow min-width-0'\n : 'col-md-2 flex-grow min-width-0'\n \"\n [class.text-right]=\"column.id !== 'asset' && column.id !== 'kpi'\"\n >\n <span\n class=\"text-medium text-truncate\"\n translate\n >\n {{ column.label }}\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n <!-- The record list -->\n @if (isLoading() && !hasLoadedOnce()) {\n <!-- Initial load: full spinner -->\n <ng-container [ngTemplateOutlet]=\"loading\"></ng-container>\n } @else {\n @if (isLoading()) {\n <!-- Refresh: inline loading overlay -->\n <div class=\"p-absolute fit-w overflow-hidden p-b-4\">\n <c8y-loading [layout]=\"'page'\"></c8y-loading>\n </div>\n }\n @if (dataPoints().length) {\n <c8y-list-group\n class=\"flex-grow\"\n role=\"list\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li\n role=\"listitem\"\n *c8yFor=\"\n let dp of { data: dataPoints(), res: null! };\n enableVirtualScroll: true;\n virtualScrollElementSize: 48;\n virtualScrollStrategy: 'fixed'\n \"\n >\n <c8y-li-icon>\n <i\n c8yIcon=\"circle\"\n [style.color]=\"dp.color\"\n ></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n @switch (column.id) {\n @case ('kpi') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n {{ dp.label | translate }}\n @if (dp.unit) {\n <small class=\"text-muted\">{{ dp.unit }}</small>\n }\n </div>\n </div>\n }\n @case ('target') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>{{ dp.target }}</span>\n </div>\n </div>\n }\n @case ('current') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span\n [class]=\"dp.currentValue | applyRangeClass: getRangeValues(dp)\"\n [title]=\"dp.timestamp | c8yDate: 'medium'\"\n [attr.aria-label]=\"\n ('Last updated: ' | translate) + (dp.timestamp | c8yDate: 'medium')\n \"\n >\n {{ dp.currentValue | number: dp.currentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diff') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffValue | number: dp.diffFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diffPercentage') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffPercentValue | number: dp.diffPercentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('asset') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <button\n class=\"btn-clean d-flex a-i-center gap-4 text-muted\"\n [attr.aria-label]=\"('Navigate to ' | translate) + dp.__target?.name\"\n type=\"button\"\n (click)=\"redirectToAsset(dp.__target?.id)\"\n >\n @if (dp.__target?.id && getTargetManagedObject(dp.__target.id); as mo) {\n <c8y-device-status\n [mo]=\"mo\"\n [size]=\"16\"\n ></c8y-device-status>\n }\n <small\n class=\"text-truncate\"\n [title]=\"dp.__target?.name\"\n >{{ dp.__target?.name }}</small\n >\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n } @else {\n <ng-container [ngTemplateOutlet]=\"emptyState\"></ng-container>\n }\n }\n} @else {\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}\n\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n\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-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-list\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: DatapointsExportSelectorComponent, selector: "c8y-datapoints-export-selector", inputs: ["displayMode", "containerClass", "exportConfig"], outputs: ["isOpen"] }, { kind: "component", type: DeviceStatusComponent, selector: "device-status, c8y-device-status", inputs: ["mo", "size"] }, { kind: "ngmodule", type: DynamicComponentModule }, { kind: "component", type: i1.DynamicComponentAlertsComponent, selector: "c8y-dynamic-component-alerts", inputs: ["alerts"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: GlobalContextConnectorComponent, selector: "c8y-global-context-connector", inputs: ["controls", "config", "isLoading", "dashboardChild", "linked", "emitRefresh"], outputs: ["configChange", "refresh", "linkedChange"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled", "emitRefresh"], outputs: ["configChange", "refresh"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: VirtualScrollListenerDirective, selector: "[c8yVirtualScrollListener]", inputs: ["scrollThreshold"], outputs: ["scrolled", "scrolledToTop"] }, { kind: "component", type: WidgetActionWrapperComponent, selector: "c8y-widget-action" }, { kind: "pipe", type: ApplyRangeClassPipe, name: "applyRangeClass" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
535
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
536
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: DatapointsListViewComponent, isStandalone: true, selector: "c8y-datapoints-list", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, isInPreviewMode: { classPropertyName: "isInPreviewMode", publicName: "isInPreviewMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "d-col fit-h" }, ngImport: i0, template: "@if (!isInPreviewMode()) {\n <div class=\"d-flex gap-16 p-r-16 inner-scroll h-auto min-width-0\">\n @if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n [dashboardChild]=\"getDashboardChild()!\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n } @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n }\n </div>\n}\n\n@if (!isInPreviewMode() && exportConfig(); as config) {\n <c8y-widget-action>\n <c8y-datapoints-export-selector\n [displayMode]=\"'icon-only'\"\n [exportConfig]=\"config\"\n [containerClass]=\"'d-contents'\"\n (isOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector>\n </c8y-widget-action>\n}\n\n@if (!hasNoPermissionsToReadAnyMeasurement()) {\n <!-- the .page-sticky-header -->\n @if (dataPoints().length > 0) {\n <div class=\"hidden-xs hidden-sm c8y-list__item\">\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__icon\">\n <i style=\"width: 22px\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n <div\n [class]=\"\n column.id === 'kpi' || column.id === 'asset'\n ? 'col-md-3 flex-grow min-width-0'\n : column.id == 'diff' || column.id == 'diffPercentage'\n ? 'col-md-1 flex-grow min-width-0'\n : 'col-md-2 flex-grow min-width-0'\n \"\n [class.text-right]=\"column.id !== 'asset' && column.id !== 'kpi'\"\n >\n <span\n class=\"text-medium text-truncate\"\n translate\n >\n {{ column.label }}\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n <!-- The record list -->\n @if (isLoading() && !hasLoadedOnce()) {\n <!-- Initial load: full spinner -->\n <ng-container [ngTemplateOutlet]=\"loading\"></ng-container>\n } @else {\n @if (isLoading()) {\n <!-- Refresh: inline loading overlay -->\n <div class=\"p-absolute fit-w overflow-hidden p-b-4\">\n <c8y-loading [layout]=\"'page'\"></c8y-loading>\n </div>\n }\n @if (dataPoints().length) {\n <c8y-list-group\n class=\"flex-grow\"\n role=\"list\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li\n role=\"listitem\"\n *c8yFor=\"\n let dp of { data: dataPoints(), res: null! };\n enableVirtualScroll: true;\n virtualScrollElementSize: 48;\n virtualScrollStrategy: 'fixed'\n \"\n >\n <c8y-li-icon>\n <i\n c8yIcon=\"circle\"\n [style.color]=\"dp.color\"\n ></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n @switch (column.id) {\n @case ('kpi') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n {{ dp.label | translate }}\n @if (dp.unit) {\n <small class=\"text-muted\">{{ dp.unit }}</small>\n }\n </div>\n </div>\n }\n @case ('target') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>{{ dp.target }}</span>\n </div>\n </div>\n }\n @case ('current') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span\n [class]=\"dp.currentValue | applyRangeClass: getRangeValues(dp)\"\n [title]=\"dp.timestamp | c8yDate: 'medium'\"\n [attr.aria-label]=\"\n ('Last updated: ' | translate) + (dp.timestamp | c8yDate: 'medium')\n \"\n >\n {{ dp.currentValue | number: dp.currentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diff') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffValue | number: dp.diffFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diffPercentage') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffPercentValue | number: dp.diffPercentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('asset') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <button\n class=\"btn-clean d-flex a-i-center gap-4 text-muted\"\n [attr.aria-label]=\"('Navigate to ' | translate) + dp.__target?.name\"\n type=\"button\"\n (click)=\"redirectToAsset(dp.__target?.id)\"\n >\n @if (dp.__target?.id && getTargetManagedObject(dp.__target.id); as mo) {\n <c8y-device-status\n [mo]=\"mo\"\n [size]=\"16\"\n ></c8y-device-status>\n }\n <small\n class=\"text-truncate\"\n [title]=\"dp.__target?.name\"\n >{{ dp.__target?.name }}</small\n >\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n } @else {\n <ng-container [ngTemplateOutlet]=\"emptyState\"></ng-container>\n }\n }\n} @else {\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}\n\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n\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-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-list\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: DatapointsExportSelectorComponent, selector: "c8y-datapoints-export-selector", inputs: ["displayMode", "containerClass", "exportConfig"], outputs: ["isOpen"] }, { kind: "component", type: DeviceStatusComponent, selector: "device-status, c8y-device-status", inputs: ["mo", "size"] }, { kind: "ngmodule", type: DynamicComponentModule }, { kind: "component", type: i1.DynamicComponentAlertsComponent, selector: "c8y-dynamic-component-alerts", inputs: ["alerts"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: GlobalContextConnectorComponent, selector: "c8y-global-context-connector", inputs: ["controls", "config", "isLoading", "dashboardChild", "linked", "emitRefresh"], outputs: ["configChange", "refresh", "linkedChange"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled", "emitRefresh"], outputs: ["configChange", "refresh"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: VirtualScrollListenerDirective, selector: "[c8yVirtualScrollListener]", inputs: ["scrollThreshold"], outputs: ["scrolled", "scrolledToTop"] }, { kind: "component", type: WidgetActionWrapperComponent, selector: "c8y-widget-action" }, { kind: "pipe", type: ApplyRangeClassPipe, name: "applyRangeClass" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
537
537
|
}
|
|
538
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
538
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListViewComponent, decorators: [{
|
|
539
539
|
type: Component,
|
|
540
540
|
args: [{ selector: 'c8y-datapoints-list', host: { class: 'd-col fit-h' }, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
541
541
|
ApplyRangeClassPipe,
|
|
@@ -674,10 +674,10 @@ class DatapointsListConfigComponent {
|
|
|
674
674
|
return visibleColumns.length >= 1 ? null : { atLeastOneColumnMustBeVisible: true };
|
|
675
675
|
};
|
|
676
676
|
}
|
|
677
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
678
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.
|
|
677
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
678
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: DatapointsListConfigComponent, isStandalone: true, selector: "c8y-datapoints-list-view-config", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "previewTemplate", first: true, predicate: ["dataPointsListPreview"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (configForm(); as form) {\n <form\n class=\"no-card-context\"\n [formGroup]=\"form\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Columns (drag to reorder)' | translate }}</legend>\n <c8y-list-group\n formArrayName=\"columns\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n @if (columnsFormArray().errors?.atLeastOneColumnMustBeVisible) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ 'At least 1 column must be visible.' | translate }}\n </div>\n }\n\n @for (column of columnsFormArray().controls; track column.value.id; let i = $index) {\n <c8y-li\n class=\"c8y-list__item__collapse--container-small\"\n [formGroupName]=\"i\"\n cdkDrag\n >\n <c8y-li-drag-handle\n [title]=\"'Click and drag to reorder' | translate\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-checkbox\n class=\"a-s-center p-r-0\"\n [displayAsSwitch]=\"true\"\n formControlName=\"visible\"\n (click)=\"$event.stopPropagation()\"\n ></c8y-li-checkbox>\n <c8y-li-body>\n <div class=\"d-flex a-i-center\">\n <span class=\"text-truncate\">{{ column.value.label | translate }}</span>\n @switch (column.value.label) {\n @case ('Target') {\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help content' | translate\"\n [popover]=\"\n 'The Target column shows the value set on the target field of the data point'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n }\n @case ('Diff') {\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help content' | translate\"\n [popover]=\"\n 'The Diff column shows the difference between the current value and the target value of the data point'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n }\n </c8y-list-group>\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 [min]=\"minDecimalPlaces\"\n [max]=\"maxDecimalPlaces\"\n />\n </c8y-form-group>\n </fieldset>\n </form>\n}\n\n<ng-template #dataPointsListPreview>\n @let previewConfig = previewConfig$ | async;\n @if (previewConfig && previewConfig.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"previewConfig.displayMode!\"\n [config]=\"previewConfig\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n\n @if (previewConfig) {\n <c8y-datapoints-list\n [config]=\"previewConfig\"\n [isInPreviewMode]=\"true\"\n data-cy=\"c8y-datapoints-list-widget-config--preview-datapoints-list\"\n ></c8y-datapoints-list>\n }\n</ng-template>\n", dependencies: [{ kind: "component", type: DatapointsListViewComponent, selector: "c8y-datapoints-list", inputs: ["config", "isInPreviewMode"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1$1.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: DynamicComponentModule }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i1.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "component", type: i1.ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled", "emitRefresh"], outputs: ["configChange", "refresh"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i3.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
679
679
|
}
|
|
680
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
680
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DatapointsListConfigComponent, decorators: [{
|
|
681
681
|
type: Component,
|
|
682
682
|
args: [{ selector: 'c8y-datapoints-list-view-config', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
683
683
|
AsyncPipe,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-datapoints-list.mjs","sources":["../../widgets/implementations/datapoints-list/datapoints-list.constants.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-view.service.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-fetch.service.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-view.component.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-view.component.html","../../widgets/implementations/datapoints-list/datapoints-list-config/datapoints-list-config.component.ts","../../widgets/implementations/datapoints-list/datapoints-list-config/datapoints-list-config.component.html","../../widgets/implementations/datapoints-list/c8y-ngx-components-widgets-implementations-datapoints-list.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components/gettext';\n\nimport { ColumnConfig } from './datapoints-list-widget.model';\n\n/**\n * Default column configuration for datapoints list widget\n */\nexport const DEFAULT_DATAPOINTS_LIST_COLUMNS: ColumnConfig[] = [\n { id: 'kpi', label: gettext('Label'), visible: true, order: 0 },\n { id: 'target', label: gettext('Target'), visible: true, order: 1 },\n { id: 'current', label: gettext('Current'), visible: true, order: 2 },\n { id: 'diff', label: gettext('Diff'), visible: true, order: 3 },\n { id: 'diffPercentage', label: gettext('Diff %'), visible: true, order: 4 },\n { id: 'asset', label: gettext('Asset'), visible: true, order: 5 }\n];\n","import { Injectable } from '@angular/core';\nimport { IMeasurement } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { DatapointWithMeasurement } from '../datapoints-list-widget.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsListService {\n /**\n * Calculate difference between current value and target\n * @param datapoint - Datapoint record\n * @returns Difference value or null if value/target is undefined\n */\n diff(datapoint: DatapointWithMeasurement): number | null {\n const { currentValue, target } = datapoint;\n // != checks both null and undefined\n if (currentValue != null && target != null) {\n return currentValue - target;\n }\n return null;\n }\n\n /**\n * Calculate percentage difference between current value and target\n * @param datapoint - Datapoint record\n * @returns Percentage difference or null if target is undefined\n */\n diffPercent(datapoint: DatapointWithMeasurement): number | null {\n const target = datapoint.target;\n\n if (target !== null && target !== undefined) {\n const _diff = this.diff(datapoint);\n if (_diff !== null) {\n // Intentionally allows division by zero to return Infinity\n // when target is 0, representing mathematically undefined percentage.\n // This follows the previous AngularJS implementation behavior.\n return (_diff / target) * 100;\n }\n }\n\n return null;\n }\n\n /**\n * Get fraction size format based on whether the value is an integer\n * @param value - Number to check\n * @param defaultFractionSize - Default fraction size format to use for non-integers\n * @returns Fraction size format ('1.0-0' for integers, defaultFractionSize for decimals)\n */\n getFractionSize(value: number | null | undefined, defaultFractionSize: string): string {\n if (value === null || value === undefined) {\n return defaultFractionSize;\n }\n return value % 1 === 0 ? '1.0-0' : defaultFractionSize;\n }\n\n /**\n * Extract current value and timestamp from a measurement\n * @param datapoint - Datapoint configuration (contains fragment and series)\n * @param measurement - Measurement to extract value from\n * @returns Object containing extracted value and timestamp (null if not found)\n */\n extractMeasurementValue(\n datapoint: KPIDetails,\n measurement: IMeasurement | undefined\n ): { value: number | null; timestamp: Date | null } {\n // Return null values if measurement is missing\n if (!measurement) {\n return { value: null, timestamp: null };\n }\n\n // Return null values if datapoint configuration is incomplete\n if (!datapoint.fragment || !datapoint.series) {\n return { value: null, timestamp: null };\n }\n\n // Access the fragment (e.g., \"c8y_Steam\")\n const fragmentData = measurement[datapoint.fragment];\n if (!fragmentData) {\n return { value: null, timestamp: null };\n }\n\n // Access the series within the fragment (e.g., \"Temperature\")\n const seriesData = fragmentData[datapoint.series];\n if (!seriesData || seriesData.value === undefined) {\n return { value: null, timestamp: null };\n }\n\n // Extract and return the value and timestamp\n return {\n value: seriesData.value,\n timestamp: new Date(measurement.time)\n };\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport {\n IManagedObject,\n IMeasurement,\n IMeasurementFilter,\n InventoryService,\n MeasurementService\n} from '@c8y/client';\nimport { AlertService } from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { DatapointWithMeasurement } from '../datapoints-list-widget.model';\nimport { DatapointsListService } from './datapoints-list-view.service';\n\ninterface FetchConfig {\n fractionSize: string;\n dateFrom?: string;\n dateTo?: string;\n}\n\ninterface FetchResult {\n dataPoints: DatapointWithMeasurement[];\n seriesWithoutPermissionCount: number;\n targetManagedObjects: Map<string, IManagedObject>;\n}\n\ninterface SingleDatapointResult {\n datapoint: DatapointWithMeasurement;\n hasPermissionError: boolean;\n}\n\n/**\n * Service that handles all data-fetching operations for the datapoints list widget.\n * Encapsulates measurement fetching, data enrichment, and error handling.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsListFetchService {\n private alertService = inject(AlertService);\n private measurementService = inject(MeasurementService);\n private inventoryService = inject(InventoryService);\n private datapointsListService = inject(DatapointsListService);\n\n /**\n * Fetch measurements for all active datapoints and enrich them with calculated values.\n */\n async fetchDatapointsWithMeasurements(\n datapoints: KPIDetails[],\n config: FetchConfig\n ): Promise<FetchResult> {\n const targetManagedObjects = new Map<string, IManagedObject>();\n\n const results = await this.fetchAllDatapoints(datapoints, config);\n\n const enrichedDataPoints = results.map(r => r.datapoint);\n const seriesWithoutPermissionCount = results.filter(r => r.hasPermissionError).length;\n\n await this.fetchTargetManagedObjects(enrichedDataPoints, targetManagedObjects);\n\n return {\n dataPoints: enrichedDataPoints,\n seriesWithoutPermissionCount,\n targetManagedObjects\n };\n }\n\n /**\n * Fetch and enrich all datapoints in parallel.\n * Each datapoint fetch is independent - one failure doesn't affect others.\n */\n private fetchAllDatapoints(\n datapoints: KPIDetails[],\n config: FetchConfig\n ): Promise<SingleDatapointResult[]> {\n return Promise.all(\n datapoints.map((datapoint, index) => this.fetchSingleDatapoint(datapoint, index, config))\n );\n }\n\n /**\n * Fetch measurement for a single datapoint and return enriched result.\n * Handles errors gracefully - returns empty datapoint on failure.\n */\n private async fetchSingleDatapoint(\n datapoint: KPIDetails,\n index: number,\n config: FetchConfig\n ): Promise<SingleDatapointResult> {\n try {\n const measurement = await this.getMeasurementForDatapoint(datapoint, config);\n const measurementValue = this.datapointsListService.extractMeasurementValue(\n datapoint,\n measurement\n );\n\n return {\n datapoint: this.createEnrichedDatapoint(datapoint, index, measurementValue, config),\n hasPermissionError: false\n };\n } catch (error) {\n return this.handleFetchError(error, datapoint, index, config);\n }\n }\n\n /**\n * Handle fetch error and return appropriate result.\n */\n private handleFetchError(\n error: unknown,\n datapoint: KPIDetails,\n index: number,\n config: FetchConfig\n ): SingleDatapointResult {\n const isPermissionError = (error as HttpErrorResponse)?.status === 403;\n\n if (!isPermissionError) {\n this.alertService.addServerFailure(error);\n }\n\n return {\n datapoint: this.createEnrichedDatapoint(\n datapoint,\n index,\n { value: null, timestamp: null },\n config\n ),\n hasPermissionError: isPermissionError\n };\n }\n\n /**\n * Create an enriched datapoint with measurement value and all calculated fields.\n */\n private createEnrichedDatapoint(\n datapoint: KPIDetails,\n index: number,\n measurementValue: { value: number | null; timestamp: Date | null },\n config: FetchConfig\n ): DatapointWithMeasurement {\n const enrichedDatapoint: DatapointWithMeasurement = {\n ...datapoint,\n id: this.getDatapointId(datapoint, index),\n currentValue: measurementValue.value,\n timestamp: measurementValue.timestamp\n };\n\n this.calculateDerivedFields(enrichedDatapoint, config.fractionSize);\n\n return enrichedDatapoint;\n }\n\n /**\n * Calculate and set all derived fields on a datapoint.\n * Includes diff, diffPercent, and fraction sizes for display formatting.\n */\n private calculateDerivedFields(datapoint: DatapointWithMeasurement, fractionSize: string): void {\n datapoint.diffValue = this.datapointsListService.diff(datapoint);\n datapoint.diffPercentValue = this.datapointsListService.diffPercent(datapoint);\n datapoint.currentFractionSize = this.datapointsListService.getFractionSize(\n datapoint.currentValue,\n fractionSize\n );\n datapoint.diffFractionSize = this.datapointsListService.getFractionSize(\n datapoint.diffValue,\n fractionSize\n );\n datapoint.diffPercentFractionSize = this.datapointsListService.getFractionSize(\n datapoint.diffPercentValue,\n fractionSize\n );\n }\n\n /**\n * Fetch managed objects for device status display.\n */\n private async fetchTargetManagedObjects(\n dataPoints: DatapointWithMeasurement[],\n targetManagedObjects: Map<string, IManagedObject>\n ): Promise<void> {\n const uniqueTargetIds = this.getUniqueTargetIds(dataPoints);\n\n if (uniqueTargetIds.size === 0) {\n return;\n }\n\n await Promise.all(\n Array.from(uniqueTargetIds).map(targetId =>\n this.fetchManagedObject(targetId, targetManagedObjects)\n )\n );\n }\n\n /**\n * Get unique target IDs from datapoints.\n */\n private getUniqueTargetIds(dataPoints: DatapointWithMeasurement[]): Set<string> {\n const uniqueTargetIds = new Set<string>();\n\n for (const dp of dataPoints) {\n if (dp.__target?.id) {\n uniqueTargetIds.add(dp.__target.id.toString());\n }\n }\n\n return uniqueTargetIds;\n }\n\n /**\n * Fetch a single managed object and add to the map.\n */\n private async fetchManagedObject(\n targetId: string,\n targetManagedObjects: Map<string, IManagedObject>\n ): Promise<void> {\n try {\n const { data } = await this.inventoryService.detail(targetId);\n targetManagedObjects.set(targetId, data);\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n /**\n * Fetch the most recent measurement for a datapoint within the specified date range.\n */\n private async getMeasurementForDatapoint(\n datapoint: KPIDetails,\n config: FetchConfig\n ): Promise<IMeasurement | null> {\n const sourceId = datapoint.__target?.id;\n if (!sourceId || !datapoint.fragment || !datapoint.series) {\n return null;\n }\n\n const filter: IMeasurementFilter = {\n dateFrom: config.dateFrom || '1970-01-01',\n dateTo: config.dateTo || new Date().toISOString(),\n source: sourceId,\n valueFragmentSeries: datapoint.series,\n valueFragmentType: datapoint.fragment,\n pageSize: 1,\n revert: true\n };\n\n const { data } = await this.measurementService.list(filter);\n return data?.[0] ?? null;\n }\n\n /**\n * Get unique ID for a datapoint.\n * Uses target ID if available, otherwise generates fallback based on index.\n */\n private getDatapointId(datapoint: KPIDetails, fallbackIndex: number): string {\n return datapoint.__target?.id?.toString() || `dp-${fallbackIndex}`;\n }\n}\n","import { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n OnInit,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport {\n AlertService,\n ApplyRangeClassPipe,\n C8yTranslateDirective,\n C8yTranslatePipe,\n ColorRangeBoundaries,\n DashboardChildComponent,\n DatePipe,\n DeviceStatusComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n DynamicComponentModule,\n EmptyStateComponent,\n ForOfDirective,\n GroupService,\n GuideDocsComponent,\n GuideHrefDirective,\n IconDirective,\n ListGroupModule,\n LoadingComponent,\n VirtualScrollListenerDirective,\n WidgetActionWrapperComponent\n} from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DatapointsExportSelectorComponent,\n ExportConfig\n} from '@c8y/ngx-components/datapoints-export-selector';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n CONTEXT_FEATURE,\n DisplayMode,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextConnectorComponent,\n GlobalContextState,\n LocalControlsComponent,\n PRESET_NAME,\n PresetName,\n REFRESH_OPTION,\n WidgetConfigMigrationService\n} from '@c8y/ngx-components/global-context';\nimport { isEqual, merge } from 'lodash-es';\nimport { pairwise } from 'rxjs';\nimport { DatapointsListConfig, DatapointWithMeasurement } from '../datapoints-list-widget.model';\nimport { DEFAULT_DATAPOINTS_LIST_COLUMNS } from '../datapoints-list.constants';\nimport { DatapointsListFetchService } from './datapoints-list-fetch.service';\n\n@Component({\n selector: 'c8y-datapoints-list',\n templateUrl: './datapoints-list-view.component.html',\n host: { class: 'd-col fit-h' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ApplyRangeClassPipe,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatapointsExportSelectorComponent,\n DatePipe,\n DecimalPipe,\n DeviceStatusComponent,\n DynamicComponentModule,\n EmptyStateComponent,\n ForOfDirective,\n GlobalContextConnectorComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n IconDirective,\n ListGroupModule,\n LoadingComponent,\n LocalControlsComponent,\n NgTemplateOutlet,\n VirtualScrollListenerDirective,\n WidgetActionWrapperComponent\n ]\n})\nexport class DatapointsListViewComponent implements OnInit {\n config = input.required<DatapointsListConfig>();\n isInPreviewMode = input(false);\n\n private readonly alertService = inject(AlertService);\n private readonly dashboardChild = inject(DashboardChildComponent, { optional: true });\n private readonly defaultColumns = DEFAULT_DATAPOINTS_LIST_COLUMNS;\n private readonly fetchService = inject(DatapointsListFetchService);\n private readonly groupService = inject(GroupService);\n private readonly inventoryService = inject(InventoryService);\n private readonly router = inject(Router);\n private readonly widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n\n readonly CONTEXT_FEATURE = CONTEXT_FEATURE;\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n missingAllPermissionsAlert = new DynamicComponentAlertAggregator();\n targetManagedObjects = new Map<string, IManagedObject>();\n\n configSignal = linkedSignal(() => {\n const raw = this.config();\n const migrated = this.widgetConfigMigrationService.migrateWidgetConfig(raw);\n return merge({}, raw, migrated) as DatapointsListConfig;\n });\n contextConfig = signal<GlobalContextState>({});\n dataPoints = signal<DatapointWithMeasurement[]>([]);\n displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n hasLoadedOnce = signal(false);\n hasNoPermissionsToReadAnyMeasurement = signal(false);\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n isLoading = signal(false);\n widgetControls = signal<PresetName>(PRESET_NAME.DATA_POINTS_LIST);\n\n fractionSize = computed(() => {\n const decimalPlaces = this.configSignal()?.decimalPlaces;\n if (typeof decimalPlaces === 'number' && !Number.isNaN(decimalPlaces)) {\n return `1.${decimalPlaces}-${decimalPlaces}`;\n }\n return '1.2-2';\n });\n\n columns = computed(() => {\n const options = this.configSignal()?.options;\n\n if (options?.columns?.length > 0) {\n return [...options.columns].sort((a, b) => a.order - b.order);\n }\n\n return this.defaultColumns.map(defaultCol => ({\n ...defaultCol,\n visible: options?.[defaultCol.id] ?? defaultCol.visible\n }));\n });\n\n visibleColumns = computed(() => {\n return this.columns().filter(col => col.visible !== false);\n });\n\n exportConfig = computed<ExportConfig | null>(() => {\n const effectiveConfig = { ...this.configSignal(), ...this.contextConfig() };\n const dateFrom = effectiveConfig.dateTimeContext?.dateFrom;\n const dateTo = effectiveConfig.dateTimeContext?.dateTo;\n\n if (!dateFrom || !dateTo || (this.isLoading() && !this.hasLoadedOnce())) {\n return null;\n }\n\n return {\n exportType: 'latestWithDetails',\n datapointDetails:\n effectiveConfig.datapoints\n ?.filter(dp => dp.__active === true)\n .map(dp => ({\n deviceName: dp.__target?.name || '',\n source: dp.__target?.id || '',\n valueFragmentSeries: dp.series,\n valueFragmentType: dp.fragment,\n target: dp.target,\n label: dp.label\n })) || [],\n dateFrom: dateFrom instanceof Date ? dateFrom.toISOString() : dateFrom,\n dateTo: dateTo instanceof Date ? dateTo.toISOString() : dateTo,\n columns: this.columns()\n .filter(col => col.visible)\n .map(col => ({\n id: col.id,\n label: col.label,\n visible: col.visible,\n order: col.order\n }))\n };\n });\n\n activeDataPoints = computed(() => {\n return this.configSignal()?.datapoints?.filter(dp => dp.__active === true) ?? [];\n });\n\n private loadRequestId = 0;\n private readonly seriesWithoutPermissionToReadCount = signal(0);\n\n constructor() {\n toObservable(this.config)\n .pipe(pairwise(), takeUntilDestroyed())\n .subscribe(([prevConfig, currentConfig]) => {\n if (!this.isInPreviewMode()) {\n return;\n }\n\n const prevContext = this.extractContextState(prevConfig);\n const newContext = this.extractContextState(currentConfig);\n this.contextConfig.set(newContext);\n\n const datapointsChanged = !isEqual(prevConfig.datapoints, currentConfig.datapoints);\n const decimalPlacesChanged = prevConfig.decimalPlaces !== currentConfig.decimalPlaces;\n const contextChanged = !isEqual(prevContext, newContext);\n\n if (datapointsChanged || decimalPlacesChanged || contextChanged) {\n this.isLoading.set(true);\n this.loadDatapoints();\n }\n });\n }\n\n ngOnInit(): void {\n const config = this.configSignal();\n\n const displayMode = config.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n this.displayMode.set(displayMode as DisplayMode);\n\n this.contextConfig.set(this.extractContextState(config));\n\n if (displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD || this.isInPreviewMode()) {\n this.loadDatapoints();\n }\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n const { diff, context } = event;\n\n if (\n diff.isAutoRefreshEnabled === false &&\n Object.keys(diff).length === 1 &&\n context.refreshOption === REFRESH_OPTION.LIVE\n ) {\n return;\n }\n\n this.contextConfig.set(context);\n this.isLoading.set(true);\n this.loadDatapoints();\n }\n\n onRefresh(): void {\n this.isLoading.set(true);\n this.loadDatapoints();\n }\n\n onExportModalOpen(isOpened: boolean): void {\n this.setAutoRefreshPaused(isOpened);\n }\n\n async redirectToAsset(assetId: string | number | undefined): Promise<void> {\n if (this.isInPreviewMode() || !assetId) {\n return;\n }\n\n try {\n const { data: mo } = await this.inventoryService.detail(assetId);\n\n if (mo) {\n const assetPath = this.groupService.getAssetPath(mo);\n this.router.navigateByUrl(`/${assetPath}/${mo.id}`);\n }\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n getTargetManagedObject(targetId: string | number): IManagedObject | undefined {\n return this.targetManagedObjects.get(targetId.toString());\n }\n\n getDashboardChild(): DashboardChildComponent | null {\n return this.dashboardChild ?? null;\n }\n\n getRangeValues(dp: KPIDetails): ColorRangeBoundaries {\n return {\n yellowRangeMin: dp.yellowRangeMin,\n yellowRangeMax: dp.yellowRangeMax,\n redRangeMin: dp.redRangeMin,\n redRangeMax: dp.redRangeMax\n };\n }\n\n onListScrolled(): void {\n this.setAutoRefreshPaused(true);\n }\n\n onListScrolledToTop(): void {\n this.setAutoRefreshPaused(false);\n }\n\n private extractContextState(config: Partial<GlobalContextState>): GlobalContextState {\n return {\n dateTimeContext: config.dateTimeContext,\n aggregation: config.aggregation,\n isAutoRefreshEnabled: config.isAutoRefreshEnabled,\n refreshInterval: config.refreshInterval,\n refreshOption: config.refreshOption\n };\n }\n\n private setAutoRefreshPaused(paused: boolean): void {\n if (this.isInPreviewMode()) {\n return;\n }\n\n const current = this.contextConfig();\n if (current.refreshOption === REFRESH_OPTION.HISTORY) {\n return;\n }\n\n this.contextConfig.set({\n ...current,\n isAutoRefreshEnabled: !paused\n });\n this.isLinkedToGlobal.set(!paused);\n }\n\n private loadDatapoints(): void {\n if (this.activeDataPoints().length > 0) {\n this.fetchMeasurements();\n } else {\n this.dataPoints.set([]);\n this.hasLoadedOnce.set(true);\n this.isLoading.set(false);\n }\n }\n\n private async fetchMeasurements(): Promise<void> {\n const requestId = ++this.loadRequestId;\n\n try {\n this.isLoading.set(true);\n\n const effectiveConfig = {\n ...this.configSignal(),\n ...this.contextConfig()\n };\n\n const dateFrom = effectiveConfig.dateTimeContext?.dateFrom;\n const dateTo = effectiveConfig.dateTimeContext?.dateTo;\n\n const dateFromStr = dateFrom instanceof Date ? dateFrom.toISOString() : dateFrom;\n const dateToStr = dateTo instanceof Date ? dateTo.toISOString() : dateTo;\n\n const result = await this.fetchService.fetchDatapointsWithMeasurements(\n this.activeDataPoints(),\n { fractionSize: this.fractionSize(), dateFrom: dateFromStr, dateTo: dateToStr }\n );\n\n if (requestId === this.loadRequestId) {\n this.dataPoints.set(result.dataPoints);\n this.targetManagedObjects = result.targetManagedObjects;\n this.hasLoadedOnce.set(true);\n this.seriesWithoutPermissionToReadCount.set(result.seriesWithoutPermissionCount);\n this.checkAndDisplayPermissionErrors();\n }\n } finally {\n if (requestId === this.loadRequestId) {\n this.isLoading.set(false);\n }\n }\n }\n\n private checkAndDisplayPermissionErrors(): void {\n if (this.seriesWithoutPermissionToReadCount()) {\n this.missingAllPermissionsAlert.clear();\n this.handleNoPermissionErrorMessage();\n }\n }\n\n private handleNoPermissionErrorMessage(): void {\n const noPermissions =\n this.seriesWithoutPermissionToReadCount() === this.activeDataPoints().length;\n this.hasNoPermissionsToReadAnyMeasurement.set(noPermissions);\n\n if (noPermissions) {\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","@if (!isInPreviewMode()) {\n <div class=\"d-flex gap-16 p-r-16 inner-scroll h-auto min-width-0\">\n @if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n [dashboardChild]=\"getDashboardChild()!\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n } @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n }\n </div>\n}\n\n@if (!isInPreviewMode() && exportConfig(); as config) {\n <c8y-widget-action>\n <c8y-datapoints-export-selector\n [displayMode]=\"'icon-only'\"\n [exportConfig]=\"config\"\n [containerClass]=\"'d-contents'\"\n (isOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector>\n </c8y-widget-action>\n}\n\n@if (!hasNoPermissionsToReadAnyMeasurement()) {\n <!-- the .page-sticky-header -->\n @if (dataPoints().length > 0) {\n <div class=\"hidden-xs hidden-sm c8y-list__item\">\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__icon\">\n <i style=\"width: 22px\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n <div\n [class]=\"\n column.id === 'kpi' || column.id === 'asset'\n ? 'col-md-3 flex-grow min-width-0'\n : column.id == 'diff' || column.id == 'diffPercentage'\n ? 'col-md-1 flex-grow min-width-0'\n : 'col-md-2 flex-grow min-width-0'\n \"\n [class.text-right]=\"column.id !== 'asset' && column.id !== 'kpi'\"\n >\n <span\n class=\"text-medium text-truncate\"\n translate\n >\n {{ column.label }}\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n <!-- The record list -->\n @if (isLoading() && !hasLoadedOnce()) {\n <!-- Initial load: full spinner -->\n <ng-container [ngTemplateOutlet]=\"loading\"></ng-container>\n } @else {\n @if (isLoading()) {\n <!-- Refresh: inline loading overlay -->\n <div class=\"p-absolute fit-w overflow-hidden p-b-4\">\n <c8y-loading [layout]=\"'page'\"></c8y-loading>\n </div>\n }\n @if (dataPoints().length) {\n <c8y-list-group\n class=\"flex-grow\"\n role=\"list\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li\n role=\"listitem\"\n *c8yFor=\"\n let dp of { data: dataPoints(), res: null! };\n enableVirtualScroll: true;\n virtualScrollElementSize: 48;\n virtualScrollStrategy: 'fixed'\n \"\n >\n <c8y-li-icon>\n <i\n c8yIcon=\"circle\"\n [style.color]=\"dp.color\"\n ></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n @switch (column.id) {\n @case ('kpi') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n {{ dp.label | translate }}\n @if (dp.unit) {\n <small class=\"text-muted\">{{ dp.unit }}</small>\n }\n </div>\n </div>\n }\n @case ('target') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>{{ dp.target }}</span>\n </div>\n </div>\n }\n @case ('current') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span\n [class]=\"dp.currentValue | applyRangeClass: getRangeValues(dp)\"\n [title]=\"dp.timestamp | c8yDate: 'medium'\"\n [attr.aria-label]=\"\n ('Last updated: ' | translate) + (dp.timestamp | c8yDate: 'medium')\n \"\n >\n {{ dp.currentValue | number: dp.currentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diff') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffValue | number: dp.diffFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diffPercentage') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffPercentValue | number: dp.diffPercentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('asset') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <button\n class=\"btn-clean d-flex a-i-center gap-4 text-muted\"\n [attr.aria-label]=\"('Navigate to ' | translate) + dp.__target?.name\"\n type=\"button\"\n (click)=\"redirectToAsset(dp.__target?.id)\"\n >\n @if (dp.__target?.id && getTargetManagedObject(dp.__target.id); as mo) {\n <c8y-device-status\n [mo]=\"mo\"\n [size]=\"16\"\n ></c8y-device-status>\n }\n <small\n class=\"text-truncate\"\n [title]=\"dp.__target?.name\"\n >{{ dp.__target?.name }}</small\n >\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n } @else {\n <ng-container [ngTemplateOutlet]=\"emptyState\"></ng-container>\n }\n }\n} @else {\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}\n\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n\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-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-list\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n","import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n OnInit,\n signal,\n TemplateRef,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n FormArray,\n FormBuilder,\n FormGroup,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n C8yTranslatePipe,\n DynamicComponentModule,\n FormGroupComponent,\n IconDirective,\n ListGroupModule\n} from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n LocalControlsComponent,\n PRESET_NAME,\n PresetName\n} from '@c8y/ngx-components/global-context';\nimport { isEqual } from 'lodash-es';\nimport { debounceTime, distinctUntilChanged, filter, Observable, take } from 'rxjs';\nimport { DatapointsListViewComponent } from '../datapoints-list-view/datapoints-list-view.component';\nimport { ColumnConfig, DatapointsListConfig } from '../datapoints-list-widget.model';\nimport { DEFAULT_DATAPOINTS_LIST_COLUMNS } from '../datapoints-list.constants';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst DEFAULT_DECIMAL_PLACES = 2;\nconst MIN_DECIMAL_PLACES = 0;\nconst MAX_DECIMAL_PLACES = 10;\n\n@Component({\n selector: 'c8y-datapoints-list-view-config',\n templateUrl: './datapoints-list-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AsyncPipe,\n C8yTranslatePipe,\n DatapointsListViewComponent,\n DragDropModule,\n DynamicComponentModule,\n FormGroupComponent,\n IconDirective,\n ListGroupModule,\n LocalControlsComponent,\n ReactiveFormsModule,\n PopoverModule\n ]\n})\nexport class DatapointsListConfigComponent implements OnInit, AfterViewInit {\n config = input.required<DatapointsListConfig>();\n private readonly previewTemplate = viewChild<TemplateRef<unknown>>('dataPointsListPreview');\n\n private readonly defaultColumns = DEFAULT_DATAPOINTS_LIST_COLUMNS;\n private readonly destroyRef = inject(DestroyRef);\n private readonly form = inject(NgForm);\n private readonly formBuilder = inject(FormBuilder);\n private readonly widgetConfigService = inject(WidgetConfigService);\n\n readonly controls: PresetName = PRESET_NAME.DATA_POINTS_LIST;\n readonly minDecimalPlaces = MIN_DECIMAL_PLACES;\n readonly maxDecimalPlaces = MAX_DECIMAL_PLACES;\n configForm = signal<ReturnType<DatapointsListConfigComponent['createForm']> | undefined>(\n undefined\n );\n readonly columnsFormArray = computed(() => this.configForm()?.get('columns') as FormArray);\n\n /**\n * Debounced config for preview to prevent multiple series requests on initial load.\n * Uses debounceTime to batch rapid emissions (e.g., from initConfig + GlobalContext processing).\n */\n previewConfig$ = this.widgetConfigService.currentConfig$.pipe(\n filter(config => !!config?.dateTimeContext),\n debounceTime(300)\n ) as Observable<DatapointsListConfig>;\n\n ngOnInit(): void {\n this.widgetConfigService.currentConfig$\n .pipe(\n filter(config => !!config?.dateTimeContext),\n take(1),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.initForm());\n }\n\n ngAfterViewInit(): void {\n this.widgetConfigService.setPreview(this.previewTemplate() ?? null);\n }\n\n onColumnDrop(event: CdkDragDrop<ColumnConfig[]>): void {\n const columnsArray = this.columnsFormArray();\n const item = columnsArray.at(event.previousIndex);\n columnsArray.removeAt(event.previousIndex);\n columnsArray.insert(event.currentIndex, item);\n columnsArray.controls.forEach((control, index) => control.patchValue({ order: index }));\n }\n\n private initForm(): void {\n const form = this.createForm();\n this.form.form.addControl('config', form);\n form.patchValue(this.config(), { emitEvent: false });\n\n this.pushFormToService(form.value);\n\n form.valueChanges\n .pipe(\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\n debounceTime(300),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(formValue => {\n if (form.invalid) {\n return;\n }\n\n const { decimalPlaces } = formValue;\n if (\n typeof decimalPlaces === 'number' &&\n (decimalPlaces < MIN_DECIMAL_PLACES || decimalPlaces > MAX_DECIMAL_PLACES)\n ) {\n return;\n }\n\n this.pushFormToService(formValue);\n });\n\n this.configForm.set(form);\n }\n\n private pushFormToService(formValue: unknown): void {\n const formData = formValue as { columns?: ColumnConfig[]; [key: string]: unknown };\n const { columns, ...formValueWithoutColumns } = formData;\n const currentOptions = this.widgetConfigService.currentConfig?.options;\n this.widgetConfigService.updateConfig({\n ...formValueWithoutColumns,\n options: {\n ...currentOptions,\n columns: columns || []\n }\n });\n }\n\n private createForm() {\n const currentConfig = this.config();\n const columns = this.migrateColumnsConfig(currentConfig);\n\n return this.formBuilder.group({\n decimalPlaces: [\n currentConfig?.decimalPlaces ?? DEFAULT_DECIMAL_PLACES,\n [\n Validators.required,\n Validators.min(MIN_DECIMAL_PLACES),\n Validators.max(MAX_DECIMAL_PLACES),\n Validators.pattern('^[0-9]+$')\n ]\n ],\n columns: this.formBuilder.array(\n columns.map(col => this.createColumnFormGroup(col)),\n [Validators.required, Validators.minLength(1), this.minOneColumnVisible()]\n )\n });\n }\n\n private createColumnFormGroup(column: ColumnConfig): FormGroup {\n return this.formBuilder.group({\n id: [column.id, Validators.required],\n label: [column.label, Validators.required],\n visible: [column.visible],\n order: [column.order]\n });\n }\n\n private migrateColumnsConfig(config: DatapointsListConfig): ColumnConfig[] {\n if (config?.options?.columns?.length > 0) {\n return [...config.options.columns].sort((a, b) => a.order - b.order);\n }\n\n return this.defaultColumns.map(defaultCol => ({\n ...defaultCol,\n visible: config?.options?.[defaultCol.id] ?? defaultCol.visible\n }));\n }\n\n private minOneColumnVisible(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const columns: ColumnConfig[] = control.value;\n\n if (!columns?.length) {\n return null;\n }\n\n const visibleColumns = columns.filter(column => column.visible);\n return visibleColumns.length >= 1 ? null : { atLeastOneColumnMustBeVisible: true };\n };\n }\n}\n","@if (configForm(); as form) {\n <form\n class=\"no-card-context\"\n [formGroup]=\"form\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Columns (drag to reorder)' | translate }}</legend>\n <c8y-list-group\n formArrayName=\"columns\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n @if (columnsFormArray().errors?.atLeastOneColumnMustBeVisible) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ 'At least 1 column must be visible.' | translate }}\n </div>\n }\n\n @for (column of columnsFormArray().controls; track column.value.id; let i = $index) {\n <c8y-li\n class=\"c8y-list__item__collapse--container-small\"\n [formGroupName]=\"i\"\n cdkDrag\n >\n <c8y-li-drag-handle\n [title]=\"'Click and drag to reorder' | translate\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-checkbox\n class=\"a-s-center p-r-0\"\n [displayAsSwitch]=\"true\"\n formControlName=\"visible\"\n (click)=\"$event.stopPropagation()\"\n ></c8y-li-checkbox>\n <c8y-li-body>\n <div class=\"d-flex a-i-center\">\n <span class=\"text-truncate\">{{ column.value.label | translate }}</span>\n @switch (column.value.label) {\n @case ('Target') {\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help content' | translate\"\n [popover]=\"\n 'The Target column shows the value set on the target field of the data point'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n }\n @case ('Diff') {\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help content' | translate\"\n [popover]=\"\n 'The Diff column shows the difference between the current value and the target value of the data point'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n }\n </c8y-list-group>\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 [min]=\"minDecimalPlaces\"\n [max]=\"maxDecimalPlaces\"\n />\n </c8y-form-group>\n </fieldset>\n </form>\n}\n\n<ng-template #dataPointsListPreview>\n @let previewConfig = previewConfig$ | async;\n @if (previewConfig && previewConfig.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"previewConfig.displayMode!\"\n [config]=\"previewConfig\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n\n @if (previewConfig) {\n <c8y-datapoints-list\n [config]=\"previewConfig\"\n [isInPreviewMode]=\"true\"\n data-cy=\"c8y-datapoints-list-widget-config--preview-datapoints-list\"\n ></c8y-datapoints-list>\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-datapoints-list.mjs","sources":["../../widgets/implementations/datapoints-list/datapoints-list.constants.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-view.service.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-fetch.service.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-view.component.ts","../../widgets/implementations/datapoints-list/datapoints-list-view/datapoints-list-view.component.html","../../widgets/implementations/datapoints-list/datapoints-list-config/datapoints-list-config.component.ts","../../widgets/implementations/datapoints-list/datapoints-list-config/datapoints-list-config.component.html","../../widgets/implementations/datapoints-list/c8y-ngx-components-widgets-implementations-datapoints-list.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components/gettext';\n\nimport { ColumnConfig } from './datapoints-list-widget.model';\n\n/**\n * Default column configuration for datapoints list widget\n */\nexport const DEFAULT_DATAPOINTS_LIST_COLUMNS: ColumnConfig[] = [\n { id: 'kpi', label: gettext('Label'), visible: true, order: 0 },\n { id: 'target', label: gettext('Target'), visible: true, order: 1 },\n { id: 'current', label: gettext('Current'), visible: true, order: 2 },\n { id: 'diff', label: gettext('Diff'), visible: true, order: 3 },\n { id: 'diffPercentage', label: gettext('Diff %'), visible: true, order: 4 },\n { id: 'asset', label: gettext('Asset'), visible: true, order: 5 }\n];\n","import { Injectable } from '@angular/core';\nimport { IMeasurement } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { DatapointWithMeasurement } from '../datapoints-list-widget.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsListService {\n /**\n * Calculate difference between current value and target\n * @param datapoint - Datapoint record\n * @returns Difference value or null if value/target is undefined\n */\n diff(datapoint: DatapointWithMeasurement): number | null {\n const { currentValue, target } = datapoint;\n // != checks both null and undefined\n if (currentValue != null && target != null) {\n return currentValue - target;\n }\n return null;\n }\n\n /**\n * Calculate percentage difference between current value and target\n * @param datapoint - Datapoint record\n * @returns Percentage difference or null if target is undefined\n */\n diffPercent(datapoint: DatapointWithMeasurement): number | null {\n const target = datapoint.target;\n\n if (target !== null && target !== undefined) {\n const _diff = this.diff(datapoint);\n if (_diff !== null) {\n // Intentionally allows division by zero to return Infinity\n // when target is 0, representing mathematically undefined percentage.\n // This follows the previous AngularJS implementation behavior.\n return (_diff / target) * 100;\n }\n }\n\n return null;\n }\n\n /**\n * Get fraction size format based on whether the value is an integer\n * @param value - Number to check\n * @param defaultFractionSize - Default fraction size format to use for non-integers\n * @returns Fraction size format ('1.0-0' for integers, defaultFractionSize for decimals)\n */\n getFractionSize(value: number | null | undefined, defaultFractionSize: string): string {\n if (value === null || value === undefined) {\n return defaultFractionSize;\n }\n return value % 1 === 0 ? '1.0-0' : defaultFractionSize;\n }\n\n /**\n * Extract current value and timestamp from a measurement\n * @param datapoint - Datapoint configuration (contains fragment and series)\n * @param measurement - Measurement to extract value from\n * @returns Object containing extracted value and timestamp (null if not found)\n */\n extractMeasurementValue(\n datapoint: KPIDetails,\n measurement: IMeasurement | undefined\n ): { value: number | null; timestamp: Date | null } {\n // Return null values if measurement is missing\n if (!measurement) {\n return { value: null, timestamp: null };\n }\n\n // Return null values if datapoint configuration is incomplete\n if (!datapoint.fragment || !datapoint.series) {\n return { value: null, timestamp: null };\n }\n\n // Access the fragment (e.g., \"c8y_Steam\")\n const fragmentData = measurement[datapoint.fragment];\n if (!fragmentData) {\n return { value: null, timestamp: null };\n }\n\n // Access the series within the fragment (e.g., \"Temperature\")\n const seriesData = fragmentData[datapoint.series];\n if (!seriesData || seriesData.value === undefined) {\n return { value: null, timestamp: null };\n }\n\n // Extract and return the value and timestamp\n return {\n value: seriesData.value,\n timestamp: new Date(measurement.time)\n };\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport {\n IManagedObject,\n IMeasurement,\n IMeasurementFilter,\n InventoryService,\n MeasurementService\n} from '@c8y/client';\nimport { AlertService } from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { DatapointWithMeasurement } from '../datapoints-list-widget.model';\nimport { DatapointsListService } from './datapoints-list-view.service';\n\ninterface FetchConfig {\n fractionSize: string;\n dateFrom?: string;\n dateTo?: string;\n}\n\ninterface FetchResult {\n dataPoints: DatapointWithMeasurement[];\n seriesWithoutPermissionCount: number;\n targetManagedObjects: Map<string, IManagedObject>;\n}\n\ninterface SingleDatapointResult {\n datapoint: DatapointWithMeasurement;\n hasPermissionError: boolean;\n}\n\n/**\n * Service that handles all data-fetching operations for the datapoints list widget.\n * Encapsulates measurement fetching, data enrichment, and error handling.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class DatapointsListFetchService {\n private alertService = inject(AlertService);\n private measurementService = inject(MeasurementService);\n private inventoryService = inject(InventoryService);\n private datapointsListService = inject(DatapointsListService);\n\n /**\n * Fetch measurements for all active datapoints and enrich them with calculated values.\n */\n async fetchDatapointsWithMeasurements(\n datapoints: KPIDetails[],\n config: FetchConfig\n ): Promise<FetchResult> {\n const targetManagedObjects = new Map<string, IManagedObject>();\n\n const results = await this.fetchAllDatapoints(datapoints, config);\n\n const enrichedDataPoints = results.map(r => r.datapoint);\n const seriesWithoutPermissionCount = results.filter(r => r.hasPermissionError).length;\n\n await this.fetchTargetManagedObjects(enrichedDataPoints, targetManagedObjects);\n\n return {\n dataPoints: enrichedDataPoints,\n seriesWithoutPermissionCount,\n targetManagedObjects\n };\n }\n\n /**\n * Fetch and enrich all datapoints in parallel.\n * Each datapoint fetch is independent - one failure doesn't affect others.\n */\n private fetchAllDatapoints(\n datapoints: KPIDetails[],\n config: FetchConfig\n ): Promise<SingleDatapointResult[]> {\n return Promise.all(\n datapoints.map((datapoint, index) => this.fetchSingleDatapoint(datapoint, index, config))\n );\n }\n\n /**\n * Fetch measurement for a single datapoint and return enriched result.\n * Handles errors gracefully - returns empty datapoint on failure.\n */\n private async fetchSingleDatapoint(\n datapoint: KPIDetails,\n index: number,\n config: FetchConfig\n ): Promise<SingleDatapointResult> {\n try {\n const measurement = await this.getMeasurementForDatapoint(datapoint, config);\n const measurementValue = this.datapointsListService.extractMeasurementValue(\n datapoint,\n measurement\n );\n\n return {\n datapoint: this.createEnrichedDatapoint(datapoint, index, measurementValue, config),\n hasPermissionError: false\n };\n } catch (error) {\n return this.handleFetchError(error, datapoint, index, config);\n }\n }\n\n /**\n * Handle fetch error and return appropriate result.\n */\n private handleFetchError(\n error: unknown,\n datapoint: KPIDetails,\n index: number,\n config: FetchConfig\n ): SingleDatapointResult {\n const isPermissionError = (error as HttpErrorResponse)?.status === 403;\n\n if (!isPermissionError) {\n this.alertService.addServerFailure(error);\n }\n\n return {\n datapoint: this.createEnrichedDatapoint(\n datapoint,\n index,\n { value: null, timestamp: null },\n config\n ),\n hasPermissionError: isPermissionError\n };\n }\n\n /**\n * Create an enriched datapoint with measurement value and all calculated fields.\n */\n private createEnrichedDatapoint(\n datapoint: KPIDetails,\n index: number,\n measurementValue: { value: number | null; timestamp: Date | null },\n config: FetchConfig\n ): DatapointWithMeasurement {\n const enrichedDatapoint: DatapointWithMeasurement = {\n ...datapoint,\n id: this.getDatapointId(datapoint, index),\n currentValue: measurementValue.value,\n timestamp: measurementValue.timestamp\n };\n\n this.calculateDerivedFields(enrichedDatapoint, config.fractionSize);\n\n return enrichedDatapoint;\n }\n\n /**\n * Calculate and set all derived fields on a datapoint.\n * Includes diff, diffPercent, and fraction sizes for display formatting.\n */\n private calculateDerivedFields(datapoint: DatapointWithMeasurement, fractionSize: string): void {\n datapoint.diffValue = this.datapointsListService.diff(datapoint);\n datapoint.diffPercentValue = this.datapointsListService.diffPercent(datapoint);\n datapoint.currentFractionSize = this.datapointsListService.getFractionSize(\n datapoint.currentValue,\n fractionSize\n );\n datapoint.diffFractionSize = this.datapointsListService.getFractionSize(\n datapoint.diffValue,\n fractionSize\n );\n datapoint.diffPercentFractionSize = this.datapointsListService.getFractionSize(\n datapoint.diffPercentValue,\n fractionSize\n );\n }\n\n /**\n * Fetch managed objects for device status display.\n */\n private async fetchTargetManagedObjects(\n dataPoints: DatapointWithMeasurement[],\n targetManagedObjects: Map<string, IManagedObject>\n ): Promise<void> {\n const uniqueTargetIds = this.getUniqueTargetIds(dataPoints);\n\n if (uniqueTargetIds.size === 0) {\n return;\n }\n\n await Promise.all(\n Array.from(uniqueTargetIds).map(targetId =>\n this.fetchManagedObject(targetId, targetManagedObjects)\n )\n );\n }\n\n /**\n * Get unique target IDs from datapoints.\n */\n private getUniqueTargetIds(dataPoints: DatapointWithMeasurement[]): Set<string> {\n const uniqueTargetIds = new Set<string>();\n\n for (const dp of dataPoints) {\n if (dp.__target?.id) {\n uniqueTargetIds.add(dp.__target.id.toString());\n }\n }\n\n return uniqueTargetIds;\n }\n\n /**\n * Fetch a single managed object and add to the map.\n */\n private async fetchManagedObject(\n targetId: string,\n targetManagedObjects: Map<string, IManagedObject>\n ): Promise<void> {\n try {\n const { data } = await this.inventoryService.detail(targetId);\n targetManagedObjects.set(targetId, data);\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n /**\n * Fetch the most recent measurement for a datapoint within the specified date range.\n */\n private async getMeasurementForDatapoint(\n datapoint: KPIDetails,\n config: FetchConfig\n ): Promise<IMeasurement | null> {\n const sourceId = datapoint.__target?.id;\n if (!sourceId || !datapoint.fragment || !datapoint.series) {\n return null;\n }\n\n const filter: IMeasurementFilter = {\n dateFrom: config.dateFrom || '1970-01-01',\n dateTo: config.dateTo || new Date().toISOString(),\n source: sourceId,\n valueFragmentSeries: datapoint.series,\n valueFragmentType: datapoint.fragment,\n pageSize: 1,\n revert: true\n };\n\n const { data } = await this.measurementService.list(filter);\n return data?.[0] ?? null;\n }\n\n /**\n * Get unique ID for a datapoint.\n * Uses target ID if available, otherwise generates fallback based on index.\n */\n private getDatapointId(datapoint: KPIDetails, fallbackIndex: number): string {\n return datapoint.__target?.id?.toString() || `dp-${fallbackIndex}`;\n }\n}\n","import { DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n OnInit,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport {\n AlertService,\n ApplyRangeClassPipe,\n C8yTranslateDirective,\n C8yTranslatePipe,\n ColorRangeBoundaries,\n DashboardChildComponent,\n DatePipe,\n DeviceStatusComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n DynamicComponentModule,\n EmptyStateComponent,\n ForOfDirective,\n GroupService,\n GuideDocsComponent,\n GuideHrefDirective,\n IconDirective,\n ListGroupModule,\n LoadingComponent,\n VirtualScrollListenerDirective,\n WidgetActionWrapperComponent\n} from '@c8y/ngx-components';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DatapointsExportSelectorComponent,\n ExportConfig\n} from '@c8y/ngx-components/datapoints-export-selector';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n CONTEXT_FEATURE,\n DisplayMode,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextConnectorComponent,\n GlobalContextState,\n LocalControlsComponent,\n PRESET_NAME,\n PresetName,\n REFRESH_OPTION,\n WidgetConfigMigrationService\n} from '@c8y/ngx-components/global-context';\nimport { isEqual, merge } from 'lodash-es';\nimport { pairwise } from 'rxjs';\nimport { DatapointsListConfig, DatapointWithMeasurement } from '../datapoints-list-widget.model';\nimport { DEFAULT_DATAPOINTS_LIST_COLUMNS } from '../datapoints-list.constants';\nimport { DatapointsListFetchService } from './datapoints-list-fetch.service';\n\n@Component({\n selector: 'c8y-datapoints-list',\n templateUrl: './datapoints-list-view.component.html',\n host: { class: 'd-col fit-h' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ApplyRangeClassPipe,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatapointsExportSelectorComponent,\n DatePipe,\n DecimalPipe,\n DeviceStatusComponent,\n DynamicComponentModule,\n EmptyStateComponent,\n ForOfDirective,\n GlobalContextConnectorComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n IconDirective,\n ListGroupModule,\n LoadingComponent,\n LocalControlsComponent,\n NgTemplateOutlet,\n VirtualScrollListenerDirective,\n WidgetActionWrapperComponent\n ]\n})\nexport class DatapointsListViewComponent implements OnInit {\n config = input.required<DatapointsListConfig>();\n isInPreviewMode = input(false);\n\n private readonly alertService = inject(AlertService);\n private readonly dashboardChild = inject(DashboardChildComponent, { optional: true });\n private readonly defaultColumns = DEFAULT_DATAPOINTS_LIST_COLUMNS;\n private readonly fetchService = inject(DatapointsListFetchService);\n private readonly groupService = inject(GroupService);\n private readonly inventoryService = inject(InventoryService);\n private readonly router = inject(Router);\n private readonly widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n\n readonly CONTEXT_FEATURE = CONTEXT_FEATURE;\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n missingAllPermissionsAlert = new DynamicComponentAlertAggregator();\n targetManagedObjects = new Map<string, IManagedObject>();\n\n configSignal = linkedSignal(() => {\n const raw = this.config();\n const migrated = this.widgetConfigMigrationService.migrateWidgetConfig(raw);\n return merge({}, raw, migrated) as DatapointsListConfig;\n });\n contextConfig = signal<GlobalContextState>({});\n dataPoints = signal<DatapointWithMeasurement[]>([]);\n displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n hasLoadedOnce = signal(false);\n hasNoPermissionsToReadAnyMeasurement = signal(false);\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n isLoading = signal(false);\n widgetControls = signal<PresetName>(PRESET_NAME.DATA_POINTS_LIST);\n\n fractionSize = computed(() => {\n const decimalPlaces = this.configSignal()?.decimalPlaces;\n if (typeof decimalPlaces === 'number' && !Number.isNaN(decimalPlaces)) {\n return `1.${decimalPlaces}-${decimalPlaces}`;\n }\n return '1.2-2';\n });\n\n columns = computed(() => {\n const options = this.configSignal()?.options;\n\n if (options?.columns?.length > 0) {\n return [...options.columns].sort((a, b) => a.order - b.order);\n }\n\n return this.defaultColumns.map(defaultCol => ({\n ...defaultCol,\n visible: options?.[defaultCol.id] ?? defaultCol.visible\n }));\n });\n\n visibleColumns = computed(() => {\n return this.columns().filter(col => col.visible !== false);\n });\n\n exportConfig = computed<ExportConfig | null>(() => {\n const effectiveConfig = { ...this.configSignal(), ...this.contextConfig() };\n const dateFrom = effectiveConfig.dateTimeContext?.dateFrom;\n const dateTo = effectiveConfig.dateTimeContext?.dateTo;\n\n if (!dateFrom || !dateTo || (this.isLoading() && !this.hasLoadedOnce())) {\n return null;\n }\n\n return {\n exportType: 'latestWithDetails',\n datapointDetails:\n effectiveConfig.datapoints\n ?.filter(dp => dp.__active === true)\n .map(dp => ({\n deviceName: dp.__target?.name || '',\n source: dp.__target?.id || '',\n valueFragmentSeries: dp.series,\n valueFragmentType: dp.fragment,\n target: dp.target,\n label: dp.label\n })) || [],\n dateFrom: dateFrom instanceof Date ? dateFrom.toISOString() : dateFrom,\n dateTo: dateTo instanceof Date ? dateTo.toISOString() : dateTo,\n columns: this.columns()\n .filter(col => col.visible)\n .map(col => ({\n id: col.id,\n label: col.label,\n visible: col.visible,\n order: col.order\n }))\n };\n });\n\n activeDataPoints = computed(() => {\n return this.configSignal()?.datapoints?.filter(dp => dp.__active === true) ?? [];\n });\n\n private loadRequestId = 0;\n private readonly seriesWithoutPermissionToReadCount = signal(0);\n\n constructor() {\n toObservable(this.config)\n .pipe(pairwise(), takeUntilDestroyed())\n .subscribe(([prevConfig, currentConfig]) => {\n if (!this.isInPreviewMode()) {\n return;\n }\n\n const prevContext = this.extractContextState(prevConfig);\n const newContext = this.extractContextState(currentConfig);\n this.contextConfig.set(newContext);\n\n const datapointsChanged = !isEqual(prevConfig.datapoints, currentConfig.datapoints);\n const decimalPlacesChanged = prevConfig.decimalPlaces !== currentConfig.decimalPlaces;\n const contextChanged = !isEqual(prevContext, newContext);\n\n if (datapointsChanged || decimalPlacesChanged || contextChanged) {\n this.isLoading.set(true);\n this.loadDatapoints();\n }\n });\n }\n\n ngOnInit(): void {\n const config = this.configSignal();\n\n const displayMode = config.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n this.displayMode.set(displayMode as DisplayMode);\n\n this.contextConfig.set(this.extractContextState(config));\n\n if (displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD || this.isInPreviewMode()) {\n this.loadDatapoints();\n }\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n const { diff, context } = event;\n this.contextConfig.set(context);\n\n if (\n diff.isAutoRefreshEnabled === false &&\n Object.keys(diff).length === 1 &&\n context.refreshOption === REFRESH_OPTION.LIVE\n ) {\n return;\n }\n\n this.isLoading.set(true);\n this.loadDatapoints();\n }\n\n onRefresh(): void {\n this.isLoading.set(true);\n this.loadDatapoints();\n }\n\n onExportModalOpen(isOpened: boolean): void {\n this.setAutoRefreshPaused(isOpened);\n }\n\n async redirectToAsset(assetId: string | number | undefined): Promise<void> {\n if (this.isInPreviewMode() || !assetId) {\n return;\n }\n\n try {\n const { data: mo } = await this.inventoryService.detail(assetId);\n\n if (mo) {\n const assetPath = this.groupService.getAssetPath(mo);\n this.router.navigateByUrl(`/${assetPath}/${mo.id}`);\n }\n } catch (error) {\n this.alertService.addServerFailure(error);\n }\n }\n\n getTargetManagedObject(targetId: string | number): IManagedObject | undefined {\n return this.targetManagedObjects.get(targetId.toString());\n }\n\n getDashboardChild(): DashboardChildComponent | null {\n return this.dashboardChild ?? null;\n }\n\n getRangeValues(dp: KPIDetails): ColorRangeBoundaries {\n return {\n yellowRangeMin: dp.yellowRangeMin,\n yellowRangeMax: dp.yellowRangeMax,\n redRangeMin: dp.redRangeMin,\n redRangeMax: dp.redRangeMax\n };\n }\n\n onListScrolled(): void {\n this.setAutoRefreshPaused(true);\n }\n\n onListScrolledToTop(): void {\n this.setAutoRefreshPaused(false);\n }\n\n private extractContextState(config: Partial<GlobalContextState>): GlobalContextState {\n return {\n dateTimeContext: config.dateTimeContext,\n aggregation: config.aggregation,\n isAutoRefreshEnabled: config.isAutoRefreshEnabled,\n refreshInterval: config.refreshInterval,\n refreshOption: config.refreshOption\n };\n }\n\n private setAutoRefreshPaused(paused: boolean): void {\n if (this.isInPreviewMode()) {\n return;\n }\n\n const current = this.contextConfig();\n if (current.refreshOption === REFRESH_OPTION.HISTORY) {\n return;\n }\n\n this.contextConfig.set({\n ...current,\n isAutoRefreshEnabled: !paused\n });\n this.isLinkedToGlobal.set(!paused);\n }\n\n private loadDatapoints(): void {\n if (this.activeDataPoints().length > 0) {\n this.fetchMeasurements();\n } else {\n this.dataPoints.set([]);\n this.hasLoadedOnce.set(true);\n this.isLoading.set(false);\n }\n }\n\n private async fetchMeasurements(): Promise<void> {\n const requestId = ++this.loadRequestId;\n\n try {\n this.isLoading.set(true);\n\n const effectiveConfig = {\n ...this.configSignal(),\n ...this.contextConfig()\n };\n\n const dateFrom = effectiveConfig.dateTimeContext?.dateFrom;\n const dateTo = effectiveConfig.dateTimeContext?.dateTo;\n\n const dateFromStr = dateFrom instanceof Date ? dateFrom.toISOString() : dateFrom;\n const dateToStr = dateTo instanceof Date ? dateTo.toISOString() : dateTo;\n\n const result = await this.fetchService.fetchDatapointsWithMeasurements(\n this.activeDataPoints(),\n { fractionSize: this.fractionSize(), dateFrom: dateFromStr, dateTo: dateToStr }\n );\n\n if (requestId === this.loadRequestId) {\n this.dataPoints.set(result.dataPoints);\n this.targetManagedObjects = result.targetManagedObjects;\n this.hasLoadedOnce.set(true);\n this.seriesWithoutPermissionToReadCount.set(result.seriesWithoutPermissionCount);\n this.checkAndDisplayPermissionErrors();\n }\n } finally {\n if (requestId === this.loadRequestId) {\n this.isLoading.set(false);\n }\n }\n }\n\n private checkAndDisplayPermissionErrors(): void {\n if (this.seriesWithoutPermissionToReadCount()) {\n this.missingAllPermissionsAlert.clear();\n this.handleNoPermissionErrorMessage();\n }\n }\n\n private handleNoPermissionErrorMessage(): void {\n const noPermissions =\n this.seriesWithoutPermissionToReadCount() === this.activeDataPoints().length;\n this.hasNoPermissionsToReadAnyMeasurement.set(noPermissions);\n\n if (noPermissions) {\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","@if (!isInPreviewMode()) {\n <div class=\"d-flex gap-16 p-r-16 inner-scroll h-auto min-width-0\">\n @if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n [dashboardChild]=\"getDashboardChild()!\"\n [linked]=\"isLinkedToGlobal()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n } @else {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [isLoading]=\"isLoading()\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n }\n </div>\n}\n\n@if (!isInPreviewMode() && exportConfig(); as config) {\n <c8y-widget-action>\n <c8y-datapoints-export-selector\n [displayMode]=\"'icon-only'\"\n [exportConfig]=\"config\"\n [containerClass]=\"'d-contents'\"\n (isOpen)=\"onExportModalOpen($event)\"\n ></c8y-datapoints-export-selector>\n </c8y-widget-action>\n}\n\n@if (!hasNoPermissionsToReadAnyMeasurement()) {\n <!-- the .page-sticky-header -->\n @if (dataPoints().length > 0) {\n <div class=\"hidden-xs hidden-sm c8y-list__item\">\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__icon\">\n <i style=\"width: 22px\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n <div\n [class]=\"\n column.id === 'kpi' || column.id === 'asset'\n ? 'col-md-3 flex-grow min-width-0'\n : column.id == 'diff' || column.id == 'diffPercentage'\n ? 'col-md-1 flex-grow min-width-0'\n : 'col-md-2 flex-grow min-width-0'\n \"\n [class.text-right]=\"column.id !== 'asset' && column.id !== 'kpi'\"\n >\n <span\n class=\"text-medium text-truncate\"\n translate\n >\n {{ column.label }}\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n <!-- The record list -->\n @if (isLoading() && !hasLoadedOnce()) {\n <!-- Initial load: full spinner -->\n <ng-container [ngTemplateOutlet]=\"loading\"></ng-container>\n } @else {\n @if (isLoading()) {\n <!-- Refresh: inline loading overlay -->\n <div class=\"p-absolute fit-w overflow-hidden p-b-4\">\n <c8y-loading [layout]=\"'page'\"></c8y-loading>\n </div>\n }\n @if (dataPoints().length) {\n <c8y-list-group\n class=\"flex-grow\"\n role=\"list\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li\n role=\"listitem\"\n *c8yFor=\"\n let dp of { data: dataPoints(), res: null! };\n enableVirtualScroll: true;\n virtualScrollElementSize: 48;\n virtualScrollStrategy: 'fixed'\n \"\n >\n <c8y-li-icon>\n <i\n c8yIcon=\"circle\"\n [style.color]=\"dp.color\"\n ></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex-md row\">\n @for (column of visibleColumns(); track column.id) {\n @switch (column.id) {\n @case ('kpi') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n {{ dp.label | translate }}\n @if (dp.unit) {\n <small class=\"text-muted\">{{ dp.unit }}</small>\n }\n </div>\n </div>\n }\n @case ('target') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>{{ dp.target }}</span>\n </div>\n </div>\n }\n @case ('current') {\n <div\n class=\"col-md-2 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span\n [class]=\"dp.currentValue | applyRangeClass: getRangeValues(dp)\"\n [title]=\"dp.timestamp | c8yDate: 'medium'\"\n [attr.aria-label]=\"\n ('Last updated: ' | translate) + (dp.timestamp | c8yDate: 'medium')\n \"\n >\n {{ dp.currentValue | number: dp.currentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diff') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffValue | number: dp.diffFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('diffPercentage') {\n <div\n class=\"col-md-1 text-right-md flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <span>\n {{ dp.diffPercentValue | number: dp.diffPercentFractionSize }}\n </span>\n </div>\n </div>\n }\n @case ('asset') {\n <div\n class=\"col-md-3 flex-grow\"\n [attr.data-cy]=\"'datapointlist-' + column.id\"\n >\n <div class=\"d-flex a-i-center d-contents-md p-t-4 p-b-4 separator-bottom\">\n <small\n class=\"text-label-small flex-grow visible-xs-inline-block visible-sm-inline-block\"\n >{{ column.label }}</small\n >\n <button\n class=\"btn-clean d-flex a-i-center gap-4 text-muted\"\n [attr.aria-label]=\"('Navigate to ' | translate) + dp.__target?.name\"\n type=\"button\"\n (click)=\"redirectToAsset(dp.__target?.id)\"\n >\n @if (dp.__target?.id && getTargetManagedObject(dp.__target.id); as mo) {\n <c8y-device-status\n [mo]=\"mo\"\n [size]=\"16\"\n ></c8y-device-status>\n }\n <small\n class=\"text-truncate\"\n [title]=\"dp.__target?.name\"\n >{{ dp.__target?.name }}</small\n >\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n } @else {\n <ng-container [ngTemplateOutlet]=\"emptyState\"></ng-container>\n }\n }\n} @else {\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}\n\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n\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-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-list\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n","import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { AsyncPipe } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n OnInit,\n signal,\n TemplateRef,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n FormArray,\n FormBuilder,\n FormGroup,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n C8yTranslatePipe,\n DynamicComponentModule,\n FormGroupComponent,\n IconDirective,\n ListGroupModule\n} from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n LocalControlsComponent,\n PRESET_NAME,\n PresetName\n} from '@c8y/ngx-components/global-context';\nimport { isEqual } from 'lodash-es';\nimport { debounceTime, distinctUntilChanged, filter, Observable, take } from 'rxjs';\nimport { DatapointsListViewComponent } from '../datapoints-list-view/datapoints-list-view.component';\nimport { ColumnConfig, DatapointsListConfig } from '../datapoints-list-widget.model';\nimport { DEFAULT_DATAPOINTS_LIST_COLUMNS } from '../datapoints-list.constants';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst DEFAULT_DECIMAL_PLACES = 2;\nconst MIN_DECIMAL_PLACES = 0;\nconst MAX_DECIMAL_PLACES = 10;\n\n@Component({\n selector: 'c8y-datapoints-list-view-config',\n templateUrl: './datapoints-list-config.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AsyncPipe,\n C8yTranslatePipe,\n DatapointsListViewComponent,\n DragDropModule,\n DynamicComponentModule,\n FormGroupComponent,\n IconDirective,\n ListGroupModule,\n LocalControlsComponent,\n ReactiveFormsModule,\n PopoverModule\n ]\n})\nexport class DatapointsListConfigComponent implements OnInit, AfterViewInit {\n config = input.required<DatapointsListConfig>();\n private readonly previewTemplate = viewChild<TemplateRef<unknown>>('dataPointsListPreview');\n\n private readonly defaultColumns = DEFAULT_DATAPOINTS_LIST_COLUMNS;\n private readonly destroyRef = inject(DestroyRef);\n private readonly form = inject(NgForm);\n private readonly formBuilder = inject(FormBuilder);\n private readonly widgetConfigService = inject(WidgetConfigService);\n\n readonly controls: PresetName = PRESET_NAME.DATA_POINTS_LIST;\n readonly minDecimalPlaces = MIN_DECIMAL_PLACES;\n readonly maxDecimalPlaces = MAX_DECIMAL_PLACES;\n configForm = signal<ReturnType<DatapointsListConfigComponent['createForm']> | undefined>(\n undefined\n );\n readonly columnsFormArray = computed(() => this.configForm()?.get('columns') as FormArray);\n\n /**\n * Debounced config for preview to prevent multiple series requests on initial load.\n * Uses debounceTime to batch rapid emissions (e.g., from initConfig + GlobalContext processing).\n */\n previewConfig$ = this.widgetConfigService.currentConfig$.pipe(\n filter(config => !!config?.dateTimeContext),\n debounceTime(300)\n ) as Observable<DatapointsListConfig>;\n\n ngOnInit(): void {\n this.widgetConfigService.currentConfig$\n .pipe(\n filter(config => !!config?.dateTimeContext),\n take(1),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.initForm());\n }\n\n ngAfterViewInit(): void {\n this.widgetConfigService.setPreview(this.previewTemplate() ?? null);\n }\n\n onColumnDrop(event: CdkDragDrop<ColumnConfig[]>): void {\n const columnsArray = this.columnsFormArray();\n const item = columnsArray.at(event.previousIndex);\n columnsArray.removeAt(event.previousIndex);\n columnsArray.insert(event.currentIndex, item);\n columnsArray.controls.forEach((control, index) => control.patchValue({ order: index }));\n }\n\n private initForm(): void {\n const form = this.createForm();\n this.form.form.addControl('config', form);\n form.patchValue(this.config(), { emitEvent: false });\n\n this.pushFormToService(form.value);\n\n form.valueChanges\n .pipe(\n distinctUntilChanged((prev, curr) => isEqual(prev, curr)),\n debounceTime(300),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(formValue => {\n if (form.invalid) {\n return;\n }\n\n const { decimalPlaces } = formValue;\n if (\n typeof decimalPlaces === 'number' &&\n (decimalPlaces < MIN_DECIMAL_PLACES || decimalPlaces > MAX_DECIMAL_PLACES)\n ) {\n return;\n }\n\n this.pushFormToService(formValue);\n });\n\n this.configForm.set(form);\n }\n\n private pushFormToService(formValue: unknown): void {\n const formData = formValue as { columns?: ColumnConfig[]; [key: string]: unknown };\n const { columns, ...formValueWithoutColumns } = formData;\n const currentOptions = this.widgetConfigService.currentConfig?.options;\n this.widgetConfigService.updateConfig({\n ...formValueWithoutColumns,\n options: {\n ...currentOptions,\n columns: columns || []\n }\n });\n }\n\n private createForm() {\n const currentConfig = this.config();\n const columns = this.migrateColumnsConfig(currentConfig);\n\n return this.formBuilder.group({\n decimalPlaces: [\n currentConfig?.decimalPlaces ?? DEFAULT_DECIMAL_PLACES,\n [\n Validators.required,\n Validators.min(MIN_DECIMAL_PLACES),\n Validators.max(MAX_DECIMAL_PLACES),\n Validators.pattern('^[0-9]+$')\n ]\n ],\n columns: this.formBuilder.array(\n columns.map(col => this.createColumnFormGroup(col)),\n [Validators.required, Validators.minLength(1), this.minOneColumnVisible()]\n )\n });\n }\n\n private createColumnFormGroup(column: ColumnConfig): FormGroup {\n return this.formBuilder.group({\n id: [column.id, Validators.required],\n label: [column.label, Validators.required],\n visible: [column.visible],\n order: [column.order]\n });\n }\n\n private migrateColumnsConfig(config: DatapointsListConfig): ColumnConfig[] {\n if (config?.options?.columns?.length > 0) {\n return [...config.options.columns].sort((a, b) => a.order - b.order);\n }\n\n return this.defaultColumns.map(defaultCol => ({\n ...defaultCol,\n visible: config?.options?.[defaultCol.id] ?? defaultCol.visible\n }));\n }\n\n private minOneColumnVisible(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const columns: ColumnConfig[] = control.value;\n\n if (!columns?.length) {\n return null;\n }\n\n const visibleColumns = columns.filter(column => column.visible);\n return visibleColumns.length >= 1 ? null : { atLeastOneColumnMustBeVisible: true };\n };\n }\n}\n","@if (configForm(); as form) {\n <form\n class=\"no-card-context\"\n [formGroup]=\"form\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Columns (drag to reorder)' | translate }}</legend>\n <c8y-list-group\n formArrayName=\"columns\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n @if (columnsFormArray().errors?.atLeastOneColumnMustBeVisible) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ 'At least 1 column must be visible.' | translate }}\n </div>\n }\n\n @for (column of columnsFormArray().controls; track column.value.id; let i = $index) {\n <c8y-li\n class=\"c8y-list__item__collapse--container-small\"\n [formGroupName]=\"i\"\n cdkDrag\n >\n <c8y-li-drag-handle\n [title]=\"'Click and drag to reorder' | translate\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-checkbox\n class=\"a-s-center p-r-0\"\n [displayAsSwitch]=\"true\"\n formControlName=\"visible\"\n (click)=\"$event.stopPropagation()\"\n ></c8y-li-checkbox>\n <c8y-li-body>\n <div class=\"d-flex a-i-center\">\n <span class=\"text-truncate\">{{ column.value.label | translate }}</span>\n @switch (column.value.label) {\n @case ('Target') {\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help content' | translate\"\n [popover]=\"\n 'The Target column shows the value set on the target field of the data point'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n }\n @case ('Diff') {\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help content' | translate\"\n [popover]=\"\n 'The Diff column shows the difference between the current value and the target value of the data point'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n }\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n }\n </c8y-list-group>\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 [min]=\"minDecimalPlaces\"\n [max]=\"maxDecimalPlaces\"\n />\n </c8y-form-group>\n </fieldset>\n </form>\n}\n\n<ng-template #dataPointsListPreview>\n @let previewConfig = previewConfig$ | async;\n @if (previewConfig && previewConfig.displayMode !== 'dashboard') {\n <c8y-local-controls\n [controls]=\"controls\"\n [displayMode]=\"previewConfig.displayMode!\"\n [config]=\"previewConfig\"\n [disabled]=\"true\"\n ></c8y-local-controls>\n }\n\n @if (previewConfig) {\n <c8y-datapoints-list\n [config]=\"previewConfig\"\n [isInPreviewMode]=\"true\"\n data-cy=\"c8y-datapoints-list-widget-config--preview-datapoints-list\"\n ></c8y-datapoints-list>\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|