@c8y/ngx-components 1021.13.3 → 1021.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alarms/alarms-list.component.d.ts +2 -17
- package/alarms/alarms-list.component.d.ts.map +1 -1
- package/alarms/alarms-view.service.d.ts +1 -0
- package/alarms/alarms-view.service.d.ts.map +1 -1
- package/alarms/alarms.model.d.ts +30 -0
- package/alarms/alarms.model.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.model.d.ts +1 -0
- package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts +7 -5
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.component.d.ts +4 -7
- package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.service.d.ts +4 -4
- package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
- package/core/action-bar/action-bar-item.component.d.ts +1 -1
- package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
- package/core/action-bar/action-bar.module.d.ts +6 -6
- package/core/action-bar/action-bar.module.d.ts.map +1 -1
- package/core/bootstrap/bootstrap.component.d.ts +3 -1
- package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
- package/core/common/aggregation/aggregation.model.d.ts +39 -0
- package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
- package/core/common/aggregation/aggregation.service.d.ts +17 -0
- package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
- package/core/common/index.d.ts +4 -0
- package/core/common/index.d.ts.map +1 -1
- package/core/common/inter-app.service.d.ts +48 -0
- package/core/common/inter-app.service.d.ts.map +1 -0
- package/core/common/interval-based-reload.abstract.d.ts +120 -0
- package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
- package/core/dashboard/dashboard.module.d.ts +24 -18
- package/core/dashboard/dashboard.module.d.ts.map +1 -1
- package/core/dashboard/index.d.ts +3 -0
- package/core/dashboard/index.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
- package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
- package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
- package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
- package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +11 -8
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +6 -12
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
- package/core/header/header.module.d.ts +18 -18
- package/core/header/header.module.d.ts.map +1 -1
- package/core/header/title/title.component.d.ts +1 -1
- package/core/header/title/title.component.d.ts.map +1 -1
- package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
- package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
- package/core/i18n/i18n.module.d.ts +0 -4
- package/core/i18n/i18n.module.d.ts.map +1 -1
- package/core/i18n/index.d.ts +2 -1
- package/core/i18n/index.d.ts.map +1 -1
- package/core/i18n/translation-loader.service.d.ts +50 -0
- package/core/i18n/translation-loader.service.d.ts.map +1 -0
- package/core/i18n/translation-utils.d.ts +14 -0
- package/core/i18n/translation-utils.d.ts.map +1 -0
- package/core/plugins/plugins-resolve.service.d.ts +7 -10
- package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
- package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
- package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
- package/datapoints-export-selector/index.d.ts +15 -0
- package/datapoints-export-selector/index.d.ts.map +1 -0
- package/device-list/device-list.module.d.ts +4 -2
- package/device-list/device-list.module.d.ts.map +1 -1
- package/esm2022/alarms/alarms-list.component.mjs +5 -16
- package/esm2022/alarms/alarms-view.service.mjs +2 -1
- package/esm2022/alarms/alarms.model.mjs +1 -1
- package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
- package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
- package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
- package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
- package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
- package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
- package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
- package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
- package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
- package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
- package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
- package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
- package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
- package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
- package/esm2022/core/common/index.mjs +5 -1
- package/esm2022/core/common/inter-app.service.mjs +76 -0
- package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
- package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
- package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
- package/esm2022/core/dashboard/dashboard.module.mjs +18 -1
- package/esm2022/core/dashboard/index.mjs +4 -1
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
- package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
- package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -37
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -28
- package/esm2022/core/date-time-picker/date-time-picker.component.mjs +3 -3
- package/esm2022/core/header/header.module.mjs +7 -5
- package/esm2022/core/header/title/title.component.mjs +3 -3
- package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
- package/esm2022/core/i18n/i18n.module.mjs +7 -14
- package/esm2022/core/i18n/index.mjs +3 -2
- package/esm2022/core/i18n/translate.parser.mjs +2 -2
- package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
- package/esm2022/core/i18n/translation-utils.mjs +24 -0
- package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
- package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
- package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
- package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
- package/esm2022/datapoints-export-selector/index.mjs +15 -0
- package/esm2022/device-list/add-smart-group.component.mjs +4 -3
- package/esm2022/device-list/device-list.module.mjs +22 -4
- package/esm2022/map/cluster-map.component.mjs +41 -13
- package/esm2022/map/map-status.component.mjs +6 -5
- package/esm2022/map/map.component.mjs +9 -5
- package/esm2022/map/map.model.mjs +1 -1
- package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
- package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
- package/esm2022/translation-editor/data/index.mjs +2 -0
- package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
- package/esm2022/translation-editor/index.mjs +10 -0
- package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
- package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
- package/esm2022/translation-editor/lazy/index.mjs +2 -0
- package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
- package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
- package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
- package/esm2022/widgets/cockpit/index.mjs +4 -2
- package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
- package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
- package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
- package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
- package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
- package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
- package/esm2022/widgets/definitions/index.mjs +2 -1
- package/esm2022/widgets/definitions/map/index.mjs +4 -2
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
- package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
- package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
- package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
- package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
- package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
- package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
- package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
- package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +5 -15
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +52 -19
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
- package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +5080 -4272
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +289 -18
- package/locales/en.po +12 -0
- package/locales/en_US.po +3 -0
- package/locales/es.po +253 -18
- package/locales/fr.po +253 -18
- package/locales/ja_JP.po +282 -18
- package/locales/locales.pot +257 -18
- package/locales/nl.po +253 -18
- package/locales/pl.po +253 -18
- package/locales/pt_BR.po +253 -18
- package/map/cluster-map.component.d.ts +8 -3
- package/map/cluster-map.component.d.ts.map +1 -1
- package/map/map-status.component.d.ts +0 -3
- package/map/map-status.component.d.ts.map +1 -1
- package/map/map.component.d.ts +4 -2
- package/map/map.component.d.ts.map +1 -1
- package/map/map.model.d.ts +2 -1
- package/map/map.model.d.ts.map +1 -1
- package/package.json +1 -1
- package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
- package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
- package/translation-editor/data/index.d.ts +2 -0
- package/translation-editor/data/index.d.ts.map +1 -0
- package/translation-editor/data/translation-store.service.d.ts +61 -0
- package/translation-editor/data/translation-store.service.d.ts.map +1 -0
- package/translation-editor/index.d.ts +2 -0
- package/translation-editor/index.d.ts.map +1 -0
- package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
- package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
- package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
- package/translation-editor/lazy/index.d.ts +2 -0
- package/translation-editor/lazy/index.d.ts.map +1 -0
- package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
- package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
- package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
- package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
- package/widgets/cockpit/index.d.ts +13 -0
- package/widgets/cockpit/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
- package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
- package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
- package/widgets/definitions/datapoints-table/index.d.ts +14 -0
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/definitions/map/index.d.ts +2 -1
- package/widgets/definitions/map/index.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/index.d.ts +10 -0
- package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
- package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
- package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.component.d.ts +8 -3
- package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.model.d.ts +4 -3
- package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
- package/core/i18n/translate.loader.d.ts +0 -31
- package/core/i18n/translate.loader.d.ts.map +0 -1
- package/esm2022/core/i18n/translate.loader.mjs +0 -71
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { AGGREGATION_VALUES } from '@c8y/ngx-components';
|
|
3
|
+
import { TIME_RANGE_INTERVAL_UNITS_VALUES } from '@c8y/ngx-components/datapoints-export-selector';
|
|
4
|
+
import { INTERVALS } from '@c8y/ngx-components/interval-picker';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class DatapointsTableConfigService {
|
|
7
|
+
/**
|
|
8
|
+
* Determines the interval between two dates.
|
|
9
|
+
*
|
|
10
|
+
* @param dateFrom - The starting date in ISO 8601 string format.
|
|
11
|
+
* @param dateTo - The ending date in ISO 8601 string format.
|
|
12
|
+
* @returns The time range interval unit.
|
|
13
|
+
*/
|
|
14
|
+
// TODO same method is in datapoints export component. Consider moving it to a shared service, or reuse it here
|
|
15
|
+
// when DPT will be integrating with MTM-59689.
|
|
16
|
+
// Integration task: MTM-60221
|
|
17
|
+
// tests are already added in MTM-60217
|
|
18
|
+
determineInterval(dateFrom, dateTo) {
|
|
19
|
+
const from = new Date(dateFrom);
|
|
20
|
+
const to = new Date(dateTo);
|
|
21
|
+
const differenceInMilliseconds = to.getTime() - from.getTime();
|
|
22
|
+
const [minutes, hours, days, weeks, months, custom] = INTERVALS;
|
|
23
|
+
const intervals = [
|
|
24
|
+
{ value: minutes.timespanInMs, id: minutes.id }, // milliseconds in one minute
|
|
25
|
+
{ value: hours.timespanInMs, id: hours.id }, // milliseconds in one hour
|
|
26
|
+
{ value: days.timespanInMs, id: days.id }, // milliseconds in one day
|
|
27
|
+
{ value: weeks.timespanInMs, id: weeks.id }, // milliseconds in one week
|
|
28
|
+
{ value: months.timespanInMs, id: months.id } // approximation for milliseconds in one month
|
|
29
|
+
];
|
|
30
|
+
const interval = intervals.find(interval => differenceInMilliseconds <= interval.value);
|
|
31
|
+
return interval ? interval.id : custom.id;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Updates the disabled state of aggregation options based on the current value of the time interval form control.
|
|
35
|
+
*
|
|
36
|
+
* This method:
|
|
37
|
+
* - Retrieves the current date range from the form controls.
|
|
38
|
+
* - Determines the current time interval based on the date range.
|
|
39
|
+
* - Sets the disabled state for each aggregation option based on predefined conditions.
|
|
40
|
+
*
|
|
41
|
+
* The disabled state is stored in the `disabledAggregationOptions` object,
|
|
42
|
+
* where the key is the aggregation value and the value is a boolean indicating whether the option should be disabled.
|
|
43
|
+
*
|
|
44
|
+
* The `disabledConditions` object defines the conditions under which each aggregation option should be disabled.
|
|
45
|
+
*
|
|
46
|
+
* @param dateFrom - The starting date of the range.
|
|
47
|
+
* @param dateTo - The ending date of the range.
|
|
48
|
+
* @param aggregationValuesArr - An array of aggregation options.
|
|
49
|
+
* @returns An object containing the disabled state of each aggregation option.
|
|
50
|
+
*/
|
|
51
|
+
// TODO similar method is in datapoints export component. Consider moving it to a shared service when DPT will be integrating with MTM-59689.
|
|
52
|
+
// Integration task: MTM-60221
|
|
53
|
+
// tests are already added in MTM-60217
|
|
54
|
+
updateDisabledStateOfAggregationOptionEntries(dateFrom, dateTo, aggregationValuesArr) {
|
|
55
|
+
const currentInterval = this.determineInterval(dateFrom, dateTo);
|
|
56
|
+
const disabledConditions = {
|
|
57
|
+
[AGGREGATION_VALUES.daily]: [
|
|
58
|
+
TIME_RANGE_INTERVAL_UNITS_VALUES.minutes,
|
|
59
|
+
TIME_RANGE_INTERVAL_UNITS_VALUES.hours,
|
|
60
|
+
TIME_RANGE_INTERVAL_UNITS_VALUES.days
|
|
61
|
+
],
|
|
62
|
+
[AGGREGATION_VALUES.hourly]: [
|
|
63
|
+
TIME_RANGE_INTERVAL_UNITS_VALUES.minutes,
|
|
64
|
+
TIME_RANGE_INTERVAL_UNITS_VALUES.hours
|
|
65
|
+
],
|
|
66
|
+
[AGGREGATION_VALUES.minutely]: [TIME_RANGE_INTERVAL_UNITS_VALUES.minutes]
|
|
67
|
+
};
|
|
68
|
+
const disabledAggregationOptions = {};
|
|
69
|
+
for (const aggregationValue of aggregationValuesArr) {
|
|
70
|
+
disabledAggregationOptions[aggregationValue] =
|
|
71
|
+
disabledConditions[aggregationValue]?.includes(currentInterval) ?? false;
|
|
72
|
+
}
|
|
73
|
+
return disabledAggregationOptions;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Determines the new aggregation value based on the current value and disabled options.
|
|
77
|
+
*
|
|
78
|
+
* Goal is to switch to the next available aggregation option if the current one is disabled.
|
|
79
|
+
* - If the current option is disabled, sets the control to the first available (non-disabled) option based on the following order:
|
|
80
|
+
* - If the current value is `DAILY`, it switches to `HOURLY` if it's not disabled, otherwise to `MINUTELY` if `HOURLY` is also disabled.
|
|
81
|
+
* - If the current value is `HOURLY`, it switches to `MINUTELY` if it's not disabled.
|
|
82
|
+
* - If all options are disabled, it sets the value to `NONE`.
|
|
83
|
+
*
|
|
84
|
+
* @param currentValue - The current aggregation option.
|
|
85
|
+
* @param disabledOptions - An object containing disabled options.
|
|
86
|
+
* @returns The new aggregation option.
|
|
87
|
+
*/
|
|
88
|
+
determineNewAggregationValue(currentValue, disabledOptions) {
|
|
89
|
+
const { daily, hourly, minutely, none } = AGGREGATION_VALUES;
|
|
90
|
+
if (!disabledOptions[currentValue]) {
|
|
91
|
+
return currentValue; // Return the current value if it's not disabled
|
|
92
|
+
}
|
|
93
|
+
if (currentValue === daily) {
|
|
94
|
+
return !disabledOptions[hourly] ? hourly : !disabledOptions[minutely] ? minutely : none;
|
|
95
|
+
}
|
|
96
|
+
if (currentValue === hourly) {
|
|
97
|
+
return !disabledOptions[minutely] ? minutely : none;
|
|
98
|
+
}
|
|
99
|
+
return none; // Fallback to 'none' if all else fails
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Determines the aggregation value based on the provided interval.
|
|
103
|
+
*
|
|
104
|
+
* @param interval - The time range interval.
|
|
105
|
+
* @returns The corresponding aggregation value.
|
|
106
|
+
*/
|
|
107
|
+
determineAggregationValue(interval) {
|
|
108
|
+
const aggregationMap = {
|
|
109
|
+
[TIME_RANGE_INTERVAL_UNITS_VALUES.minutes]: AGGREGATION_VALUES.none,
|
|
110
|
+
[TIME_RANGE_INTERVAL_UNITS_VALUES.hours]: AGGREGATION_VALUES.minutely,
|
|
111
|
+
[TIME_RANGE_INTERVAL_UNITS_VALUES.days]: AGGREGATION_VALUES.hourly
|
|
112
|
+
};
|
|
113
|
+
return aggregationMap[interval] || AGGREGATION_VALUES.daily;
|
|
114
|
+
}
|
|
115
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
116
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableConfigService, providedIn: 'root' }); }
|
|
117
|
+
}
|
|
118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableConfigService, decorators: [{
|
|
119
|
+
type: Injectable,
|
|
120
|
+
args: [{
|
|
121
|
+
providedIn: 'root'
|
|
122
|
+
}]
|
|
123
|
+
}] });
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS1jb25maWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtdGFibGUvZGF0YXBvaW50cy10YWJsZS1jb25maWcvZGF0YXBvaW50cy10YWJsZS1jb25maWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxrQkFBa0IsRUFHbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsZ0NBQWdDLEVBRWpDLE1BQU0sZ0RBQWdELENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQUtoRSxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDOzs7Ozs7T0FNRztJQUNILCtHQUErRztJQUMvRywrQ0FBK0M7SUFDL0MsOEJBQThCO0lBQzlCLHVDQUF1QztJQUN2QyxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9ELE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVoRSxNQUFNLFNBQVMsR0FBRztZQUNoQixFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsNkJBQTZCO1lB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QXVDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHlCQUF5QixDQUFDLFFBQTJCO1FBQ25ELE1BQU0sY0FBYyxHQUFHO1lBQ3JCLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtZQUNuRSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxFQUFFLGtCQUFrQixDQUFDLFFBQVE7WUFDckUsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO1NBQ25FLENBQUM7UUFFRixPQUFPLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7SUFDOUQsQ0FBQzs4R0FuSVUsNEJBQTRCO2tIQUE1Qiw0QkFBNEIsY0FGM0IsTUFBTTs7MkZBRVAsNEJBQTRCO2tCQUh4QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1ZBTFVFUyxcbiAgQWdncmVnYXRpb25PcHRpb24sXG4gIEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMsXG4gIFRpbWVSYW5nZUludGVydmFsXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgSU5URVJWQUxTIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pbnRlcnZhbC1waWNrZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVDb25maWdTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0ZUZyb20gLSBUaGUgc3RhcnRpbmcgZGF0ZSBpbiBJU08gODYwMSBzdHJpbmcgZm9ybWF0LlxuICAgKiBAcGFyYW0gZGF0ZVRvIC0gVGhlIGVuZGluZyBkYXRlIGluIElTTyA4NjAxIHN0cmluZyBmb3JtYXQuXG4gICAqIEByZXR1cm5zIFRoZSB0aW1lIHJhbmdlIGludGVydmFsIHVuaXQuXG4gICAqL1xuICAvLyBUT0RPIHNhbWUgbWV0aG9kIGlzIGluIGRhdGFwb2ludHMgZXhwb3J0IGNvbXBvbmVudC4gQ29uc2lkZXIgbW92aW5nIGl0IHRvIGEgc2hhcmVkIHNlcnZpY2UsIG9yIHJldXNlIGl0IGhlcmVcbiAgLy8gd2hlbiBEUFQgd2lsbCBiZSBpbnRlZ3JhdGluZyB3aXRoIE1UTS01OTY4OS5cbiAgLy8gSW50ZWdyYXRpb24gdGFzazogTVRNLTYwMjIxXG4gIC8vIHRlc3RzIGFyZSBhbHJlYWR5IGFkZGVkIGluIE1UTS02MDIxN1xuICBkZXRlcm1pbmVJbnRlcnZhbChkYXRlRnJvbTogc3RyaW5nLCBkYXRlVG86IHN0cmluZyk6IFRpbWVSYW5nZUludGVydmFsIHtcbiAgICBjb25zdCBmcm9tID0gbmV3IERhdGUoZGF0ZUZyb20pO1xuICAgIGNvbnN0IHRvID0gbmV3IERhdGUoZGF0ZVRvKTtcbiAgICBjb25zdCBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMgPSB0by5nZXRUaW1lKCkgLSBmcm9tLmdldFRpbWUoKTtcblxuICAgIGNvbnN0IFttaW51dGVzLCBob3VycywgZGF5cywgd2Vla3MsIG1vbnRocywgY3VzdG9tXSA9IElOVEVSVkFMUztcblxuICAgIGNvbnN0IGludGVydmFscyA9IFtcbiAgICAgIHsgdmFsdWU6IG1pbnV0ZXMudGltZXNwYW5Jbk1zLCBpZDogbWludXRlcy5pZCB9LCAvLyBtaWxsaXNlY29uZHMgaW4gb25lIG1pbnV0ZVxuICAgICAgeyB2YWx1ZTogaG91cnMudGltZXNwYW5Jbk1zLCBpZDogaG91cnMuaWQgfSwgLy8gbWlsbGlzZWNvbmRzIGluIG9uZSBob3VyXG4gICAgICB7IHZhbHVlOiBkYXlzLnRpbWVzcGFuSW5NcywgaWQ6IGRheXMuaWQgfSwgLy8gbWlsbGlzZWNvbmRzIGluIG9uZSBkYXlcbiAgICAgIHsgdmFsdWU6IHdlZWtzLnRpbWVzcGFuSW5NcywgaWQ6IHdlZWtzLmlkIH0sIC8vIG1pbGxpc2Vjb25kcyBpbiBvbmUgd2Vla1xuICAgICAgeyB2YWx1ZTogbW9udGhzLnRpbWVzcGFuSW5NcywgaWQ6IG1vbnRocy5pZCB9IC8vIGFwcHJveGltYXRpb24gZm9yIG1pbGxpc2Vjb25kcyBpbiBvbmUgbW9udGhcbiAgICBdO1xuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBpbnRlcnZhbHMuZmluZChpbnRlcnZhbCA9PiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMgPD0gaW50ZXJ2YWwudmFsdWUpO1xuXG4gICAgcmV0dXJuIGludGVydmFsID8gaW50ZXJ2YWwuaWQgOiBjdXN0b20uaWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgYWdncmVnYXRpb24gb3B0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGltZSBpbnRlcnZhbCBmb3JtIGNvbnRyb2wuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAtIFJldHJpZXZlcyB0aGUgY3VycmVudCBkYXRlIHJhbmdlIGZyb20gdGhlIGZvcm0gY29udHJvbHMuXG4gICAqIC0gRGV0ZXJtaW5lcyB0aGUgY3VycmVudCB0aW1lIGludGVydmFsIGJhc2VkIG9uIHRoZSBkYXRlIHJhbmdlLlxuICAgKiAtIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIGZvciBlYWNoIGFnZ3JlZ2F0aW9uIG9wdGlvbiBiYXNlZCBvbiBwcmVkZWZpbmVkIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIFRoZSBkaXNhYmxlZCBzdGF0ZSBpcyBzdG9yZWQgaW4gdGhlIGBkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc2Agb2JqZWN0LFxuICAgKiB3aGVyZSB0aGUga2V5IGlzIHRoZSBhZ2dyZWdhdGlvbiB2YWx1ZSBhbmQgdGhlIHZhbHVlIGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAqXG4gICAqIFRoZSBgZGlzYWJsZWRDb25kaXRpb25zYCBvYmplY3QgZGVmaW5lcyB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCBlYWNoIGFnZ3JlZ2F0aW9uIG9wdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRlRnJvbSAtIFRoZSBzdGFydGluZyBkYXRlIG9mIHRoZSByYW5nZS5cbiAgICogQHBhcmFtIGRhdGVUbyAtIFRoZSBlbmRpbmcgZGF0ZSBvZiB0aGUgcmFuZ2UuXG4gICAqIEBwYXJhbSBhZ2dyZWdhdGlvblZhbHVlc0FyciAtIEFuIGFycmF5IG9mIGFnZ3JlZ2F0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiBlYWNoIGFnZ3JlZ2F0aW9uIG9wdGlvbi5cbiAgICovXG4gIC8vIFRPRE8gc2ltaWxhciBtZXRob2QgaXMgaW4gZGF0YXBvaW50cyBleHBvcnQgY29tcG9uZW50LiBDb25zaWRlciBtb3ZpbmcgaXQgdG8gYSBzaGFyZWQgc2VydmljZSB3aGVuIERQVCB3aWxsIGJlIGludGVncmF0aW5nIHdpdGggTVRNLTU5Njg5LlxuICAvLyBJbnRlZ3JhdGlvbiB0YXNrOiBNVE0tNjAyMjFcbiAgLy8gdGVzdHMgYXJlIGFscmVhZHkgYWRkZWQgaW4gTVRNLTYwMjE3XG4gIHVwZGF0ZURpc2FibGVkU3RhdGVPZkFnZ3JlZ2F0aW9uT3B0aW9uRW50cmllcyhcbiAgICBkYXRlRnJvbTogc3RyaW5nLFxuICAgIGRhdGVUbzogc3RyaW5nLFxuICAgIGFnZ3JlZ2F0aW9uVmFsdWVzQXJyOiByZWFkb25seSBBZ2dyZWdhdGlvbk9wdGlvbltdXG4gICk6IEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzIHtcbiAgICBjb25zdCBjdXJyZW50SW50ZXJ2YWwgPSB0aGlzLmRldGVybWluZUludGVydmFsKGRhdGVGcm9tLCBkYXRlVG8pO1xuXG4gICAgY29uc3QgZGlzYWJsZWRDb25kaXRpb25zID0ge1xuICAgICAgW0FHR1JFR0FUSU9OX1ZBTFVFUy5kYWlseV06IFtcbiAgICAgICAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMubWludXRlcyxcbiAgICAgICAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuaG91cnMsXG4gICAgICAgIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmRheXNcbiAgICAgIF0sXG4gICAgICBbQUdHUkVHQVRJT05fVkFMVUVTLmhvdXJseV06IFtcbiAgICAgICAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMubWludXRlcyxcbiAgICAgICAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuaG91cnNcbiAgICAgIF0sXG4gICAgICBbQUdHUkVHQVRJT05fVkFMVUVTLm1pbnV0ZWx5XTogW1RJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLm1pbnV0ZXNdXG4gICAgfTtcblxuICAgIGNvbnN0IGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGFnZ3JlZ2F0aW9uVmFsdWUgb2YgYWdncmVnYXRpb25WYWx1ZXNBcnIpIHtcbiAgICAgIGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zW2FnZ3JlZ2F0aW9uVmFsdWVdID1cbiAgICAgICAgZGlzYWJsZWRDb25kaXRpb25zW2FnZ3JlZ2F0aW9uVmFsdWVdPy5pbmNsdWRlcyhjdXJyZW50SW50ZXJ2YWwpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBuZXcgYWdncmVnYXRpb24gdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgYW5kIGRpc2FibGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEdvYWwgaXMgdG8gc3dpdGNoIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBhZ2dyZWdhdGlvbiBvcHRpb24gaWYgdGhlIGN1cnJlbnQgb25lIGlzIGRpc2FibGVkLlxuICAgKiAtIElmIHRoZSBjdXJyZW50IG9wdGlvbiBpcyBkaXNhYmxlZCwgc2V0cyB0aGUgY29udHJvbCB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIChub24tZGlzYWJsZWQpIG9wdGlvbiBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICAgKiAgIC0gSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYERBSUxZYCwgaXQgc3dpdGNoZXMgdG8gYEhPVVJMWWAgaWYgaXQncyBub3QgZGlzYWJsZWQsIG90aGVyd2lzZSB0byBgTUlOVVRFTFlgIGlmIGBIT1VSTFlgIGlzIGFsc28gZGlzYWJsZWQuXG4gICAqICAgLSBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBgSE9VUkxZYCwgaXQgc3dpdGNoZXMgdG8gYE1JTlVURUxZYCBpZiBpdCdzIG5vdCBkaXNhYmxlZC5cbiAgICogICAtIElmIGFsbCBvcHRpb25zIGFyZSBkaXNhYmxlZCwgaXQgc2V0cyB0aGUgdmFsdWUgdG8gYE5PTkVgLlxuICAgKlxuICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIC0gVGhlIGN1cnJlbnQgYWdncmVnYXRpb24gb3B0aW9uLlxuICAgKiBAcGFyYW0gZGlzYWJsZWRPcHRpb25zIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGlzYWJsZWQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5ldyBhZ2dyZWdhdGlvbiBvcHRpb24uXG4gICAqL1xuICBkZXRlcm1pbmVOZXdBZ2dyZWdhdGlvblZhbHVlKFxuICAgIGN1cnJlbnRWYWx1ZTogQWdncmVnYXRpb25PcHRpb24sXG4gICAgZGlzYWJsZWRPcHRpb25zOiBBZ2dyZWdhdGlvbk9wdGlvblN0YXR1c1xuICApOiBBZ2dyZWdhdGlvbk9wdGlvbiB7XG4gICAgY29uc3QgeyBkYWlseSwgaG91cmx5LCBtaW51dGVseSwgbm9uZSB9ID0gQUdHUkVHQVRJT05fVkFMVUVTO1xuXG4gICAgaWYgKCFkaXNhYmxlZE9wdGlvbnNbY3VycmVudFZhbHVlXSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTsgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGlmIGl0J3Mgbm90IGRpc2FibGVkXG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gZGFpbHkpIHtcbiAgICAgIHJldHVybiAhZGlzYWJsZWRPcHRpb25zW2hvdXJseV0gPyBob3VybHkgOiAhZGlzYWJsZWRPcHRpb25zW21pbnV0ZWx5XSA/IG1pbnV0ZWx5IDogbm9uZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFZhbHVlID09PSBob3VybHkpIHtcbiAgICAgIHJldHVybiAhZGlzYWJsZWRPcHRpb25zW21pbnV0ZWx5XSA/IG1pbnV0ZWx5IDogbm9uZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9uZTsgLy8gRmFsbGJhY2sgdG8gJ25vbmUnIGlmIGFsbCBlbHNlIGZhaWxzXG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgYWdncmVnYXRpb24gdmFsdWUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGludGVydmFsLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJ2YWwgLSBUaGUgdGltZSByYW5nZSBpbnRlcnZhbC5cbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYWdncmVnYXRpb24gdmFsdWUuXG4gICAqL1xuICBkZXRlcm1pbmVBZ2dyZWdhdGlvblZhbHVlKGludGVydmFsOiBUaW1lUmFuZ2VJbnRlcnZhbCk6IEFnZ3JlZ2F0aW9uT3B0aW9uIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbk1hcCA9IHtcbiAgICAgIFtUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5taW51dGVzXTogQUdHUkVHQVRJT05fVkFMVUVTLm5vbmUsXG4gICAgICBbVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuaG91cnNdOiBBR0dSRUdBVElPTl9WQUxVRVMubWludXRlbHksXG4gICAgICBbVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuZGF5c106IEFHR1JFR0FUSU9OX1ZBTFVFUy5ob3VybHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIGFnZ3JlZ2F0aW9uTWFwW2ludGVydmFsXSB8fCBBR0dSRUdBVElPTl9WQUxVRVMuZGFpbHk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import { aggregationType as AggregationTypeEnum } from '@c8y/client';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* A pipe that adjusts the aggregated time range based on the aggregation type.
|
|
6
|
+
*
|
|
7
|
+
* ```html
|
|
8
|
+
* '9:00' | adjustAggregatedTimeRange: config.aggregation (e.g.:HOURLY)
|
|
9
|
+
* ```
|
|
10
|
+
* The output will be '9:00-10:00'.
|
|
11
|
+
*/
|
|
12
|
+
export class AdjustAggregatedTimeRangePipe {
|
|
13
|
+
/**
|
|
14
|
+
* Transforms the input time based on the aggregation type.
|
|
15
|
+
* @param inputTime The input time string.
|
|
16
|
+
* @param aggregationType The type of aggregation (optional).
|
|
17
|
+
* @returns The transformed time string.
|
|
18
|
+
*/
|
|
19
|
+
transform(inputTime, aggregationType) {
|
|
20
|
+
if (!aggregationType) {
|
|
21
|
+
return inputTime;
|
|
22
|
+
}
|
|
23
|
+
if (aggregationType === AggregationTypeEnum.DAILY) {
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
26
|
+
const date = this.createDateFromInput(inputTime);
|
|
27
|
+
const isTwelveHoursFormat = this.isTwelveHoursFormat(inputTime);
|
|
28
|
+
switch (aggregationType) {
|
|
29
|
+
case AggregationTypeEnum.HOURLY:
|
|
30
|
+
return this.getHourlyTimeRange(date, isTwelveHoursFormat);
|
|
31
|
+
case AggregationTypeEnum.MINUTELY:
|
|
32
|
+
return this.getMinutelyTimeRange(date, isTwelveHoursFormat);
|
|
33
|
+
default:
|
|
34
|
+
throw new Error('Unsupported aggregation type');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates a date object from the input time string.
|
|
39
|
+
* @param inputTime The input time string.
|
|
40
|
+
* @returns The created Date object.
|
|
41
|
+
*/
|
|
42
|
+
createDateFromInput(inputTime) {
|
|
43
|
+
const defaultDate = '1970-01-01 ';
|
|
44
|
+
const isPM = /PM/i.test(inputTime);
|
|
45
|
+
const cleanedTime = inputTime.replace(/AM|PM/i, '').trim();
|
|
46
|
+
this.validateTimeFormat(cleanedTime, inputTime);
|
|
47
|
+
const dateTimeString = `${defaultDate}${cleanedTime}`;
|
|
48
|
+
const date = new Date(dateTimeString);
|
|
49
|
+
if (isNaN(date.getTime())) {
|
|
50
|
+
throw new Error('Invalid input time');
|
|
51
|
+
}
|
|
52
|
+
return this.adjustForPMTime(date, isPM);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Validates if the time string matches the required format and has valid values.
|
|
56
|
+
* @param time The time string to validate.
|
|
57
|
+
* @param originalInput The original input string (including AM/PM if present).
|
|
58
|
+
* @throws Error if the time format is invalid or values are out of range.
|
|
59
|
+
*/
|
|
60
|
+
validateTimeFormat(time, originalInput) {
|
|
61
|
+
const parts = time.split(':');
|
|
62
|
+
this.validateTimeParts(parts);
|
|
63
|
+
const [hoursStr, minutesStr, secondsStr] = parts;
|
|
64
|
+
this.validateTimeDigits(hoursStr, minutesStr, secondsStr);
|
|
65
|
+
const { hours, minutes, seconds } = this.parseTimeComponents(hoursStr, minutesStr, secondsStr);
|
|
66
|
+
this.validateTimeRanges(hours, minutes, seconds);
|
|
67
|
+
this.validateTimeFormat24Hour(hours, originalInput);
|
|
68
|
+
}
|
|
69
|
+
validateTimeParts(parts) {
|
|
70
|
+
if (parts.length < 2 || parts.length > 3) {
|
|
71
|
+
throw new Error('Invalid input time');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
validateTimeDigits(hoursStr, minutesStr, secondsStr) {
|
|
75
|
+
if (!this.isValidNumberString(hoursStr) ||
|
|
76
|
+
!this.isValidNumberString(minutesStr) ||
|
|
77
|
+
(secondsStr !== undefined && !this.isValidNumberString(secondsStr))) {
|
|
78
|
+
throw new Error('Invalid input time');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
parseTimeComponents(hoursStr, minutesStr, secondsStr) {
|
|
82
|
+
return {
|
|
83
|
+
hours: Number(hoursStr),
|
|
84
|
+
minutes: Number(minutesStr),
|
|
85
|
+
seconds: secondsStr ? Number(secondsStr) : 0
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
validateTimeRanges(hours, minutes, seconds) {
|
|
89
|
+
if (hours > 23 || hours < 0 || minutes > 59 || minutes < 0 || seconds > 59 || seconds < 0) {
|
|
90
|
+
throw new Error('Invalid input time');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
validateTimeFormat24Hour(hours, originalInput) {
|
|
94
|
+
if (hours > 12 && this.hasAmPm(originalInput)) {
|
|
95
|
+
throw new Error('Invalid input time');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Checks if string contains only digits and is 1-2 characters long.
|
|
100
|
+
* @param value String to check
|
|
101
|
+
* @returns boolean indicating if string is valid
|
|
102
|
+
*/
|
|
103
|
+
isValidNumberString(value) {
|
|
104
|
+
return (value.length > 0 &&
|
|
105
|
+
value.length <= 2 &&
|
|
106
|
+
value.split('').every(char => char >= '0' && char <= '9'));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Checks if the input time has AM/PM markers.
|
|
110
|
+
* @param input The input time string to check.
|
|
111
|
+
* @returns boolean indicating if the input contains AM/PM.
|
|
112
|
+
*/
|
|
113
|
+
hasAmPm(input) {
|
|
114
|
+
return /AM|PM/i.test(input);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Adjusts the date for PM times by adding 12 hours when necessary.
|
|
118
|
+
* @param date The date object to adjust.
|
|
119
|
+
* @param isPM Boolean indicating if the time is PM.
|
|
120
|
+
* @returns The adjusted Date object.
|
|
121
|
+
*/
|
|
122
|
+
adjustForPMTime(date, isPM) {
|
|
123
|
+
const hours = date.getHours();
|
|
124
|
+
if (isPM && hours < 12) {
|
|
125
|
+
date.setHours(hours + 12);
|
|
126
|
+
}
|
|
127
|
+
else if (!isPM && hours === 12) {
|
|
128
|
+
date.setHours(0);
|
|
129
|
+
}
|
|
130
|
+
return date;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Checks if the input time is in twelve hours format.
|
|
134
|
+
* @param inputTime The input time string.
|
|
135
|
+
* @returns True if the input time is in twelve hours format, false otherwise.
|
|
136
|
+
*/
|
|
137
|
+
isTwelveHoursFormat(inputTime) {
|
|
138
|
+
return /AM|PM/i.test(inputTime);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Gets the hourly time range for the given date.
|
|
142
|
+
* @param date The date object.
|
|
143
|
+
* @param twelveHoursFormat Indicates whether to use twelve hours format.
|
|
144
|
+
* @returns The hourly time range string.
|
|
145
|
+
*/
|
|
146
|
+
getHourlyTimeRange(date, twelveHoursFormat) {
|
|
147
|
+
const nextHour = new Date(date.getTime());
|
|
148
|
+
nextHour.setHours(date.getHours() + 1);
|
|
149
|
+
return `${this.formatTime(date, twelveHoursFormat, true)}-${this.formatTime(nextHour, twelveHoursFormat, true)}`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Gets the minutely time range for the given date.
|
|
153
|
+
* @param date The date object.
|
|
154
|
+
* @param twelveHoursFormat Indicates whether to use twelve hours format.
|
|
155
|
+
* @returns The minutely time range string.
|
|
156
|
+
*/
|
|
157
|
+
getMinutelyTimeRange(date, twelveHoursFormat) {
|
|
158
|
+
const nextMinute = new Date(date.getTime());
|
|
159
|
+
nextMinute.setMinutes(date.getMinutes() + 1);
|
|
160
|
+
return `${this.formatTime(date, twelveHoursFormat, false)}-${this.formatTime(nextMinute, twelveHoursFormat, false)}`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Formats the given date into a time string.
|
|
164
|
+
* @param date The date to format.
|
|
165
|
+
* @param usePeriod Indicates whether to include the period (AM/PM) in the formatted time.
|
|
166
|
+
* @param useHourOnly Indicates whether to include only the hour part in the formatted time.
|
|
167
|
+
* @returns The formatted time string.
|
|
168
|
+
*/
|
|
169
|
+
formatTime(date, usePeriod, useHourOnly) {
|
|
170
|
+
const hours = date.getHours();
|
|
171
|
+
const minutes = date.getMinutes().toString().padStart(2, '0');
|
|
172
|
+
if (usePeriod) {
|
|
173
|
+
const period = hours >= 12 ? 'PM' : 'AM';
|
|
174
|
+
const formattedHours = hours % 12 === 0 ? 12 : hours % 12;
|
|
175
|
+
return `${formattedHours}:${useHourOnly ? '00' : minutes} ${period}`;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
return `${hours.toString().padStart(2, '0')}:${useHourOnly ? '00' : minutes}`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AdjustAggregatedTimeRangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
182
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.9", ngImport: i0, type: AdjustAggregatedTimeRangePipe, isStandalone: true, name: "adjustAggregatedTimeRange" }); }
|
|
183
|
+
}
|
|
184
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AdjustAggregatedTimeRangePipe, decorators: [{
|
|
185
|
+
type: Pipe,
|
|
186
|
+
args: [{
|
|
187
|
+
name: 'adjustAggregatedTimeRange',
|
|
188
|
+
standalone: true
|
|
189
|
+
}]
|
|
190
|
+
}] });
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLElBQUksbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBR3JFOzs7Ozs7O0dBT0c7QUFLSCxNQUFNLE9BQU8sNkJBQTZCO0lBQ3hDOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFNBQWlCLEVBQUUsZUFBbUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLGVBQWUsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEUsUUFBUSxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzVELEtBQUssbUJBQW1CLENBQUMsUUFBUTtnQkFDL0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDOUQ7Z0JBQ0UsTUFBTSxJQUFJLEtBQUss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LEVBQUUsU0FBa0IsRUFBRSxXQUFvQjtRQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE1BQU0sY0FBYyxHQUFHLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUQsT0FBTyxHQUFHLGNBQWMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRixDQUFDO0lBQ0gsQ0FBQzs4R0FqTVUsNkJBQTZCOzRHQUE3Qiw2QkFBNkI7OzJGQUE3Qiw2QkFBNkI7a0JBSnpDLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIGFzIEFnZ3JlZ2F0aW9uVHlwZUVudW0gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbk9wdGlvbiB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG4vKipcbiAqIEEgcGlwZSB0aGF0IGFkanVzdHMgdGhlIGFnZ3JlZ2F0ZWQgdGltZSByYW5nZSBiYXNlZCBvbiB0aGUgYWdncmVnYXRpb24gdHlwZS5cbiAqXG4gKiBgYGBodG1sXG4gKiAnOTowMCcgfCBhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlOiBjb25maWcuYWdncmVnYXRpb24gKGUuZy46SE9VUkxZKVxuICogYGBgXG4gKiBUaGUgb3V0cHV0IHdpbGwgYmUgJzk6MDAtMTA6MDAnLlxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBBZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdGltZSBiYXNlZCBvbiB0aGUgYWdncmVnYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlucHV0VGltZSBUaGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBhZ2dyZWdhdGlvblR5cGUgVGhlIHR5cGUgb2YgYWdncmVnYXRpb24gKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIHRpbWUgc3RyaW5nLlxuICAgKi9cbiAgdHJhbnNmb3JtKGlucHV0VGltZTogc3RyaW5nLCBhZ2dyZWdhdGlvblR5cGU/OiBBZ2dyZWdhdGlvbk9wdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCFhZ2dyZWdhdGlvblR5cGUpIHtcbiAgICAgIHJldHVybiBpbnB1dFRpbWU7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uVHlwZSA9PT0gQWdncmVnYXRpb25UeXBlRW51bS5EQUlMWSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNyZWF0ZURhdGVGcm9tSW5wdXQoaW5wdXRUaW1lKTtcbiAgICBjb25zdCBpc1R3ZWx2ZUhvdXJzRm9ybWF0ID0gdGhpcy5pc1R3ZWx2ZUhvdXJzRm9ybWF0KGlucHV0VGltZSk7XG5cbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgICAgY2FzZSBBZ2dyZWdhdGlvblR5cGVFbnVtLkhPVVJMWTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SG91cmx5VGltZVJhbmdlKGRhdGUsIGlzVHdlbHZlSG91cnNGb3JtYXQpO1xuICAgICAgY2FzZSBBZ2dyZWdhdGlvblR5cGVFbnVtLk1JTlVURUxZOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNaW51dGVseVRpbWVSYW5nZShkYXRlLCBpc1R3ZWx2ZUhvdXJzRm9ybWF0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWdncmVnYXRpb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGF0ZSBvYmplY3QgZnJvbSB0aGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGhlIGlucHV0IHRpbWUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBEYXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRGF0ZUZyb21JbnB1dChpbnB1dFRpbWU6IHN0cmluZyk6IERhdGUge1xuICAgIGNvbnN0IGRlZmF1bHREYXRlID0gJzE5NzAtMDEtMDEgJztcbiAgICBjb25zdCBpc1BNID0gL1BNL2kudGVzdChpbnB1dFRpbWUpO1xuICAgIGNvbnN0IGNsZWFuZWRUaW1lID0gaW5wdXRUaW1lLnJlcGxhY2UoL0FNfFBNL2ksICcnKS50cmltKCk7XG5cbiAgICB0aGlzLnZhbGlkYXRlVGltZUZvcm1hdChjbGVhbmVkVGltZSwgaW5wdXRUaW1lKTtcblxuICAgIGNvbnN0IGRhdGVUaW1lU3RyaW5nID0gYCR7ZGVmYXVsdERhdGV9JHtjbGVhbmVkVGltZX1gO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlVGltZVN0cmluZyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgdGltZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkanVzdEZvclBNVGltZShkYXRlLCBpc1BNKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIHRpbWUgc3RyaW5nIG1hdGNoZXMgdGhlIHJlcXVpcmVkIGZvcm1hdCBhbmQgaGFzIHZhbGlkIHZhbHVlcy5cbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgc3RyaW5nIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0gb3JpZ2luYWxJbnB1dCBUaGUgb3JpZ2luYWwgaW5wdXQgc3RyaW5nIChpbmNsdWRpbmcgQU0vUE0gaWYgcHJlc2VudCkuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRpbWUgZm9ybWF0IGlzIGludmFsaWQgb3IgdmFsdWVzIGFyZSBvdXQgb2YgcmFuZ2UuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGltZUZvcm1hdCh0aW1lOiBzdHJpbmcsIG9yaWdpbmFsSW5wdXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnRzID0gdGltZS5zcGxpdCgnOicpO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lUGFydHMocGFydHMpO1xuXG4gICAgY29uc3QgW2hvdXJzU3RyLCBtaW51dGVzU3RyLCBzZWNvbmRzU3RyXSA9IHBhcnRzO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lRGlnaXRzKGhvdXJzU3RyLCBtaW51dGVzU3RyLCBzZWNvbmRzU3RyKTtcblxuICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgfSA9IHRoaXMucGFyc2VUaW1lQ29tcG9uZW50cyhob3Vyc1N0ciwgbWludXRlc1N0ciwgc2Vjb25kc1N0cik7XG4gICAgdGhpcy52YWxpZGF0ZVRpbWVSYW5nZXMoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lRm9ybWF0MjRIb3VyKGhvdXJzLCBvcmlnaW5hbElucHV0KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUaW1lUGFydHMocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZURpZ2l0cyhob3Vyc1N0cjogc3RyaW5nLCBtaW51dGVzU3RyOiBzdHJpbmcsIHNlY29uZHNTdHI/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1ZhbGlkTnVtYmVyU3RyaW5nKGhvdXJzU3RyKSB8fFxuICAgICAgIXRoaXMuaXNWYWxpZE51bWJlclN0cmluZyhtaW51dGVzU3RyKSB8fFxuICAgICAgKHNlY29uZHNTdHIgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1ZhbGlkTnVtYmVyU3RyaW5nKHNlY29uZHNTdHIpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVGltZUNvbXBvbmVudHMoaG91cnNTdHI6IHN0cmluZywgbWludXRlc1N0cjogc3RyaW5nLCBzZWNvbmRzU3RyPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvdXJzOiBOdW1iZXIoaG91cnNTdHIpLFxuICAgICAgbWludXRlczogTnVtYmVyKG1pbnV0ZXNTdHIpLFxuICAgICAgc2Vjb25kczogc2Vjb25kc1N0ciA/IE51bWJlcihzZWNvbmRzU3RyKSA6IDBcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRpbWVSYW5nZXMoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCBzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaG91cnMgPiAyMyB8fCBob3VycyA8IDAgfHwgbWludXRlcyA+IDU5IHx8IG1pbnV0ZXMgPCAwIHx8IHNlY29uZHMgPiA1OSB8fCBzZWNvbmRzIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZUZvcm1hdDI0SG91cihob3VyczogbnVtYmVyLCBvcmlnaW5hbElucHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaG91cnMgPiAxMiAmJiB0aGlzLmhhc0FtUG0ob3JpZ2luYWxJbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0aW1lJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBzdHJpbmcgY29udGFpbnMgb25seSBkaWdpdHMgYW5kIGlzIDEtMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdG8gY2hlY2tcbiAgICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHN0cmluZyBpcyB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkTnVtYmVyU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUubGVuZ3RoID4gMCAmJlxuICAgICAgdmFsdWUubGVuZ3RoIDw9IDIgJiZcbiAgICAgIHZhbHVlLnNwbGl0KCcnKS5ldmVyeShjaGFyID0+IGNoYXIgPj0gJzAnICYmIGNoYXIgPD0gJzknKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB0aW1lIGhhcyBBTS9QTSBtYXJrZXJzLlxuICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHRpbWUgc3RyaW5nIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGlucHV0IGNvbnRhaW5zIEFNL1BNLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNBbVBtKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL0FNfFBNL2kudGVzdChpbnB1dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgZGF0ZSBmb3IgUE0gdGltZXMgYnkgYWRkaW5nIDEyIGhvdXJzIHdoZW4gbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSBvYmplY3QgdG8gYWRqdXN0LlxuICAgKiBAcGFyYW0gaXNQTSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRpbWUgaXMgUE0uXG4gICAqIEByZXR1cm5zIFRoZSBhZGp1c3RlZCBEYXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgYWRqdXN0Rm9yUE1UaW1lKGRhdGU6IERhdGUsIGlzUE06IGJvb2xlYW4pOiBEYXRlIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBpZiAoaXNQTSAmJiBob3VycyA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKGhvdXJzICsgMTIpO1xuICAgIH0gZWxzZSBpZiAoIWlzUE0gJiYgaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKDApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHRpbWUgaXMgaW4gdHdlbHZlIGhvdXJzIGZvcm1hdC5cbiAgICogQHBhcmFtIGlucHV0VGltZSBUaGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGlucHV0IHRpbWUgaXMgaW4gdHdlbHZlIGhvdXJzIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1R3ZWx2ZUhvdXJzRm9ybWF0KGlucHV0VGltZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9BTXxQTS9pLnRlc3QoaW5wdXRUaW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBob3VybHkgdGltZSByYW5nZSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIG9iamVjdC5cbiAgICogQHBhcmFtIHR3ZWx2ZUhvdXJzRm9ybWF0IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0d2VsdmUgaG91cnMgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgaG91cmx5IHRpbWUgcmFuZ2Ugc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIb3VybHlUaW1lUmFuZ2UoZGF0ZTogRGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5leHRIb3VyID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgIG5leHRIb3VyLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSArIDEpO1xuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdFRpbWUoZGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIHRydWUpfS0ke3RoaXMuZm9ybWF0VGltZShuZXh0SG91ciwgdHdlbHZlSG91cnNGb3JtYXQsIHRydWUpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWludXRlbHkgdGltZSByYW5nZSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIG9iamVjdC5cbiAgICogQHBhcmFtIHR3ZWx2ZUhvdXJzRm9ybWF0IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0d2VsdmUgaG91cnMgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgbWludXRlbHkgdGltZSByYW5nZSBzdHJpbmcuXG4gICAqL1xuICBwcml2YXRlIGdldE1pbnV0ZWx5VGltZVJhbmdlKGRhdGU6IERhdGUsIHR3ZWx2ZUhvdXJzRm9ybWF0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZXh0TWludXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgIG5leHRNaW51dGUuc2V0TWludXRlcyhkYXRlLmdldE1pbnV0ZXMoKSArIDEpO1xuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdFRpbWUoZGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIGZhbHNlKX0tJHt0aGlzLmZvcm1hdFRpbWUobmV4dE1pbnV0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIGZhbHNlKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIGdpdmVuIGRhdGUgaW50byBhIHRpbWUgc3RyaW5nLlxuICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gICAqIEBwYXJhbSB1c2VQZXJpb2QgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcGVyaW9kIChBTS9QTSkgaW4gdGhlIGZvcm1hdHRlZCB0aW1lLlxuICAgKiBAcGFyYW0gdXNlSG91ck9ubHkgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHRoZSBob3VyIHBhcnQgaW4gdGhlIGZvcm1hdHRlZCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGRhdGU6IERhdGUsIHVzZVBlcmlvZDogYm9vbGVhbiwgdXNlSG91ck9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgaWYgKHVzZVBlcmlvZCkge1xuICAgICAgY29uc3QgcGVyaW9kID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEhvdXJzID0gaG91cnMgJSAxMiA9PT0gMCA/IDEyIDogaG91cnMgJSAxMjtcbiAgICAgIHJldHVybiBgJHtmb3JtYXR0ZWRIb3Vyc306JHt1c2VIb3VyT25seSA/ICcwMCcgOiBtaW51dGVzfSAke3BlcmlvZH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3VzZUhvdXJPbmx5ID8gJzAwJyA6IG1pbnV0ZXN9YDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Applies CSS classes based on the value's range.
|
|
5
|
+
*/
|
|
6
|
+
export class ApplyRangeClassPipe {
|
|
7
|
+
/**
|
|
8
|
+
* Transforms the input value based on the specified ranges.
|
|
9
|
+
*
|
|
10
|
+
* @param value - Initial value used to determine the CSS class.
|
|
11
|
+
* @param ranges - An object containing the min and max range values for yellow and red colors.
|
|
12
|
+
* @returns The CSS class to be applied.
|
|
13
|
+
*/
|
|
14
|
+
transform(value, ranges) {
|
|
15
|
+
if (value == null) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (value >= ranges.yellowRangeMin && value < ranges.yellowRangeMax) {
|
|
19
|
+
return 'text-warning';
|
|
20
|
+
}
|
|
21
|
+
else if (value >= ranges.redRangeMin && value <= ranges.redRangeMax) {
|
|
22
|
+
return 'text-danger';
|
|
23
|
+
}
|
|
24
|
+
return 'default';
|
|
25
|
+
}
|
|
26
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ApplyRangeClassPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
27
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.9", ngImport: i0, type: ApplyRangeClassPipe, isStandalone: true, name: "applyRangeClass" }); }
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ApplyRangeClassPipe, decorators: [{
|
|
30
|
+
type: Pipe,
|
|
31
|
+
args: [{
|
|
32
|
+
name: 'applyRangeClass',
|
|
33
|
+
standalone: true
|
|
34
|
+
}]
|
|
35
|
+
}] });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktcmFuZ2UtY2xhc3MucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtdGFibGUvZGF0YXBvaW50cy10YWJsZS12aWV3L2FwcGx5LXJhbmdlLWNsYXNzLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBR3BEOztHQUVHO0FBS0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM5Qjs7Ozs7O09BTUc7SUFDSCxTQUFTLENBQUMsS0FBYSxFQUFFLE1BQTRCO1FBQ25ELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLGNBQWMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BFLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEUsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7OEdBbkJVLG1CQUFtQjs0R0FBbkIsbUJBQW1COzsyRkFBbkIsbUJBQW1CO2tCQUovQixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbG9yUmFuZ2VCb3VuZGFyaWVzIH0gZnJvbSAnLi4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuXG4vKipcbiAqIEFwcGxpZXMgQ1NTIGNsYXNzZXMgYmFzZWQgb24gdGhlIHZhbHVlJ3MgcmFuZ2UuXG4gKi9cbkBQaXBlKHtcbiAgbmFtZTogJ2FwcGx5UmFuZ2VDbGFzcycsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQXBwbHlSYW5nZUNsYXNzUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdmFsdWUgYmFzZWQgb24gdGhlIHNwZWNpZmllZCByYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEluaXRpYWwgdmFsdWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIENTUyBjbGFzcy5cbiAgICogQHBhcmFtIHJhbmdlcyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtaW4gYW5kIG1heCByYW5nZSB2YWx1ZXMgZm9yIHllbGxvdyBhbmQgcmVkIGNvbG9ycy5cbiAgICogQHJldHVybnMgVGhlIENTUyBjbGFzcyB0byBiZSBhcHBsaWVkLlxuICAgKi9cbiAgdHJhbnNmb3JtKHZhbHVlOiBudW1iZXIsIHJhbmdlczogQ29sb3JSYW5nZUJvdW5kYXJpZXMpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID49IHJhbmdlcy55ZWxsb3dSYW5nZU1pbiAmJiB2YWx1ZSA8IHJhbmdlcy55ZWxsb3dSYW5nZU1heCkge1xuICAgICAgcmV0dXJuICd0ZXh0LXdhcm5pbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gcmFuZ2VzLnJlZFJhbmdlTWluICYmIHZhbHVlIDw9IHJhbmdlcy5yZWRSYW5nZU1heCkge1xuICAgICAgcmV0dXJuICd0ZXh0LWRhbmdlcic7XG4gICAgfVxuICAgIHJldHVybiAnZGVmYXVsdCc7XG4gIH1cbn1cbiJdfQ==
|
package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
3
|
+
import { RENDER_TYPES_LABELS } from '../datapoints-table-widget.model';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@ngx-translate/core";
|
|
6
|
+
/**
|
|
7
|
+
* Creates a column header title message.
|
|
8
|
+
*
|
|
9
|
+
* ```html
|
|
10
|
+
* title="{{ header | columnTitle }}"
|
|
11
|
+
* ```
|
|
12
|
+
* The output will be e.g.: 'c8y_Temperature → T [T] (Area)'.
|
|
13
|
+
*/
|
|
14
|
+
export class ColumnTitlePipe {
|
|
15
|
+
constructor(translateService) {
|
|
16
|
+
this.translateService = translateService;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Transforms the column header into a formatted string with label and optionally unit and render type.
|
|
20
|
+
*
|
|
21
|
+
* @param columnHeader - The column header object.
|
|
22
|
+
* @returns The formatted string with label, unit, and render type.
|
|
23
|
+
*/
|
|
24
|
+
transform(columnHeader) {
|
|
25
|
+
const label = columnHeader.label.trim();
|
|
26
|
+
const unit = columnHeader.unit ? `[${columnHeader.unit.trim()}]` : '';
|
|
27
|
+
const renderType = columnHeader.renderType
|
|
28
|
+
? this.translateService.instant(RENDER_TYPES_LABELS[columnHeader.renderType])
|
|
29
|
+
: '';
|
|
30
|
+
if (!renderType) {
|
|
31
|
+
return `${label} ${unit}`.trim();
|
|
32
|
+
}
|
|
33
|
+
return `${label} ${unit} (${renderType})`.trim();
|
|
34
|
+
}
|
|
35
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ColumnTitlePipe, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
36
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.9", ngImport: i0, type: ColumnTitlePipe, isStandalone: true, name: "columnTitle" }); }
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ColumnTitlePipe, decorators: [{
|
|
39
|
+
type: Pipe,
|
|
40
|
+
args: [{
|
|
41
|
+
name: 'columnTitle',
|
|
42
|
+
standalone: true
|
|
43
|
+
}]
|
|
44
|
+
}], ctorParameters: () => [{ type: i1.TranslateService }] });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLXRpdGxlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtdmlldy9jb2x1bW4tdGl0bGUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQXFCLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7OztBQUUxRjs7Ozs7OztHQU9HO0FBS0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFBRyxDQUFDO0lBRTFEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFlBQStCO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0UsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksS0FBSyxVQUFVLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDOzhHQXJCVSxlQUFlOzRHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBSjNCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGFBQWE7b0JBQ25CLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uSGVhZGVyLCBSRU5ERVJfVFlQRVNfTEFCRUxTIH0gZnJvbSAnLi4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb2x1bW4gaGVhZGVyIHRpdGxlIG1lc3NhZ2UuXG4gKlxuICogYGBgaHRtbFxuICogdGl0bGU9XCJ7eyBoZWFkZXIgfCBjb2x1bW5UaXRsZSB9fVwiXG4gKiBgYGBcbiAqIFRoZSBvdXRwdXQgd2lsbCBiZSBlLmcuOiAnYzh5X1RlbXBlcmF0dXJlIOKGkiBUIFtUXSAoQXJlYSknLlxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdjb2x1bW5UaXRsZScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgQ29sdW1uVGl0bGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyB0aGUgY29sdW1uIGhlYWRlciBpbnRvIGEgZm9ybWF0dGVkIHN0cmluZyB3aXRoIGxhYmVsIGFuZCBvcHRpb25hbGx5IHVuaXQgYW5kIHJlbmRlciB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uSGVhZGVyIC0gVGhlIGNvbHVtbiBoZWFkZXIgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHN0cmluZyB3aXRoIGxhYmVsLCB1bml0LCBhbmQgcmVuZGVyIHR5cGUuXG4gICAqL1xuICB0cmFuc2Zvcm0oY29sdW1uSGVhZGVyOiBUYWJsZUNvbHVtbkhlYWRlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWwgPSBjb2x1bW5IZWFkZXIubGFiZWwudHJpbSgpO1xuICAgIGNvbnN0IHVuaXQgPSBjb2x1bW5IZWFkZXIudW5pdCA/IGBbJHtjb2x1bW5IZWFkZXIudW5pdC50cmltKCl9XWAgOiAnJztcbiAgICBjb25zdCByZW5kZXJUeXBlID0gY29sdW1uSGVhZGVyLnJlbmRlclR5cGVcbiAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoUkVOREVSX1RZUEVTX0xBQkVMU1tjb2x1bW5IZWFkZXIucmVuZGVyVHlwZV0pXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKCFyZW5kZXJUeXBlKSB7XG4gICAgICByZXR1cm4gYCR7bGFiZWx9ICR7dW5pdH1gLnRyaW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7bGFiZWx9ICR7dW5pdH0gKCR7cmVuZGVyVHlwZX0pYC50cmltKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { CommonModule, CountdownIntervalComponent, CountdownIntervalModule, IntervalBasedReload, ListGroupModule, gettext } from '@c8y/ngx-components';
|
|
3
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
4
|
+
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@ngx-translate/core";
|
|
7
|
+
import * as i2 from "@c8y/ngx-components";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "ngx-bootstrap/tooltip";
|
|
10
|
+
export class DatapointsReloadComponent extends IntervalBasedReload {
|
|
11
|
+
constructor(cdRef, injector, translateService) {
|
|
12
|
+
super();
|
|
13
|
+
this.cdRef = cdRef;
|
|
14
|
+
this.injector = injector;
|
|
15
|
+
this.translateService = translateService;
|
|
16
|
+
/**
|
|
17
|
+
* @inheritdoc
|
|
18
|
+
*/
|
|
19
|
+
this.onCountdownEnded = new EventEmitter();
|
|
20
|
+
/**
|
|
21
|
+
* @inheritdoc
|
|
22
|
+
*/
|
|
23
|
+
this.manuallyDisabledCountdown = false;
|
|
24
|
+
}
|
|
25
|
+
ngOnChanges(changes) {
|
|
26
|
+
if (this.isDisabled && this.isAutoRefreshEnabled) {
|
|
27
|
+
this.isIntervalRefreshToggleOn = false;
|
|
28
|
+
this.disableCountdown();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (this.isExportModalOpen && this.canDisableCountdownWhenModalIsOpen()) {
|
|
32
|
+
this.isIntervalRefreshToggleOn = !this.isIntervalRefreshToggleOn;
|
|
33
|
+
this.disableCountdown();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (this.canStartCountdown(changes)) {
|
|
37
|
+
this.isIntervalRefreshToggleOn = true;
|
|
38
|
+
this.startCountdown(this.injector);
|
|
39
|
+
}
|
|
40
|
+
if (this.canHandleScrolling()) {
|
|
41
|
+
this.handleScrolling();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @inheritdoc
|
|
47
|
+
*/
|
|
48
|
+
countdownEnded() {
|
|
49
|
+
/**
|
|
50
|
+
* @inheritdoc
|
|
51
|
+
*/
|
|
52
|
+
this.autoRefreshList();
|
|
53
|
+
}
|
|
54
|
+
reload() {
|
|
55
|
+
/**
|
|
56
|
+
* @inheritdoc
|
|
57
|
+
*/
|
|
58
|
+
this.autoRefreshList();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* @inheritdoc
|
|
62
|
+
*/
|
|
63
|
+
enableCountdown() {
|
|
64
|
+
this.hideCountdown = false;
|
|
65
|
+
// Prevents the countdown from getting stuck on an initial value.
|
|
66
|
+
this.cdRef.detectChanges();
|
|
67
|
+
this.startCountdown(this.injector);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @inheritdoc
|
|
71
|
+
*/
|
|
72
|
+
updateCountdownButtonTooltipText() {
|
|
73
|
+
this.toggleCountdownButtonTooltipText = this.isIntervalRefreshToggleOn
|
|
74
|
+
? this.translateService.instant(gettext('Disable auto refresh'))
|
|
75
|
+
: this.translateService.instant(gettext('Enable auto refresh'));
|
|
76
|
+
}
|
|
77
|
+
canStartCountdown(changes) {
|
|
78
|
+
const { isAutoRefreshEnabled, refreshInterval } = changes;
|
|
79
|
+
return ((isAutoRefreshEnabled || refreshInterval) &&
|
|
80
|
+
(this.isAutoRefreshEnabled || !!this.refreshInterval));
|
|
81
|
+
}
|
|
82
|
+
canHandleScrolling() {
|
|
83
|
+
return !this.manuallyDisabledCountdown && this.isAutoRefreshEnabled;
|
|
84
|
+
}
|
|
85
|
+
canDisableCountdownWhenModalIsOpen() {
|
|
86
|
+
return (this.isAutoRefreshEnabled &&
|
|
87
|
+
!!this.refreshInterval &&
|
|
88
|
+
!this.manuallyDisabledCountdown &&
|
|
89
|
+
!this.isScrolling &&
|
|
90
|
+
!this.hideCountdown);
|
|
91
|
+
}
|
|
92
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsReloadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
93
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsReloadComponent, isStandalone: true, selector: "c8y-datapoints-reload", inputs: { isAutoRefreshEnabled: "isAutoRefreshEnabled", isDisabled: "isDisabled", isLoading: "isLoading", isScrolling: "isScrolling", isExportModalOpen: "isExportModalOpen", refreshInterval: "refreshInterval" }, outputs: { onCountdownEnded: "onCountdownEnded" }, viewQueries: [{ propertyName: "countdownIntervalComponent", first: true, predicate: CountdownIntervalComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex a-i-center p-t-4 p-b-4\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isLoading()\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading() }\"\n ></i>\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CountdownIntervalModule }, { kind: "component", type: i2.CountdownIntervalComponent, selector: "c8y-countdown-interval", inputs: ["countdownInterval"], outputs: ["countdownEnded"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }] }); }
|
|
94
|
+
}
|
|
95
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsReloadComponent, decorators: [{
|
|
96
|
+
type: Component,
|
|
97
|
+
args: [{ selector: 'c8y-datapoints-reload', standalone: true, imports: [CommonModule, CountdownIntervalModule, ListGroupModule, TooltipModule], template: "<div class=\"d-flex a-i-center p-t-4 p-b-4\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isLoading()\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading() }\"\n ></i>\n </button>\n </div>\n </div>\n</div>\n" }]
|
|
98
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.TranslateService }], propDecorators: { countdownIntervalComponent: [{
|
|
99
|
+
type: ViewChild,
|
|
100
|
+
args: [CountdownIntervalComponent, { static: false }]
|
|
101
|
+
}], isAutoRefreshEnabled: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], isDisabled: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], isLoading: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], isScrolling: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], isExportModalOpen: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], refreshInterval: [{
|
|
112
|
+
type: Input
|
|
113
|
+
}], onCountdownEnded: [{
|
|
114
|
+
type: Output
|
|
115
|
+
}] } });
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsWUFBWSxFQUNaLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVF0RCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsbUJBQW1CO0lBd0NoRSxZQUNVLEtBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGdCQUFrQztRQUUxQyxLQUFLLEVBQUUsQ0FBQztRQUpBLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXRCNUM7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBT3REOztXQUVHO1FBQ08sOEJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBWTVDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7WUFDdkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztZQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWjs7V0FFRztRQUNILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTTtRQUNKOztXQUVHO1FBQ0gsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixpRUFBaUU7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxnQ0FBZ0M7UUFDeEMsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksQ0FBQyx5QkFBeUI7WUFDcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8saUJBQWlCLENBQUMsT0FBc0I7UUFDOUMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUMxRCxPQUFPLENBQ0wsQ0FBQyxvQkFBb0IsSUFBSSxlQUFlLENBQUM7WUFDekMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDdEQsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDdEUsQ0FBQztJQUVPLGtDQUFrQztRQUN4QyxPQUFPLENBQ0wsSUFBSSxDQUFDLG9CQUFvQjtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDdEIsQ0FBQyxJQUFJLENBQUMseUJBQXlCO1lBQy9CLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFDakIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUNwQixDQUFDO0lBQ0osQ0FBQzs4R0E5SFUseUJBQXlCO2tHQUF6Qix5QkFBeUIsb1pBQ3pCLDBCQUEwQiw0RkM5QnZDLHM1REE2REEsMkNEbENZLFlBQVksMlhBQUUsdUJBQXVCLDBMQUFFLGVBQWUsOEJBQUUsYUFBYTs7MkZBRXBFLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx1QkFBdUIsY0FFckIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUM7NElBSWhGLDBCQUEwQjtzQkFEekIsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSy9DLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJSSxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29tbW9uTW9kdWxlLFxuICBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCxcbiAgQ291bnRkb3duSW50ZXJ2YWxNb2R1bGUsXG4gIEludGVydmFsQmFzZWRSZWxvYWQsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3Rvb2x0aXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1yZWxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDb3VudGRvd25JbnRlcnZhbE1vZHVsZSwgTGlzdEdyb3VwTW9kdWxlLCBUb29sdGlwTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzUmVsb2FkQ29tcG9uZW50IGV4dGVuZHMgSW50ZXJ2YWxCYXNlZFJlbG9hZCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoQ291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjb3VudGRvd25JbnRlcnZhbENvbXBvbmVudDogQ291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgQElucHV0KCkgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IFNpZ25hbDxib29sZWFuPjtcblxuICBASW5wdXQoKSBpc1Njcm9sbGluZzogYm9vbGVhbjtcblxuICBASW5wdXQoKSBpc0V4cG9ydE1vZGFsT3BlbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSByZWZyZXNoSW50ZXJ2YWw6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBAT3V0cHV0KCkgb25Db3VudGRvd25FbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uOiBib29sZWFuO1xuXG4gIHRvZ2dsZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHJvdGVjdGVkIG1hbnVhbGx5RGlzYWJsZWRDb3VudGRvd24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgaGlkZUNvdW50ZG93bjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkICYmIHRoaXMuaXNBdXRvUmVmcmVzaEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNhYmxlQ291bnRkb3duKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gJiYgdGhpcy5jYW5EaXNhYmxlQ291bnRkb3duV2hlbk1vZGFsSXNPcGVuKCkpIHtcbiAgICAgIHRoaXMuaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbiA9ICF0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT247XG4gICAgICB0aGlzLmRpc2FibGVDb3VudGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2FuU3RhcnRDb3VudGRvd24oY2hhbmdlcykpIHtcbiAgICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGFydENvdW50ZG93bih0aGlzLmluamVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2FuSGFuZGxlU2Nyb2xsaW5nKCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGNvdW50ZG93bkVuZGVkKCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICovXG4gICAgdGhpcy5hdXRvUmVmcmVzaExpc3QoKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdGRvY1xuICAgICAqL1xuICAgIHRoaXMuYXV0b1JlZnJlc2hMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGVuYWJsZUNvdW50ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGVDb3VudGRvd24gPSBmYWxzZTtcbiAgICAvLyBQcmV2ZW50cyB0aGUgY291bnRkb3duIGZyb20gZ2V0dGluZyBzdHVjayBvbiBhbiBpbml0aWFsIHZhbHVlLlxuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc3RhcnRDb3VudGRvd24odGhpcy5pbmplY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0ID0gdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uXG4gICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0Rpc2FibGUgYXV0byByZWZyZXNoJykpXG4gICAgICA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0VuYWJsZSBhdXRvIHJlZnJlc2gnKSk7XG4gIH1cblxuICBwcml2YXRlIGNhblN0YXJ0Q291bnRkb3duKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGlzQXV0b1JlZnJlc2hFbmFibGVkLCByZWZyZXNoSW50ZXJ2YWwgfSA9IGNoYW5nZXM7XG4gICAgcmV0dXJuIChcbiAgICAgIChpc0F1dG9SZWZyZXNoRW5hYmxlZCB8fCByZWZyZXNoSW50ZXJ2YWwpICYmXG4gICAgICAodGhpcy5pc0F1dG9SZWZyZXNoRW5hYmxlZCB8fCAhIXRoaXMucmVmcmVzaEludGVydmFsKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNhbkhhbmRsZVNjcm9sbGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubWFudWFsbHlEaXNhYmxlZENvdW50ZG93biAmJiB0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5EaXNhYmxlQ291bnRkb3duV2hlbk1vZGFsSXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkICYmXG4gICAgICAhIXRoaXMucmVmcmVzaEludGVydmFsICYmXG4gICAgICAhdGhpcy5tYW51YWxseURpc2FibGVkQ291bnRkb3duICYmXG4gICAgICAhdGhpcy5pc1Njcm9sbGluZyAmJlxuICAgICAgIXRoaXMuaGlkZUNvdW50ZG93blxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBwLXQtNCBwLWItNFwiPlxuICA8bGFiZWxcbiAgICBjbGFzcz1cIm0tYi0wIG0tci04IHRleHQtbGFiZWwtc21hbGwgdGV4dC10cnVuY2F0ZSBmbGV4LW5vLXNocmlua1wiXG4gICAgdGl0bGU9XCIge3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICpuZ0lmPVwicmVmcmVzaEludGVydmFsICYmIGlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgPlxuICAgIHt7ICdBdXRvIHJlZnJlc2gnIHwgdHJhbnNsYXRlIH19XG4gIDwvbGFiZWw+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgIDxsYWJlbFxuICAgICAgY2xhc3M9XCJ0b2dnbGUtY291bnRkb3duXCJcbiAgICAgIFtjbGFzcy50b2dnbGUtY291bnRkb3duLWRpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0b2dnbGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dFwiXG4gICAgICBbdG9vbHRpcF09XCJ0b2dnbGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dFwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgKm5nSWY9XCJyZWZyZXNoSW50ZXJ2YWwgJiYgaXNBdXRvUmVmcmVzaEVuYWJsZWRcIlxuICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgW2NvbnRhaW5lcl09XCInYm9keSdcIlxuICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtjaGVja2VkXT1cImlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1wb2ludHMtdGFibGUtd2lkZ2V0LS1pbnRlcnZhbC10b2dnbGUtYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlQ291bnRkb3duQnV0dG9uU3RhdGUoJGV2ZW50KVwiXG4gICAgICAvPlxuXG4gICAgICA8Yzh5LWNvdW50ZG93bi1pbnRlcnZhbFxuICAgICAgICAqbmdJZj1cImlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgICBbY291bnRkb3duSW50ZXJ2YWxdPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgKGNvdW50ZG93bkVuZGVkKT1cImNvdW50ZG93bkVuZGVkKClcIlxuICAgICAgPjwvYzh5LWNvdW50ZG93bi1pbnRlcnZhbD5cbiAgICAgIDxpXG4gICAgICAgIGM4eUljb249XCJwYXVzZVwiXG4gICAgICAgICpuZ0lmPVwiIWlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgPjwvaT5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlZnJlc2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlZnJlc2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgW2NvbnRhaW5lcl09XCInYm9keSdcIlxuICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZygpXCJcbiAgICAgICAgKGNsaWNrKT1cInJlbG9hZCgpXCJcbiAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLXBvaW50cy10YWJsZS13aWRnZXQtLXJlbG9hZC1idXR0b25cIlxuICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiBpc0xvYWRpbmcoKSB9XCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|