@c8y/ngx-components 1022.28.2 → 1022.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/asset-properties/asset-properties.model.d.ts +12 -3
- package/asset-properties/asset-properties.model.d.ts.map +1 -1
- package/asset-properties/asset-properties.service.d.ts +20 -2
- package/asset-properties/asset-properties.service.d.ts.map +1 -1
- package/asset-properties/asset-property-list/asset-property-icon-tooltip.pipe.d.ts +14 -0
- package/asset-properties/asset-property-list/asset-property-icon-tooltip.pipe.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts.map +1 -1
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts +28 -18
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts.map +1 -1
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts +2 -2
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts.map +1 -1
- package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts +97 -0
- package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts.map +1 -0
- package/asset-properties/custom-properties-drawer.service.d.ts +12 -0
- package/asset-properties/custom-properties-drawer.service.d.ts.map +1 -0
- package/asset-properties/index.d.ts +1 -0
- package/asset-properties/index.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.service.d.ts +2 -2
- package/context-dashboard/widget-config-hook/widget-config-hook.model.d.ts +2 -1
- package/context-dashboard/widget-config-hook/widget-config-hook.model.d.ts.map +1 -1
- package/context-dashboard/widget-config.component.d.ts +3 -1
- package/context-dashboard/widget-config.component.d.ts.map +1 -1
- package/context-dashboard/widget-config.service.d.ts +14 -8
- package/context-dashboard/widget-config.service.d.ts.map +1 -1
- package/core/dynamic-component/dynamic-component.model.d.ts +26 -0
- package/core/dynamic-component/dynamic-component.model.d.ts.map +1 -1
- package/core/i18n/pattern-messages.data.d.ts +7 -0
- package/core/i18n/pattern-messages.data.d.ts.map +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.d.ts.map +1 -1
- package/core/query-param-handler/query-param-handler.service.d.ts +1 -1
- package/core/query-param-handler/query-param-handler.service.d.ts.map +1 -1
- package/core/query-param-handler/query-param-modal-handler.service.d.ts +16 -5
- package/core/query-param-handler/query-param-modal-handler.service.d.ts.map +1 -1
- package/core/resizable-grid/index.d.ts +2 -0
- package/core/resizable-grid/index.d.ts.map +1 -0
- package/core/resizable-grid/resizable-grid.component.d.ts +114 -0
- package/core/resizable-grid/resizable-grid.component.d.ts.map +1 -0
- package/dashboard-manager/devicemanagement/c8y-ngx-components-dashboard-manager-devicemanagement.d.ts.map +1 -0
- package/dashboard-manager/devicemanagement/index.d.ts +2 -0
- package/dashboard-manager/devicemanagement/index.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-advanced-software-management.mjs +7 -7
- package/fesm2022/c8y-ngx-components-advanced-software-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +34 -34
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +4 -4
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +73 -73
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-api.mjs +7 -7
- package/fesm2022/c8y-ngx-components-api.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-app-logs.mjs +10 -10
- package/fesm2022/c8y-ngx-components-app-logs.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +427 -66
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-WUN1r4fC.mjs → c8y-ngx-components-asset-property-grid.component-CRnyUbyz.mjs} +13 -13
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-WUN1r4fC.mjs.map → c8y-ngx-components-asset-property-grid.component-CRnyUbyz.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +32 -32
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +114 -114
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs +7 -7
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +13 -13
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-base-branding.mjs +4 -4
- package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor-lazy.mjs +3 -3
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +7 -7
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +15 -15
- package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +6 -6
- package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +33 -33
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared.mjs +10 -10
- package/fesm2022/c8y-ngx-components-branding-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-child-devices.mjs +13 -13
- package/fesm2022/c8y-ngx-components-child-devices.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +40 -40
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-connectivity.mjs +53 -53
- package/fesm2022/c8y-ngx-components-connectivity.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +11 -11
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C-JLbcn5.mjs → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-BWyhab0H.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C-JLbcn5.mjs.map → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-BWyhab0H.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RXvOcs04.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs} +10 -10
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RXvOcs04.mjs.map → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-DmPIJGXO.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs} +4 -4
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-DmPIJGXO.mjs.map → c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +7 -7
- package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +133 -116
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DtLAOoFx.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CwfVxTSx.mjs} +16 -16
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DtLAOoFx.mjs.map → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CwfVxTSx.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +12 -12
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs +19 -0
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +22 -22
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-broker.mjs +7 -7
- package/fesm2022/c8y-ngx-components-data-broker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs +3 -3
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs +3 -3
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +24 -24
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +7 -7
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-services.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-library-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs +4 -4
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +40 -40
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +41 -40
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs +16 -16
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +43 -43
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs +22 -22
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs +12 -12
- package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +34 -34
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs +3 -3
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocols.mjs +16 -16
- package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +13 -13
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-shell.mjs +31 -31
- package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs +13 -13
- package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +27 -27
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +43 -43
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +10 -10
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +7 -7
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +46 -46
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +82 -82
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-editor.mjs +6 -6
- package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +3 -3
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events.mjs +3 -3
- package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-exports-list.mjs +6 -6
- package/fesm2022/c8y-ngx-components-exports-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-file-preview.mjs +7 -7
- package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs +19 -19
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-arrows.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-city.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-dateAndTime.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-devicesAndSensors.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-ecommerce.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-editing.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-filesAndFolders.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-finance.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-hands.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-messaging.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-multimedia.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-network.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-office.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-people.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs +1 -0
- package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-programming.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-security.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-transport.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-userInterface.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons-weather.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-model.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +19 -19
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +3 -3
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-location.mjs +28 -28
- package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +19 -19
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +55 -55
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +19 -19
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +12 -12
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +12 -12
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-product-experience.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-shared.mjs +10 -10
- package/fesm2022/c8y-ngx-components-operations-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs +13 -13
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations.mjs +7 -7
- package/fesm2022/c8y-ngx-components-operations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs +7 -7
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs +10 -10
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +38 -38
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +58 -58
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +58 -58
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +9 -9
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +6 -6
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +6 -6
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +6 -6
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device.mjs +13 -29
- package/fesm2022/c8y-ngx-components-replace-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +16 -16
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-reports.mjs +19 -19
- package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +48 -48
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +33 -33
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +34 -34
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +42 -42
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository.mjs +4 -4
- package/fesm2022/c8y-ngx-components-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs +19 -19
- package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +33 -27
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs +17 -320
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +3 -3
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-shared.mjs +3 -3
- package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs +29 -29
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +16 -16
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs +7 -7
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-static-assets-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +3 -3
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets.mjs +6 -6
- package/fesm2022/c8y-ngx-components-static-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs +60 -60
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +40 -40
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-time-context.mjs +6 -6
- package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs +12 -12
- package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +3 -3
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +12 -12
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +6 -6
- package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +33 -33
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +4 -4
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +41 -41
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs +10 -10
- package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-legacy-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-help-and-service.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +18 -14
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +4 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +4 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-device-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +22 -22
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-legacy-welcome.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-legacy-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +50 -36
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs +7 -7
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +22 -22
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +18 -18
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +18 -18
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs +9 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-import-export-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +1658 -1315
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/icon-selector/icons/index.d.ts +1 -1
- package/icon-selector/icons/platform/index.d.ts +2 -2
- package/icon-selector/icons/platform/index.d.ts.map +1 -1
- package/locales/de.po +26 -3
- package/locales/es.po +26 -3
- package/locales/fr.po +26 -3
- package/locales/ja_JP.po +25 -3
- package/locales/ko.po +26 -3
- package/locales/locales.pot +25 -2
- package/locales/nl.po +26 -3
- package/locales/pl.po +26 -3
- package/locales/pt_BR.po +26 -3
- package/locales/zh_CN.po +26 -3
- package/locales/zh_TW.po +26 -3
- package/package.json +1 -1
- package/replace-device/replace-device.module.d.ts.map +1 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone-modal.component.d.ts +6 -6
- package/sensor-phone/sensor-phone-modal/sensor-phone-modal.component.d.ts.map +1 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone.model.d.ts +0 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone.model.d.ts.map +1 -1
- package/sensor-phone/sensor-phone.module.d.ts +2 -3
- package/sensor-phone/sensor-phone.module.d.ts.map +1 -1
- package/widgets/definitions/datapoints-table/index.d.ts +1 -2
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
- package/widgets/definitions/html-widget/html-widget-config.factory.d.ts +1 -1
- package/widgets/definitions/html-widget/html-widget-config.factory.d.ts.map +1 -1
- package/widgets/definitions/image/index.d.ts +1 -1
- package/widgets/definitions/image/index.d.ts.map +1 -1
- package/widgets/definitions/markdown/index.d.ts +1 -1
- package/widgets/definitions/markdown/index.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
- package/widgets/implementations/three-d-rotation/three-d-rotation-widget-view/three-d-rotation-widget-view.component.d.ts.map +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i2 from '@c8y/ngx-components';
|
|
2
|
-
import { gettext, AssetTypesRealtimeService, GroupService, ListGroupModule, C8yTranslatePipe, IconDirective, EmptyStateComponent, BottomDrawerRef, FormsModule as FormsModule$1 } from '@c8y/ngx-components';
|
|
2
|
+
import { gettext, AssetTypesRealtimeService, GroupService, AlertService, ListGroupModule, C8yTranslatePipe, IconDirective, EmptyStateComponent, BottomDrawerRef, FormsModule as FormsModule$1, LoadMoreComponent, BottomDrawerService } from '@c8y/ngx-components';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { inject, Injectable, Directive, Pipe, viewChild, EventEmitter, effect, ContentChild, Output, Input, Component } from '@angular/core';
|
|
5
5
|
import { InventoryService } from '@c8y/client';
|
|
@@ -13,15 +13,18 @@ import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
|
13
13
|
import * as i4 from '@angular/cdk/tree';
|
|
14
14
|
import { CdkTreeModule } from '@angular/cdk/tree';
|
|
15
15
|
import { DataSource } from '@angular/cdk/collections';
|
|
16
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
17
|
+
import { gettext as gettext$1 } from '@c8y/ngx-components/gettext';
|
|
16
18
|
|
|
17
19
|
const defaultAssetPropertyListConfig = {
|
|
18
|
-
|
|
20
|
+
filterable: true,
|
|
19
21
|
selectMode: 'none',
|
|
20
22
|
expansionMode: 'expandedByDefault',
|
|
21
23
|
showHeader: true,
|
|
22
24
|
showValue: true,
|
|
23
25
|
showKey: true,
|
|
24
26
|
emptyStateContent: 'empty',
|
|
27
|
+
allowAddingCustomProperties: false,
|
|
25
28
|
inputPropertiesHandle: 'merge'
|
|
26
29
|
};
|
|
27
30
|
const defaultAssetProperties = [
|
|
@@ -686,13 +689,14 @@ class AssetPropertiesService {
|
|
|
686
689
|
this.inventoryService = inject(InventoryService);
|
|
687
690
|
this.assetTypesRealtimeService = inject(AssetTypesRealtimeService);
|
|
688
691
|
this.groupService = inject(GroupService);
|
|
692
|
+
this.alert = inject(AlertService);
|
|
689
693
|
}
|
|
690
694
|
/**
|
|
691
|
-
* Retrieves
|
|
695
|
+
* Retrieves properties for an asset from asset library.
|
|
692
696
|
* @param asset The asset for which to retrieve custom properties.
|
|
693
697
|
* @returns A promise resolving to the list of custom properties.
|
|
694
698
|
*/
|
|
695
|
-
async
|
|
699
|
+
async requestAssetProperties(asset) {
|
|
696
700
|
if (asset && asset.type) {
|
|
697
701
|
const assetType = await firstValueFrom(this.assetTypesRealtimeService.getAssetTypeByName$(asset.type));
|
|
698
702
|
if (assetType) {
|
|
@@ -747,7 +751,7 @@ class AssetPropertiesService {
|
|
|
747
751
|
* @returns A promise resolving to the list of asset properties.
|
|
748
752
|
*/
|
|
749
753
|
async getAssetProperties(asset) {
|
|
750
|
-
const customProperties = this.categorizeCustomProperties(await this.
|
|
754
|
+
const customProperties = this.categorizeCustomProperties(await this.requestAssetProperties(asset)) || [];
|
|
751
755
|
return customProperties;
|
|
752
756
|
}
|
|
753
757
|
/**
|
|
@@ -801,6 +805,66 @@ class AssetPropertiesService {
|
|
|
801
805
|
return (property.c8y_JsonSchema?.properties[property.name]?.type === 'object' ||
|
|
802
806
|
property.properties !== undefined);
|
|
803
807
|
}
|
|
808
|
+
/**
|
|
809
|
+
* Checks if two properties match for selection purposes.
|
|
810
|
+
* @param property1 First property to compare.
|
|
811
|
+
* @param property2 Second property to compare.
|
|
812
|
+
* @returns True if properties match.
|
|
813
|
+
*/
|
|
814
|
+
propertiesMatch(property1, property2) {
|
|
815
|
+
if (property1.name === property2.name) {
|
|
816
|
+
const keyPath1 = property1.keyPath;
|
|
817
|
+
const keyPath2 = property2.keyPath;
|
|
818
|
+
if (keyPath1 && keyPath2) {
|
|
819
|
+
return keyPath1.join('.') === keyPath2.join('.');
|
|
820
|
+
}
|
|
821
|
+
else if (!keyPath1 && !keyPath2) {
|
|
822
|
+
return true;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
return false;
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Retrieves custom properties from the properties library, optionally filtered by search text.
|
|
829
|
+
* @param searchText Optional search text to filter properties.
|
|
830
|
+
* @returns A promise resolving to the list of properties and paging information.
|
|
831
|
+
*/
|
|
832
|
+
async getPropertiesFromPropertiesLibrary(searchText) {
|
|
833
|
+
const propertiesFromLibrary = [];
|
|
834
|
+
const { data: propertiesMOs, paging } = await this.requestPropertiesFromPropertiesLibrary(searchText);
|
|
835
|
+
propertiesMOs.forEach(prop => {
|
|
836
|
+
const name = Object.keys(prop.c8y_JsonSchema.properties)[0];
|
|
837
|
+
propertiesFromLibrary.push({
|
|
838
|
+
c8y_JsonSchema: prop.c8y_JsonSchema,
|
|
839
|
+
label: prop.name,
|
|
840
|
+
name,
|
|
841
|
+
type: prop.c8y_JsonSchema.properties[name].type
|
|
842
|
+
});
|
|
843
|
+
});
|
|
844
|
+
return { propertiesFromLibrary, paging };
|
|
845
|
+
}
|
|
846
|
+
async requestPropertiesFromPropertiesLibrary(searchText) {
|
|
847
|
+
let queryFilter = '(type eq c8y_JsonSchema) and (appliesTo.MANAGED_OBJECTS eq true)';
|
|
848
|
+
if (searchText?.trim()) {
|
|
849
|
+
const escapedSearchText = searchText.replace(/'/g, "''");
|
|
850
|
+
queryFilter += ` and (name eq '*${escapedSearchText}*')`;
|
|
851
|
+
}
|
|
852
|
+
const query = `$filter=(${queryFilter})`;
|
|
853
|
+
const filter = {
|
|
854
|
+
pageSize: 20,
|
|
855
|
+
revert: true,
|
|
856
|
+
query,
|
|
857
|
+
withTotalPages: true
|
|
858
|
+
};
|
|
859
|
+
try {
|
|
860
|
+
const results = await this.inventoryService.list(filter);
|
|
861
|
+
return results;
|
|
862
|
+
}
|
|
863
|
+
catch (error) {
|
|
864
|
+
this.alert.addServerFailure(error);
|
|
865
|
+
return null;
|
|
866
|
+
}
|
|
867
|
+
}
|
|
804
868
|
addNestedProperties(parentProperty, complexProperties, sortChildren = false) {
|
|
805
869
|
const schema = parentProperty.c8y_JsonSchema?.properties[parentProperty.name];
|
|
806
870
|
if (!schema?.properties) {
|
|
@@ -880,10 +944,10 @@ class AssetPropertiesService {
|
|
|
880
944
|
}
|
|
881
945
|
});
|
|
882
946
|
}
|
|
883
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
884
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
947
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertiesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
948
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertiesService, providedIn: 'root' }); }
|
|
885
949
|
}
|
|
886
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
950
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertiesService, decorators: [{
|
|
887
951
|
type: Injectable,
|
|
888
952
|
args: [{
|
|
889
953
|
providedIn: 'root'
|
|
@@ -915,10 +979,10 @@ class AssetPropertyActionDirective {
|
|
|
915
979
|
this.elementRef = elementRef;
|
|
916
980
|
this.viewContainer = viewContainer;
|
|
917
981
|
}
|
|
918
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
919
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.
|
|
982
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyActionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
983
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: AssetPropertyActionDirective, isStandalone: true, selector: "[c8yAssetPropertyAction]", ngImport: i0 }); }
|
|
920
984
|
}
|
|
921
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
985
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyActionDirective, decorators: [{
|
|
922
986
|
type: Directive,
|
|
923
987
|
args: [{
|
|
924
988
|
selector: '[c8yAssetPropertyAction]',
|
|
@@ -953,10 +1017,10 @@ class AssetPropertyValuePipe {
|
|
|
953
1017
|
}
|
|
954
1018
|
return value ?? '-';
|
|
955
1019
|
}
|
|
956
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
957
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
1020
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1021
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyValuePipe, isStandalone: true, name: "c8yAssetPropertyValue" }); }
|
|
958
1022
|
}
|
|
959
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1023
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyValuePipe, decorators: [{
|
|
960
1024
|
type: Pipe,
|
|
961
1025
|
args: [{
|
|
962
1026
|
name: 'c8yAssetPropertyValue',
|
|
@@ -972,7 +1036,7 @@ class AssetPropertyIconPipe {
|
|
|
972
1036
|
transform(type) {
|
|
973
1037
|
switch (type) {
|
|
974
1038
|
case 'string':
|
|
975
|
-
return '
|
|
1039
|
+
return 'string';
|
|
976
1040
|
case 'number':
|
|
977
1041
|
return 'hashtag';
|
|
978
1042
|
case 'boolean':
|
|
@@ -981,19 +1045,21 @@ class AssetPropertyIconPipe {
|
|
|
981
1045
|
return 'calendar';
|
|
982
1046
|
case 'object':
|
|
983
1047
|
case 'c8y_JsonSchema':
|
|
984
|
-
return '
|
|
1048
|
+
return 'c8y-css';
|
|
985
1049
|
case 'enum':
|
|
986
1050
|
return 'content';
|
|
987
1051
|
case 'file':
|
|
988
1052
|
return 'file';
|
|
1053
|
+
case 'integer':
|
|
1054
|
+
return 'unit';
|
|
989
1055
|
default:
|
|
990
|
-
return '
|
|
1056
|
+
return 'mix-words';
|
|
991
1057
|
}
|
|
992
1058
|
}
|
|
993
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
994
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
1059
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyIconPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1060
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyIconPipe, isStandalone: true, name: "c8yAssetPropertyIcon" }); }
|
|
995
1061
|
}
|
|
996
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1062
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyIconPipe, decorators: [{
|
|
997
1063
|
type: Pipe,
|
|
998
1064
|
args: [{
|
|
999
1065
|
name: 'c8yAssetPropertyIcon',
|
|
@@ -1001,6 +1067,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
1001
1067
|
}]
|
|
1002
1068
|
}] });
|
|
1003
1069
|
|
|
1070
|
+
/**
|
|
1071
|
+
* A pipe that transforms an asset property type into a tooltip string.
|
|
1072
|
+
* If the property is temporary, it appends "(temporary)" to the type and handles translation.
|
|
1073
|
+
* Otherwise, it returns the type as is.
|
|
1074
|
+
*/
|
|
1075
|
+
class AssetPropertyIconTooltipPipe {
|
|
1076
|
+
constructor() {
|
|
1077
|
+
this.translateService = inject(TranslateService);
|
|
1078
|
+
}
|
|
1079
|
+
transform(property) {
|
|
1080
|
+
if (!property) {
|
|
1081
|
+
return '';
|
|
1082
|
+
}
|
|
1083
|
+
else if (property.temporary) {
|
|
1084
|
+
return this.translateService.instant(gettext$1('{{assetPropertyType}}\n(temporary)'), {
|
|
1085
|
+
assetPropertyType: property.type
|
|
1086
|
+
});
|
|
1087
|
+
}
|
|
1088
|
+
else {
|
|
1089
|
+
return property.type;
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyIconTooltipPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1093
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyIconTooltipPipe, isStandalone: true, name: "c8yAssetPropertyIconTooltip" }); }
|
|
1094
|
+
}
|
|
1095
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyIconTooltipPipe, decorators: [{
|
|
1096
|
+
type: Pipe,
|
|
1097
|
+
args: [{
|
|
1098
|
+
name: 'c8yAssetPropertyIconTooltip',
|
|
1099
|
+
standalone: true
|
|
1100
|
+
}]
|
|
1101
|
+
}] });
|
|
1102
|
+
|
|
1004
1103
|
/**
|
|
1005
1104
|
* Represents a list of asset properties with hierarchical tree structure.
|
|
1006
1105
|
*/
|
|
@@ -1018,9 +1117,9 @@ class AssetPropertyListComponent {
|
|
|
1018
1117
|
*/
|
|
1019
1118
|
this.config = {};
|
|
1020
1119
|
/**
|
|
1021
|
-
*
|
|
1120
|
+
* Extra properties to be displayed in the list.
|
|
1022
1121
|
*/
|
|
1023
|
-
this.
|
|
1122
|
+
this.extraProperties = [];
|
|
1024
1123
|
/**
|
|
1025
1124
|
* Emits the selected properties.
|
|
1026
1125
|
*/
|
|
@@ -1030,9 +1129,9 @@ class AssetPropertyListComponent {
|
|
|
1030
1129
|
*/
|
|
1031
1130
|
this.properties = [];
|
|
1032
1131
|
/**
|
|
1033
|
-
* Text input for
|
|
1132
|
+
* Text input for filtering properties.
|
|
1034
1133
|
*/
|
|
1035
|
-
this.
|
|
1134
|
+
this.filterText = '';
|
|
1036
1135
|
/**
|
|
1037
1136
|
* Data source for the tree structure.
|
|
1038
1137
|
*/
|
|
@@ -1050,9 +1149,13 @@ class AssetPropertyListComponent {
|
|
|
1050
1149
|
*/
|
|
1051
1150
|
this.indeterminate = false;
|
|
1052
1151
|
/**
|
|
1053
|
-
*
|
|
1152
|
+
* List of properties that have been added temporarily as custom properties.
|
|
1054
1153
|
*/
|
|
1055
|
-
this.
|
|
1154
|
+
this.addedProperties = [];
|
|
1155
|
+
/**
|
|
1156
|
+
* Subject for handling filter input.
|
|
1157
|
+
*/
|
|
1158
|
+
this.filterSubject$ = new BehaviorSubject('');
|
|
1056
1159
|
/**
|
|
1057
1160
|
* Subject for handling component destruction.
|
|
1058
1161
|
*/
|
|
@@ -1061,6 +1164,7 @@ class AssetPropertyListComponent {
|
|
|
1061
1164
|
* Service for managing asset properties.
|
|
1062
1165
|
*/
|
|
1063
1166
|
this.assetPropertiesService = inject(AssetPropertiesService);
|
|
1167
|
+
this.customPropertiesDrawerService = inject(CustomPropertiesDrawerService);
|
|
1064
1168
|
effect(() => {
|
|
1065
1169
|
if ((this.config.expansionMode === 'nonCollapsible' ||
|
|
1066
1170
|
this.config.expansionMode === 'expandedByDefault') &&
|
|
@@ -1076,7 +1180,7 @@ class AssetPropertyListComponent {
|
|
|
1076
1180
|
...defaultAssetPropertyListConfig,
|
|
1077
1181
|
...this.config
|
|
1078
1182
|
};
|
|
1079
|
-
this.
|
|
1183
|
+
this.filterSubject$
|
|
1080
1184
|
.pipe(takeUntil(this.destroy$), debounceTime(200))
|
|
1081
1185
|
.subscribe(() => this.filterTree());
|
|
1082
1186
|
}
|
|
@@ -1111,10 +1215,45 @@ class AssetPropertyListComponent {
|
|
|
1111
1215
|
return [];
|
|
1112
1216
|
}
|
|
1113
1217
|
/**
|
|
1114
|
-
*
|
|
1115
|
-
|
|
1116
|
-
|
|
1218
|
+
* Opens the drawer to add new custom properties.
|
|
1219
|
+
*/
|
|
1220
|
+
async addProperty() {
|
|
1221
|
+
const propertiesToAdd = await this.customPropertiesDrawerService.getCustomProperties();
|
|
1222
|
+
if (!propertiesToAdd || propertiesToAdd.length === 0) {
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
propertiesToAdd.forEach(prop => (prop.temporary = true));
|
|
1226
|
+
this.addedProperties = this.addedProperties.concat(propertiesToAdd);
|
|
1227
|
+
await this.updateProperties();
|
|
1228
|
+
this.selectedProperties.next(this.dataSource.data.filter(n => n.property.active).map(n => n.property));
|
|
1229
|
+
}
|
|
1230
|
+
/**
|
|
1231
|
+
* Removes temporary property from the list.
|
|
1232
|
+
* @param property The property to remove.
|
|
1117
1233
|
*/
|
|
1234
|
+
async removeProperty(property) {
|
|
1235
|
+
let filterFn;
|
|
1236
|
+
if (this.assetPropertiesService.isComplexProperty(property)) {
|
|
1237
|
+
filterFn = (p) => {
|
|
1238
|
+
if (p === property) {
|
|
1239
|
+
// remove complex property itself
|
|
1240
|
+
return false;
|
|
1241
|
+
}
|
|
1242
|
+
if ('keyPath' in p && Array.isArray(p.keyPath)) {
|
|
1243
|
+
// remove children of complex property
|
|
1244
|
+
const keyPath = p.keyPath;
|
|
1245
|
+
return keyPath[0] !== property.name;
|
|
1246
|
+
}
|
|
1247
|
+
return true;
|
|
1248
|
+
};
|
|
1249
|
+
}
|
|
1250
|
+
else {
|
|
1251
|
+
// Remove only the property itself
|
|
1252
|
+
filterFn = (p) => p !== property;
|
|
1253
|
+
}
|
|
1254
|
+
this.addedProperties = this.addedProperties.filter(filterFn);
|
|
1255
|
+
await this.updateProperties();
|
|
1256
|
+
}
|
|
1118
1257
|
hasChild(node) {
|
|
1119
1258
|
return node.expandable;
|
|
1120
1259
|
}
|
|
@@ -1188,7 +1327,9 @@ class AssetPropertyListComponent {
|
|
|
1188
1327
|
if (selected && node.expandable && this.tree() && !this.tree().isExpanded(node)) {
|
|
1189
1328
|
this.tree().expand(node);
|
|
1190
1329
|
}
|
|
1191
|
-
|
|
1330
|
+
if (selected) {
|
|
1331
|
+
this.selectedProperties.next([node.property]);
|
|
1332
|
+
}
|
|
1192
1333
|
}
|
|
1193
1334
|
/**
|
|
1194
1335
|
* Handles multi-selection mode.
|
|
@@ -1210,17 +1351,17 @@ class AssetPropertyListComponent {
|
|
|
1210
1351
|
this.selectedProperties.next(selectedProperties);
|
|
1211
1352
|
}
|
|
1212
1353
|
/**
|
|
1213
|
-
* Initiates a
|
|
1354
|
+
* Initiates a filter operation.
|
|
1214
1355
|
*/
|
|
1215
|
-
|
|
1216
|
-
this.
|
|
1356
|
+
onFilter() {
|
|
1357
|
+
this.filterSubject$.next(this.filterText);
|
|
1217
1358
|
}
|
|
1218
1359
|
/**
|
|
1219
|
-
* Clears the
|
|
1360
|
+
* Clears the filter input.
|
|
1220
1361
|
*/
|
|
1221
|
-
|
|
1222
|
-
this.
|
|
1223
|
-
this.
|
|
1362
|
+
clearFilter() {
|
|
1363
|
+
this.filterText = '';
|
|
1364
|
+
this.onFilter();
|
|
1224
1365
|
}
|
|
1225
1366
|
collapseButtonTitle(node) {
|
|
1226
1367
|
const expanded = this.tree().isExpanded(node);
|
|
@@ -1233,12 +1374,37 @@ class AssetPropertyListComponent {
|
|
|
1233
1374
|
*/
|
|
1234
1375
|
async updateProperties() {
|
|
1235
1376
|
if (this.config.inputPropertiesHandle === 'merge' || !this.config.inputPropertiesHandle) {
|
|
1236
|
-
this.properties = [
|
|
1377
|
+
this.properties = [
|
|
1378
|
+
...this.addedProperties,
|
|
1379
|
+
...this.extraProperties,
|
|
1380
|
+
...(await this.getProperties())
|
|
1381
|
+
];
|
|
1237
1382
|
}
|
|
1238
1383
|
else if (this.config.inputPropertiesHandle === 'override') {
|
|
1239
|
-
this.properties = [...this.
|
|
1384
|
+
this.properties = [...this.addedProperties, ...this.extraProperties];
|
|
1240
1385
|
}
|
|
1241
1386
|
this.buildTreeNodes();
|
|
1387
|
+
this.applySelectedPropertiesFromConfig();
|
|
1388
|
+
}
|
|
1389
|
+
applySelectedPropertiesFromConfig() {
|
|
1390
|
+
if (!this.config.selectedProperties || this.config.selectedProperties.length === 0) {
|
|
1391
|
+
return;
|
|
1392
|
+
}
|
|
1393
|
+
this.config.selectedProperties.forEach((configProperty, index) => {
|
|
1394
|
+
const matchingNode = this.dataSource.data.find(node => this.assetPropertiesService.propertiesMatch(node.property, configProperty));
|
|
1395
|
+
if (matchingNode) {
|
|
1396
|
+
if (this.config.selectMode === 'single') {
|
|
1397
|
+
// For single mode, only select the first property and break
|
|
1398
|
+
if (index === 0) {
|
|
1399
|
+
this.onSelectSingle(true, matchingNode);
|
|
1400
|
+
}
|
|
1401
|
+
return;
|
|
1402
|
+
}
|
|
1403
|
+
else if (this.config.selectMode === 'multi') {
|
|
1404
|
+
this.onSelectMulti(true, matchingNode);
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
});
|
|
1242
1408
|
}
|
|
1243
1409
|
/**
|
|
1244
1410
|
* Updates the selection status of child nodes.
|
|
@@ -1257,19 +1423,19 @@ class AssetPropertyListComponent {
|
|
|
1257
1423
|
});
|
|
1258
1424
|
}
|
|
1259
1425
|
/**
|
|
1260
|
-
* Checks if a property matches the
|
|
1426
|
+
* Checks if a property matches the filter criteria.
|
|
1261
1427
|
* @param property The property to check.
|
|
1262
|
-
* @param
|
|
1428
|
+
* @param filterText The filter text.
|
|
1263
1429
|
* @returns True if the property matches.
|
|
1264
1430
|
*/
|
|
1265
|
-
matchesSearch(property,
|
|
1266
|
-
const
|
|
1431
|
+
matchesSearch(property, filterText) {
|
|
1432
|
+
const filterByFields = [
|
|
1267
1433
|
property.label,
|
|
1268
1434
|
property.name,
|
|
1269
1435
|
property.keyPath?.join('.'),
|
|
1270
1436
|
property.title
|
|
1271
1437
|
].filter(Boolean);
|
|
1272
|
-
return
|
|
1438
|
+
return filterByFields.some(field => field?.toLowerCase().includes(filterText));
|
|
1273
1439
|
}
|
|
1274
1440
|
/**
|
|
1275
1441
|
* Updates the selection state for all nodes.
|
|
@@ -1365,20 +1531,20 @@ class AssetPropertyListComponent {
|
|
|
1365
1531
|
});
|
|
1366
1532
|
}
|
|
1367
1533
|
/**
|
|
1368
|
-
* Filters the tree nodes based on the
|
|
1534
|
+
* Filters the tree nodes based on the filter input.
|
|
1369
1535
|
*/
|
|
1370
1536
|
filterTree() {
|
|
1371
|
-
const
|
|
1537
|
+
const filterText = this.filterText?.toLowerCase() || '';
|
|
1372
1538
|
const allNodes = [...this.dataSource.data];
|
|
1373
|
-
if (!
|
|
1539
|
+
if (!filterText) {
|
|
1374
1540
|
allNodes.forEach(node => (node.isVisible = true));
|
|
1375
1541
|
this.dataSource.data = Array.from(this.flatNodeMap.values());
|
|
1376
1542
|
this.updateSelectAllState();
|
|
1377
1543
|
return;
|
|
1378
1544
|
}
|
|
1379
|
-
// First pass: Mark nodes that match the
|
|
1545
|
+
// First pass: Mark nodes that match the filter criteria
|
|
1380
1546
|
allNodes.forEach(node => {
|
|
1381
|
-
node.isVisible = this.matchesSearch(node.property,
|
|
1547
|
+
node.isVisible = this.matchesSearch(node.property, filterText);
|
|
1382
1548
|
});
|
|
1383
1549
|
// Second pass: Make parent nodes of visible nodes also visible
|
|
1384
1550
|
allNodes.forEach(node => {
|
|
@@ -1399,14 +1565,14 @@ class AssetPropertyListComponent {
|
|
|
1399
1565
|
}
|
|
1400
1566
|
/**
|
|
1401
1567
|
* Expand parent nodes when filtering
|
|
1402
|
-
* This method expands all nodes with children when a
|
|
1568
|
+
* This method expands all nodes with children when a filter is active
|
|
1403
1569
|
*/
|
|
1404
1570
|
expandNodesForSearch() {
|
|
1405
|
-
if (!this.
|
|
1571
|
+
if (!this.filterText || !this.tree()) {
|
|
1406
1572
|
return;
|
|
1407
1573
|
}
|
|
1408
1574
|
const parentNodes = this.dataSource.data.filter(node => node.expandable);
|
|
1409
|
-
// Expand all parent nodes when
|
|
1575
|
+
// Expand all parent nodes when filtering
|
|
1410
1576
|
parentNodes.forEach(node => {
|
|
1411
1577
|
if (!this.tree().isExpanded(node)) {
|
|
1412
1578
|
this.tree().expand(node);
|
|
@@ -1452,10 +1618,10 @@ class AssetPropertyListComponent {
|
|
|
1452
1618
|
// Correct syntax
|
|
1453
1619
|
}
|
|
1454
1620
|
}
|
|
1455
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
1456
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: AssetPropertyListComponent, isStandalone: true, selector: "c8y-asset-property-list", inputs: { config: "config", asset: "asset", customProperties: "customProperties" }, outputs: { selectedProperties: "selectedProperties" }, queries: [{ propertyName: "assetPropertyAction", first: true, predicate: AssetPropertyActionDirective, descendants: true }], viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"tree-container bg-inherit\"\n [attr.aria-label]=\"'Asset property list' | translate\"\n role=\"tree\"\n>\n <div\n class=\"select-all-container bg-inherit sticky-top separator-bottom\"\n *ngIf=\"config.showHeader || config.searchable\"\n >\n <div\n class=\"form-group m-b-0 p-16\"\n *ngIf=\"config.searchable\"\n [ngClass]=\"{ 'separator-bottom': config.showHeader }\"\n >\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Filter properties' | translate\"\n placeholder=\"{{ 'Filter properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"inputText\"\n (input)=\"onSearch()\"\n [disabled]=\"!dataSource.data.length\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear search' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearSearch()\"\n ></i>\n </span>\n </div>\n </div>\n <div\n class=\"d-flex a-i-center overflow-hidden\"\n *ngIf=\"config.showHeader && dataSource.data.length\"\n >\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.selectMode !== 'none' && config.expansionMode !== 'nonCollapsible',\n 'p-r-16': config.selectMode === 'none',\n 'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n }\"\n ></div>\n <c8y-list-item-checkbox\n class=\"p-l-4 p-r-4\"\n *ngIf=\"config.selectMode === 'multi'\"\n [ngModel]=\"allSelected\"\n [indeterminate]=\"indeterminate\"\n (onSelect)=\"selectAll($event)\"\n ></c8y-list-item-checkbox>\n <div\n class=\"p-l-24 p-t-40\"\n *ngIf=\"config.selectMode !== 'multi'\"\n ></div>\n <div class=\"content-flex-30 fit-w m-t-4 m-b-4\">\n <div class=\"col-6 d-flex a-i-center m-l-0 m-r-0\">\n <span class=\"p-r-4 p-l-16 flex-no-shrink\">\n <div class=\"c8y-icon\"></div>\n </span>\n <span class=\"text-medium m-l-8\">\n {{ 'Property' | translate }}\n </span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n *ngIf=\"config.showKey\"\n >\n <span class=\"text-medium\">{{ 'Key' | translate }}</span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"config.showValue\"\n >\n <span class=\"text-medium\">{{ 'Value' | translate }}</span>\n </div>\n </div>\n <div\n class=\"m-l-8 p-l-24\"\n *ngIf=\"assetPropertyAction\"\n ></div>\n </div>\n </div>\n\n <cdk-tree\n role=\"presentation\"\n *ngIf=\"dataSource.data.length; else emptyState\"\n #tree\n [dataSource]=\"dataSource\"\n [levelAccessor]=\"getLevel\"\n >\n <!-- Tree Node Definition -->\n <cdk-tree-node\n [style.display]=\"shouldRender(node) ? 'flex' : 'none'\"\n [attr.tabindex]=\"0\"\n [attr.aria-level]=\"getLevel(node) + 1\"\n [attr.aria-expanded]=\"hasChild(node) ? tree.isExpanded(node) : null\"\n [attr.aria-selected]=\"config.selectMode !== 'none' ? node.property.active : null\"\n role=\"treeitem\"\n *cdkTreeNodeDef=\"let node\"\n cdkTreeNodePadding\n [cdkTreeNodePaddingIndent]=\"24\"\n [ngClass]=\"{\n nonCollapsible: config.expansionMode === 'nonCollapsible',\n nonSelectable: config.selectMode === 'none'\n }\"\n >\n <div class=\"d-flex p-relative overflow-visible bg-inherit fit-h\">\n <!-- Toggle Button for expandable nodes -->\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [attr.aria-label]=\"\n collapseButtonTitle(node)\n | translate\n : {\n assetPropertyLabel:\n node.property.label || node.property.title || node.property.name\n }\n \"\n [attr.aria-expanded]=\"tree.isExpanded(node)\"\n *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasChild(node)\"\n cdkTreeNodeToggle\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <!-- Placeholder for non-expandable nodes to maintain alignment -->\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.expansionMode !== 'nonCollapsible',\n 'p-r-8': config.expansionMode === 'nonCollapsible'\n }\"\n *ngIf=\"!hasChild(node) || config.expansionMode === 'nonCollapsible'\"\n ></div>\n\n <!-- Selection Controls -->\n <div\n class=\"d-contents\"\n *ngIf=\"config.selectMode !== 'none'\"\n >\n @if (config.selectMode === 'single') {\n <c8y-list-item-radio\n class=\"p-l-4\"\n type=\"radio\"\n [ngModel]=\"node.property.active\"\n (onSelect)=\"onSelectSingle($event, node)\"\n ></c8y-list-item-radio>\n } @else if (config.selectMode === 'multi') {\n <c8y-list-item-checkbox\n class=\"p-l-4\"\n [ngModel]=\"node.property.active\"\n [indeterminate]=\"node.indeterminate\"\n (onSelect)=\"onSelectMulti($event, node)\"\n ></c8y-list-item-checkbox>\n }\n </div>\n\n <div class=\"content-flex-30 fit-w bg-inherit\">\n <div\n class=\"d-flex a-i-center bg-inherit m-0\"\n [ngClass]=\"{\n 'col-6': config.showKey || config.showValue,\n 'col-12': !config.showKey && !config.showValue\n }\"\n >\n <c8y-li-icon\n class=\"p-r-4\"\n [icon]=\"node.property.type | c8yAssetPropertyIcon\"\n tooltip=\"{{ node.property.type }}\"\n [delay]=\"500\"\n [ngClass]=\"{\n 'p-l-4': config.selectMode !== 'none',\n 'p-r-16': config.selectMode === 'none'\n }\"\n ></c8y-li-icon>\n\n <span class=\"p-r-8\">\n <div\n class=\"text-truncate\"\n title=\"{{\n node.property.label || node.property.title || node.property.name | translate\n }}\"\n >\n {{ node.property.label || node.property.title || node.property.name | translate }}\n </div>\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.showKey\"\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n >\n <span\n class=\"d-inline-block tag tag--default a-s-center text-truncate\"\n title=\"{{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\"\n >\n {{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"asset && config.showValue\"\n >\n <span\n class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n title=\"{{ node.property | c8yAssetPropertyValue: asset }}\"\n >\n {{ node.property | c8yAssetPropertyValue: asset }}\n </span>\n </div>\n </div>\n <div\n class=\"m-l-8 showOnHover d-flex a-i-center\"\n *ngIf=\"assetPropertyAction\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n assetPropertyAction?.template;\n context: {\n $implicit: node.property\n }\n \"\n ></ng-container>\n </div>\n </div>\n </cdk-tree-node>\n </cdk-tree>\n</div>\n\n<ng-template #emptyState>\n <c8y-ui-empty-state\n icon=\"list\"\n title=\"{{ 'No properties to display' | translate }}\"\n subtitle=\"{{ 'Select an asset to see the available properties.' | translate }}\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "component", type: i2.ListItemRadioComponent, selector: "c8y-list-item-radio, c8y-li-radio", inputs: ["selected", "name", "disabled", "value"], outputs: ["onSelect"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3.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"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i4.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "directive", type: i4.CdkTreeNodePadding, selector: "[cdkTreeNodePadding]", inputs: ["cdkTreeNodePadding", "cdkTreeNodePaddingIndent"] }, { kind: "directive", type: i4.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { kind: "component", type: i4.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "levelAccessor", "childrenAccessor", "trackBy", "expansionKey"], exportAs: ["cdkTree"] }, { kind: "directive", type: i4.CdkTreeNode, selector: "cdk-tree-node", inputs: ["role", "isExpandable", "isExpanded", "isDisabled", "cdkTreeNodeTypeaheadLabel"], outputs: ["activation", "expandedChange"], exportAs: ["cdkTreeNode"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: AssetPropertyValuePipe, name: "c8yAssetPropertyValue" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: AssetPropertyIconPipe, name: "c8yAssetPropertyIcon" }] }); }
|
|
1621
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1622
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: AssetPropertyListComponent, isStandalone: true, selector: "c8y-asset-property-list", inputs: { config: "config", asset: "asset", extraProperties: "extraProperties" }, outputs: { selectedProperties: "selectedProperties" }, queries: [{ propertyName: "assetPropertyAction", first: true, predicate: AssetPropertyActionDirective, descendants: true }], viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"tree-container bg-inherit\"\n [attr.aria-label]=\"'Asset property list' | translate\"\n role=\"tree\"\n>\n <div\n class=\"select-all-container bg-inherit sticky-top separator-bottom\"\n *ngIf=\"config.showHeader || config.filterable\"\n >\n <div\n class=\"form-group m-b-0 p-16 d-flex\"\n *ngIf=\"config.filterable\"\n [ngClass]=\"{ 'separator-bottom': config.showHeader }\"\n >\n <div\n class=\"input-group input-group-search\"\n *ngIf=\"config.filterable\"\n >\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Filter properties' | translate\"\n placeholder=\"{{ 'Filter properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"filterText\"\n (input)=\"onFilter()\"\n [disabled]=\"!dataSource.data.length\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear filter' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearFilter()\"\n ></i>\n </span>\n </div>\n </div>\n <div\n class=\"d-flex a-i-center overflow-hidden\"\n *ngIf=\"config.showHeader && dataSource.data.length\"\n >\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.selectMode !== 'none' && config.expansionMode !== 'nonCollapsible',\n 'p-r-16': config.selectMode === 'none',\n 'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n }\"\n ></div>\n <c8y-list-item-checkbox\n class=\"p-l-4 p-r-4\"\n *ngIf=\"config.selectMode === 'multi'\"\n [ngModel]=\"allSelected\"\n [indeterminate]=\"indeterminate\"\n (onSelect)=\"selectAll($event)\"\n ></c8y-list-item-checkbox>\n <div\n class=\"p-l-24 p-t-40\"\n *ngIf=\"config.selectMode !== 'multi'\"\n ></div>\n <div class=\"content-flex-30 fit-w m-t-4 m-b-4\">\n <div class=\"col-6 d-flex a-i-center m-l-0 m-r-0\">\n <span class=\"p-r-4 p-l-16 flex-no-shrink\">\n <div class=\"c8y-icon\"></div>\n </span>\n <span class=\"text-medium m-l-8\">\n {{ 'Property' | translate }}\n </span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n *ngIf=\"config.showKey\"\n >\n <span class=\"text-medium\">{{ 'Key' | translate }}</span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"config.showValue\"\n >\n <span class=\"text-medium\">{{ 'Value' | translate }}</span>\n </div>\n </div>\n <div\n class=\"m-l-8 p-l-24\"\n [ngClass]=\"{ 'p-r-40': config.allowAddingCustomProperties }\"\n *ngIf=\"assetPropertyAction\"\n ></div>\n </div>\n </div>\n\n <cdk-tree\n role=\"presentation\"\n *ngIf=\"dataSource.data.length; else emptyState\"\n #tree\n [dataSource]=\"dataSource\"\n [levelAccessor]=\"getLevel\"\n >\n <!-- Tree Node Definition -->\n <cdk-tree-node\n [style.display]=\"shouldRender(node) ? 'flex' : 'none'\"\n [attr.tabindex]=\"0\"\n [attr.aria-level]=\"getLevel(node) + 1\"\n [attr.aria-expanded]=\"hasChild(node) ? tree.isExpanded(node) : null\"\n [attr.aria-selected]=\"config.selectMode !== 'none' ? node.property.active : null\"\n role=\"treeitem\"\n *cdkTreeNodeDef=\"let node\"\n cdkTreeNodePadding\n [cdkTreeNodePaddingIndent]=\"24\"\n class=\"c8y-list__item--dense\"\n [ngClass]=\"{\n nonCollapsible: config.expansionMode === 'nonCollapsible',\n nonSelectable: config.selectMode === 'none'\n }\"\n >\n <div class=\"d-flex p-relative overflow-visible bg-inherit fit-h\">\n <!-- Toggle Button for expandable nodes -->\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [attr.aria-label]=\"\n collapseButtonTitle(node)\n | translate\n : {\n assetPropertyLabel:\n node.property.label || node.property.title || node.property.name\n }\n \"\n [attr.aria-expanded]=\"tree.isExpanded(node)\"\n *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasChild(node)\"\n cdkTreeNodeToggle\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <!-- Placeholder for non-expandable nodes to maintain alignment -->\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.expansionMode !== 'nonCollapsible',\n 'p-r-8': config.expansionMode === 'nonCollapsible'\n }\"\n *ngIf=\"!hasChild(node) || config.expansionMode === 'nonCollapsible'\"\n ></div>\n\n <!-- Selection Controls -->\n <div\n class=\"d-contents\"\n *ngIf=\"config.selectMode !== 'none'\"\n >\n @if (config.selectMode === 'single') {\n <c8y-list-item-radio\n class=\"p-l-4\"\n type=\"radio\"\n [selected]=\"node.property.active\"\n (onSelect)=\"onSelectSingle($event, node)\"\n ></c8y-list-item-radio>\n } @else if (config.selectMode === 'multi') {\n <c8y-list-item-checkbox\n class=\"p-l-4\"\n [ngModel]=\"node.property.active\"\n [indeterminate]=\"node.indeterminate\"\n (onSelect)=\"onSelectMulti($event, node)\"\n ></c8y-list-item-checkbox>\n }\n </div>\n\n <div class=\"content-flex-30 fit-w bg-inherit\">\n <div\n class=\"d-flex a-i-center bg-inherit m-0 flex-grow \"\n style=\"max-width: calc( {{!config.showKey && !config.showValue ? '100' : '50'}}% - {{ (getLevel(node) + 1) * 24 }}px + {{getLevel(node) * 12}}px)\"\n >\n <c8y-li-icon\n class=\"p-r-4\"\n [icon]=\"node.property.type | c8yAssetPropertyIcon\"\n tooltip=\"{{ node.property | c8yAssetPropertyIconTooltip }}\"\n container=\"body\"\n [delay]=\"500\"\n [ngClass]=\"{\n 'p-l-4': config.selectMode !== 'none',\n 'p-r-16': config.selectMode === 'none'\n }\"\n ></c8y-li-icon>\n\n <span class=\"p-r-8 min-width-0\">\n <div\n class=\"text-truncate\"\n title=\"{{\n node.property.label || node.property.title || node.property.name | translate\n }}\"\n [ngClass]=\"{ 'text-muted': node.property.temporary }\"\n >\n {{ node.property.label || node.property.title || node.property.name | translate }}\n </div>\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.showKey\"\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n style=\"min-width: calc((8.33333333% * 3) + {{getLevel(node) * 6 }}px - (var(--c8y-margin) * 2))\"\n >\n <span\n class=\"d-inline-block tag tag--default a-s-center text-truncate\"\n title=\"{{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\"\n >\n {{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"asset && config.showValue\"\n >\n <span\n class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n title=\"{{ node.property | c8yAssetPropertyValue: asset }}\"\n >\n {{ node.property | c8yAssetPropertyValue: asset }}\n </span>\n </div>\n </div>\n <div\n class=\"m-l-8 showOnHover d-flex a-i-center\"\n *ngIf=\"assetPropertyAction || node.property.temporary\"\n [ngClass]=\"{ 'p-l-32': !node.property.temporary }\"\n >\n <button\n class=\"btn btn-dot btn-dot--danger\"\n *ngIf=\"node.property.temporary\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"{{ 'Remove' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeProperty(node.property)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n <ng-container\n *ngTemplateOutlet=\"\n assetPropertyAction?.template;\n context: {\n $implicit: node.property\n }\n \"\n ></ng-container>\n </div>\n </div>\n </cdk-tree-node>\n </cdk-tree>\n <div \n class=\"sticky-bottom bg-inherit separator-top p-t-16\"\n *ngIf=\"config.allowAddingCustomProperties\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n (click)=\"addProperty()\"\n data-cy=\"asset-property-item-add-button\"\n >\n <i [c8yIcon]=\"'plus'\"></i>\n {{ 'Add property' | translate }}\n </button>\n </div>\n</div>\n\n<ng-template #emptyState>\n <c8y-ui-empty-state\n icon=\"list\"\n title=\"{{ 'No properties to display' | translate }}\"\n subtitle=\"{{ 'Select an asset to see the available properties.' | translate }}\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "component", type: i2.ListItemRadioComponent, selector: "c8y-list-item-radio, c8y-li-radio", inputs: ["selected", "name", "disabled", "value"], outputs: ["onSelect"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3.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"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i4.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "directive", type: i4.CdkTreeNodePadding, selector: "[cdkTreeNodePadding]", inputs: ["cdkTreeNodePadding", "cdkTreeNodePaddingIndent"] }, { kind: "directive", type: i4.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { kind: "component", type: i4.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "levelAccessor", "childrenAccessor", "trackBy", "expansionKey"], exportAs: ["cdkTree"] }, { kind: "directive", type: i4.CdkTreeNode, selector: "cdk-tree-node", inputs: ["role", "isExpandable", "isExpanded", "isDisabled", "cdkTreeNodeTypeaheadLabel"], outputs: ["activation", "expandedChange"], exportAs: ["cdkTreeNode"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: AssetPropertyValuePipe, name: "c8yAssetPropertyValue" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: AssetPropertyIconPipe, name: "c8yAssetPropertyIcon" }, { kind: "pipe", type: AssetPropertyIconTooltipPipe, name: "c8yAssetPropertyIconTooltip" }] }); }
|
|
1457
1623
|
}
|
|
1458
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1624
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyListComponent, decorators: [{
|
|
1459
1625
|
type: Component,
|
|
1460
1626
|
args: [{ selector: 'c8y-asset-property-list', standalone: true, imports: [
|
|
1461
1627
|
NgIf,
|
|
@@ -1469,13 +1635,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
1469
1635
|
NgTemplateOutlet,
|
|
1470
1636
|
AssetPropertyValuePipe,
|
|
1471
1637
|
EmptyStateComponent,
|
|
1472
|
-
AssetPropertyIconPipe
|
|
1473
|
-
|
|
1638
|
+
AssetPropertyIconPipe,
|
|
1639
|
+
NgClass,
|
|
1640
|
+
AssetPropertyIconTooltipPipe
|
|
1641
|
+
], template: "<div\n class=\"tree-container bg-inherit\"\n [attr.aria-label]=\"'Asset property list' | translate\"\n role=\"tree\"\n>\n <div\n class=\"select-all-container bg-inherit sticky-top separator-bottom\"\n *ngIf=\"config.showHeader || config.filterable\"\n >\n <div\n class=\"form-group m-b-0 p-16 d-flex\"\n *ngIf=\"config.filterable\"\n [ngClass]=\"{ 'separator-bottom': config.showHeader }\"\n >\n <div\n class=\"input-group input-group-search\"\n *ngIf=\"config.filterable\"\n >\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Filter properties' | translate\"\n placeholder=\"{{ 'Filter properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"filterText\"\n (input)=\"onFilter()\"\n [disabled]=\"!dataSource.data.length\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear filter' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearFilter()\"\n ></i>\n </span>\n </div>\n </div>\n <div\n class=\"d-flex a-i-center overflow-hidden\"\n *ngIf=\"config.showHeader && dataSource.data.length\"\n >\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.selectMode !== 'none' && config.expansionMode !== 'nonCollapsible',\n 'p-r-16': config.selectMode === 'none',\n 'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n }\"\n ></div>\n <c8y-list-item-checkbox\n class=\"p-l-4 p-r-4\"\n *ngIf=\"config.selectMode === 'multi'\"\n [ngModel]=\"allSelected\"\n [indeterminate]=\"indeterminate\"\n (onSelect)=\"selectAll($event)\"\n ></c8y-list-item-checkbox>\n <div\n class=\"p-l-24 p-t-40\"\n *ngIf=\"config.selectMode !== 'multi'\"\n ></div>\n <div class=\"content-flex-30 fit-w m-t-4 m-b-4\">\n <div class=\"col-6 d-flex a-i-center m-l-0 m-r-0\">\n <span class=\"p-r-4 p-l-16 flex-no-shrink\">\n <div class=\"c8y-icon\"></div>\n </span>\n <span class=\"text-medium m-l-8\">\n {{ 'Property' | translate }}\n </span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n *ngIf=\"config.showKey\"\n >\n <span class=\"text-medium\">{{ 'Key' | translate }}</span>\n </div>\n <div\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"config.showValue\"\n >\n <span class=\"text-medium\">{{ 'Value' | translate }}</span>\n </div>\n </div>\n <div\n class=\"m-l-8 p-l-24\"\n [ngClass]=\"{ 'p-r-40': config.allowAddingCustomProperties }\"\n *ngIf=\"assetPropertyAction\"\n ></div>\n </div>\n </div>\n\n <cdk-tree\n role=\"presentation\"\n *ngIf=\"dataSource.data.length; else emptyState\"\n #tree\n [dataSource]=\"dataSource\"\n [levelAccessor]=\"getLevel\"\n >\n <!-- Tree Node Definition -->\n <cdk-tree-node\n [style.display]=\"shouldRender(node) ? 'flex' : 'none'\"\n [attr.tabindex]=\"0\"\n [attr.aria-level]=\"getLevel(node) + 1\"\n [attr.aria-expanded]=\"hasChild(node) ? tree.isExpanded(node) : null\"\n [attr.aria-selected]=\"config.selectMode !== 'none' ? node.property.active : null\"\n role=\"treeitem\"\n *cdkTreeNodeDef=\"let node\"\n cdkTreeNodePadding\n [cdkTreeNodePaddingIndent]=\"24\"\n class=\"c8y-list__item--dense\"\n [ngClass]=\"{\n nonCollapsible: config.expansionMode === 'nonCollapsible',\n nonSelectable: config.selectMode === 'none'\n }\"\n >\n <div class=\"d-flex p-relative overflow-visible bg-inherit fit-h\">\n <!-- Toggle Button for expandable nodes -->\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [attr.aria-label]=\"\n collapseButtonTitle(node)\n | translate\n : {\n assetPropertyLabel:\n node.property.label || node.property.title || node.property.name\n }\n \"\n [attr.aria-expanded]=\"tree.isExpanded(node)\"\n *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasChild(node)\"\n cdkTreeNodeToggle\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <!-- Placeholder for non-expandable nodes to maintain alignment -->\n <div\n class=\"flex-no-shrink\"\n [ngClass]=\"{\n 'p-r-40': config.expansionMode !== 'nonCollapsible',\n 'p-r-8': config.expansionMode === 'nonCollapsible'\n }\"\n *ngIf=\"!hasChild(node) || config.expansionMode === 'nonCollapsible'\"\n ></div>\n\n <!-- Selection Controls -->\n <div\n class=\"d-contents\"\n *ngIf=\"config.selectMode !== 'none'\"\n >\n @if (config.selectMode === 'single') {\n <c8y-list-item-radio\n class=\"p-l-4\"\n type=\"radio\"\n [selected]=\"node.property.active\"\n (onSelect)=\"onSelectSingle($event, node)\"\n ></c8y-list-item-radio>\n } @else if (config.selectMode === 'multi') {\n <c8y-list-item-checkbox\n class=\"p-l-4\"\n [ngModel]=\"node.property.active\"\n [indeterminate]=\"node.indeterminate\"\n (onSelect)=\"onSelectMulti($event, node)\"\n ></c8y-list-item-checkbox>\n }\n </div>\n\n <div class=\"content-flex-30 fit-w bg-inherit\">\n <div\n class=\"d-flex a-i-center bg-inherit m-0 flex-grow \"\n style=\"max-width: calc( {{!config.showKey && !config.showValue ? '100' : '50'}}% - {{ (getLevel(node) + 1) * 24 }}px + {{getLevel(node) * 12}}px)\"\n >\n <c8y-li-icon\n class=\"p-r-4\"\n [icon]=\"node.property.type | c8yAssetPropertyIcon\"\n tooltip=\"{{ node.property | c8yAssetPropertyIconTooltip }}\"\n container=\"body\"\n [delay]=\"500\"\n [ngClass]=\"{\n 'p-l-4': config.selectMode !== 'none',\n 'p-r-16': config.selectMode === 'none'\n }\"\n ></c8y-li-icon>\n\n <span class=\"p-r-8 min-width-0\">\n <div\n class=\"text-truncate\"\n title=\"{{\n node.property.label || node.property.title || node.property.name | translate\n }}\"\n [ngClass]=\"{ 'text-muted': node.property.temporary }\"\n >\n {{ node.property.label || node.property.title || node.property.name | translate }}\n </div>\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.showKey\"\n [ngClass]=\"{ 'col-3': config.showValue, 'col-6': !config.showValue }\"\n style=\"min-width: calc((8.33333333% * 3) + {{getLevel(node) * 6 }}px - (var(--c8y-margin) * 2))\"\n >\n <span\n class=\"d-inline-block tag tag--default a-s-center text-truncate\"\n title=\"{{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\"\n >\n {{ node.property.keyPath?.join('.') || (node.property?.name | translate) }}\n </span>\n </div>\n <div\n class=\"d-flex a-i-center\"\n [ngClass]=\"{ 'col-3': config.showKey, 'col-6': !config.showKey }\"\n *ngIf=\"asset && config.showValue\"\n >\n <span\n class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n title=\"{{ node.property | c8yAssetPropertyValue: asset }}\"\n >\n {{ node.property | c8yAssetPropertyValue: asset }}\n </span>\n </div>\n </div>\n <div\n class=\"m-l-8 showOnHover d-flex a-i-center\"\n *ngIf=\"assetPropertyAction || node.property.temporary\"\n [ngClass]=\"{ 'p-l-32': !node.property.temporary }\"\n >\n <button\n class=\"btn btn-dot btn-dot--danger\"\n *ngIf=\"node.property.temporary\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"{{ 'Remove' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeProperty(node.property)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n <ng-container\n *ngTemplateOutlet=\"\n assetPropertyAction?.template;\n context: {\n $implicit: node.property\n }\n \"\n ></ng-container>\n </div>\n </div>\n </cdk-tree-node>\n </cdk-tree>\n <div \n class=\"sticky-bottom bg-inherit separator-top p-t-16\"\n *ngIf=\"config.allowAddingCustomProperties\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n (click)=\"addProperty()\"\n data-cy=\"asset-property-item-add-button\"\n >\n <i [c8yIcon]=\"'plus'\"></i>\n {{ 'Add property' | translate }}\n </button>\n </div>\n</div>\n\n<ng-template #emptyState>\n <c8y-ui-empty-state\n icon=\"list\"\n title=\"{{ 'No properties to display' | translate }}\"\n subtitle=\"{{ 'Select an asset to see the available properties.' | translate }}\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n" }]
|
|
1474
1642
|
}], ctorParameters: () => [], propDecorators: { config: [{
|
|
1475
1643
|
type: Input
|
|
1476
1644
|
}], asset: [{
|
|
1477
1645
|
type: Input
|
|
1478
|
-
}],
|
|
1646
|
+
}], extraProperties: [{
|
|
1479
1647
|
type: Input
|
|
1480
1648
|
}], selectedProperties: [{
|
|
1481
1649
|
type: Output
|
|
@@ -1484,6 +1652,199 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
1484
1652
|
args: [AssetPropertyActionDirective]
|
|
1485
1653
|
}] } });
|
|
1486
1654
|
|
|
1655
|
+
/**
|
|
1656
|
+
* Represents a drawer component for selecting asset properties.
|
|
1657
|
+
*/
|
|
1658
|
+
class CustomPropertiesDrawerComponent {
|
|
1659
|
+
constructor() {
|
|
1660
|
+
/**
|
|
1661
|
+
* Title of the drawer.
|
|
1662
|
+
*/
|
|
1663
|
+
this.title = gettext('Select property');
|
|
1664
|
+
/**
|
|
1665
|
+
* Configuration for the asset property list.
|
|
1666
|
+
*/
|
|
1667
|
+
this.config = {
|
|
1668
|
+
filterable: false,
|
|
1669
|
+
selectMode: 'multi',
|
|
1670
|
+
expansionMode: 'collapsedByDefault',
|
|
1671
|
+
showValue: false,
|
|
1672
|
+
emptyStateContent: 'default-properties',
|
|
1673
|
+
allowAddingCustomProperties: false,
|
|
1674
|
+
inputPropertiesHandle: 'override'
|
|
1675
|
+
};
|
|
1676
|
+
/**
|
|
1677
|
+
* Extra properties to be displayed in the list.
|
|
1678
|
+
*/
|
|
1679
|
+
this.extraProperties = [];
|
|
1680
|
+
/**
|
|
1681
|
+
* Emits the selected properties when saved.
|
|
1682
|
+
*/
|
|
1683
|
+
this.savePropertySelection = new EventEmitter();
|
|
1684
|
+
/**
|
|
1685
|
+
* Emits an event when the selection is canceled.
|
|
1686
|
+
*/
|
|
1687
|
+
this.cancelPropertySelection = new EventEmitter();
|
|
1688
|
+
/**
|
|
1689
|
+
* List of selected properties.
|
|
1690
|
+
*/
|
|
1691
|
+
this.selectedProperties = [];
|
|
1692
|
+
/**
|
|
1693
|
+
* Reference to the bottom drawer.
|
|
1694
|
+
*/
|
|
1695
|
+
this.bottomDrawerRef = inject(BottomDrawerRef);
|
|
1696
|
+
/**
|
|
1697
|
+
* Promise resolving to the selected properties.
|
|
1698
|
+
*/
|
|
1699
|
+
this.result = new Promise((resolve, reject) => {
|
|
1700
|
+
this._save = resolve;
|
|
1701
|
+
this._cancel = reject;
|
|
1702
|
+
});
|
|
1703
|
+
this.tabNames = {
|
|
1704
|
+
regular: gettext('Regular`properties`'),
|
|
1705
|
+
computed: gettext('Computed`properties`')
|
|
1706
|
+
};
|
|
1707
|
+
this.inputText = '';
|
|
1708
|
+
this.selectedTab = 'regular';
|
|
1709
|
+
this.searchSubject$ = new BehaviorSubject('');
|
|
1710
|
+
/**
|
|
1711
|
+
* Subject for handling component destruction.
|
|
1712
|
+
*/
|
|
1713
|
+
this.destroy$ = new Subject();
|
|
1714
|
+
this.assetPropertiesService = inject(AssetPropertiesService);
|
|
1715
|
+
}
|
|
1716
|
+
async ngOnInit() {
|
|
1717
|
+
await this.updateProperties();
|
|
1718
|
+
this.searchSubject$
|
|
1719
|
+
.pipe(takeUntil(this.destroy$), debounceTime(350))
|
|
1720
|
+
.subscribe(() => this.updateProperties());
|
|
1721
|
+
}
|
|
1722
|
+
ngOnDestroy() {
|
|
1723
|
+
this.destroy$.next();
|
|
1724
|
+
this.destroy$.complete();
|
|
1725
|
+
}
|
|
1726
|
+
/**
|
|
1727
|
+
* Updates the selected properties.
|
|
1728
|
+
* @param properties The selected properties.
|
|
1729
|
+
*/
|
|
1730
|
+
onSelectedProperties(properties) {
|
|
1731
|
+
this.selectedProperties = cloneDeep(properties);
|
|
1732
|
+
}
|
|
1733
|
+
onTabChange(tabName) {
|
|
1734
|
+
this.selectedTab = tabName;
|
|
1735
|
+
}
|
|
1736
|
+
onSearch() {
|
|
1737
|
+
this.searchSubject$.next(this.inputText);
|
|
1738
|
+
}
|
|
1739
|
+
clearSearch() {
|
|
1740
|
+
this.inputText = '';
|
|
1741
|
+
this.onSearch();
|
|
1742
|
+
}
|
|
1743
|
+
/**
|
|
1744
|
+
* Saves the selected properties and closes the drawer.
|
|
1745
|
+
*/
|
|
1746
|
+
onSave() {
|
|
1747
|
+
this._save(this.selectedProperties);
|
|
1748
|
+
this.bottomDrawerRef.close();
|
|
1749
|
+
}
|
|
1750
|
+
/**
|
|
1751
|
+
* Cancels the selection and closes the drawer.
|
|
1752
|
+
*/
|
|
1753
|
+
onCancel() {
|
|
1754
|
+
this._cancel();
|
|
1755
|
+
this.bottomDrawerRef.close();
|
|
1756
|
+
}
|
|
1757
|
+
async loadMore() {
|
|
1758
|
+
const res = await this.paging.next();
|
|
1759
|
+
this.paging = res.paging;
|
|
1760
|
+
const propertiesFromLibrary = [];
|
|
1761
|
+
const propertiesMOs = res.data;
|
|
1762
|
+
propertiesMOs.forEach(prop => {
|
|
1763
|
+
propertiesFromLibrary.push({
|
|
1764
|
+
c8y_JsonSchema: prop.c8y_JsonSchema,
|
|
1765
|
+
label: prop.name,
|
|
1766
|
+
name: Object.keys(prop.c8y_JsonSchema.properties)[0],
|
|
1767
|
+
type: prop.c8y_JsonSchema.type
|
|
1768
|
+
});
|
|
1769
|
+
});
|
|
1770
|
+
this.extraProperties = [...this.extraProperties, ...propertiesFromLibrary];
|
|
1771
|
+
}
|
|
1772
|
+
/**
|
|
1773
|
+
* Checks if the select button should be disabled.
|
|
1774
|
+
* @returns True if all selected properties are inactive.
|
|
1775
|
+
*/
|
|
1776
|
+
selectIsDisabled() {
|
|
1777
|
+
return this.selectedProperties?.every(({ active }) => !active);
|
|
1778
|
+
}
|
|
1779
|
+
async updateProperties() {
|
|
1780
|
+
const { propertiesFromLibrary, paging } = await this.assetPropertiesService.getPropertiesFromPropertiesLibrary(this.inputText);
|
|
1781
|
+
this.paging = paging;
|
|
1782
|
+
this.extraProperties = this.categorizeAndFlattenHierarchicalProperties([
|
|
1783
|
+
...propertiesFromLibrary,
|
|
1784
|
+
...defaultAssetProperties.filter(prop => prop.label.includes(this.inputText?.trim().toLowerCase()))
|
|
1785
|
+
]);
|
|
1786
|
+
}
|
|
1787
|
+
/**
|
|
1788
|
+
* Categorizes and flattens hierarchical properties.
|
|
1789
|
+
* @param properties The properties to categorize.
|
|
1790
|
+
* @returns The flattened list of properties.
|
|
1791
|
+
*/
|
|
1792
|
+
categorizeAndFlattenHierarchicalProperties(properties) {
|
|
1793
|
+
const { simple, complex } = this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);
|
|
1794
|
+
return [...simple, ...complex];
|
|
1795
|
+
}
|
|
1796
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomPropertiesDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1797
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: CustomPropertiesDrawerComponent, isStandalone: true, selector: "c8y-custom-properties-drawer-component", inputs: { title: "title" }, outputs: { savePropertySelection: "savePropertySelection", cancelPropertySelection: "cancelPropertySelection" }, host: { classAttribute: "d-contents" }, ngImport: i0, template: "<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"form-group m-b-8 p-16 d-flex\">\n <div\n class=\"input-group input-group-search\"\n >\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Search properties' | translate\"\n placeholder=\"{{ 'Search properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"inputText\"\n (input)=\"onSearch()\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear search' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearSearch()\"\n ></i>\n </span>\n </div>\n</div>\n\n<!-- TODO: uncomment when computed properties are supported https://cumulocity.atlassian.net/browse/MTM-63490 -->\n<!-- <c8y-tabs-outlet\n class=\"elevation-none m-b-16\"\n outletName=\"assetPropertiesDrawerTabs\"\n orientation=\"horizontal\"\n></c8y-tabs-outlet>\n\n<c8y-tab\n [icon]=\"'c8y-css'\"\n [title]=\"'Regular asset properties' | translate\"\n [isActive]=\"selectedTab === 'regular'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.regular | translate\"\n [priority]=\"1000\"\n (onSelect)=\"onTabChange('regular')\"\n></c8y-tab>\n<c8y-tab\n [icon]=\"'bolt'\"\n [title]=\"'Computed asset properties' | translate\"\n [isActive]=\"selectedTab === 'computed'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.computed | translate\"\n [priority]=\"900\"\n (onSelect)=\"onTabChange('computed')\"\n></c8y-tab> -->\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [config]=\"config\"\n [extraProperties]=\"extraProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n <c8y-load-more\n [paging]=\"paging\"\n [useIntersection]=\"true\"\n (onLoad)=\"loadMore()\"\n ></c8y-load-more>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AssetPropertyListComponent, selector: "c8y-asset-property-list", inputs: ["config", "asset", "extraProperties"], outputs: ["selectedProperties"] }, { kind: "component", type: LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
1798
|
+
}
|
|
1799
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomPropertiesDrawerComponent, decorators: [{
|
|
1800
|
+
type: Component,
|
|
1801
|
+
args: [{ selector: 'c8y-custom-properties-drawer-component', host: {
|
|
1802
|
+
class: 'd-contents'
|
|
1803
|
+
}, standalone: true, imports: [
|
|
1804
|
+
C8yTranslatePipe,
|
|
1805
|
+
FormsModule$1,
|
|
1806
|
+
AssetPropertyListComponent,
|
|
1807
|
+
LoadMoreComponent,
|
|
1808
|
+
IconDirective,
|
|
1809
|
+
NgIf
|
|
1810
|
+
], template: "<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"form-group m-b-8 p-16 d-flex\">\n <div\n class=\"input-group input-group-search\"\n >\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Search properties' | translate\"\n placeholder=\"{{ 'Search properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"inputText\"\n (input)=\"onSearch()\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear search' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearSearch()\"\n ></i>\n </span>\n </div>\n</div>\n\n<!-- TODO: uncomment when computed properties are supported https://cumulocity.atlassian.net/browse/MTM-63490 -->\n<!-- <c8y-tabs-outlet\n class=\"elevation-none m-b-16\"\n outletName=\"assetPropertiesDrawerTabs\"\n orientation=\"horizontal\"\n></c8y-tabs-outlet>\n\n<c8y-tab\n [icon]=\"'c8y-css'\"\n [title]=\"'Regular asset properties' | translate\"\n [isActive]=\"selectedTab === 'regular'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.regular | translate\"\n [priority]=\"1000\"\n (onSelect)=\"onTabChange('regular')\"\n></c8y-tab>\n<c8y-tab\n [icon]=\"'bolt'\"\n [title]=\"'Computed asset properties' | translate\"\n [isActive]=\"selectedTab === 'computed'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.computed | translate\"\n [priority]=\"900\"\n (onSelect)=\"onTabChange('computed')\"\n></c8y-tab> -->\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [config]=\"config\"\n [extraProperties]=\"extraProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n <c8y-load-more\n [paging]=\"paging\"\n [useIntersection]=\"true\"\n (onLoad)=\"loadMore()\"\n ></c8y-load-more>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n" }]
|
|
1811
|
+
}], propDecorators: { title: [{
|
|
1812
|
+
type: Input
|
|
1813
|
+
}], savePropertySelection: [{
|
|
1814
|
+
type: Output
|
|
1815
|
+
}], cancelPropertySelection: [{
|
|
1816
|
+
type: Output
|
|
1817
|
+
}] } });
|
|
1818
|
+
|
|
1819
|
+
/**
|
|
1820
|
+
* Service to open a drawer for selecting custom asset properties.
|
|
1821
|
+
*/
|
|
1822
|
+
class CustomPropertiesDrawerService {
|
|
1823
|
+
constructor() {
|
|
1824
|
+
this.bottomDrawerService = inject(BottomDrawerService);
|
|
1825
|
+
}
|
|
1826
|
+
async getCustomProperties() {
|
|
1827
|
+
const drawer = this.bottomDrawerService.openDrawer(CustomPropertiesDrawerComponent, {
|
|
1828
|
+
disableClickOutside: true
|
|
1829
|
+
});
|
|
1830
|
+
try {
|
|
1831
|
+
const resultOf = await drawer.instance.result;
|
|
1832
|
+
return resultOf;
|
|
1833
|
+
}
|
|
1834
|
+
catch (ex) {
|
|
1835
|
+
return [];
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomPropertiesDrawerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1839
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomPropertiesDrawerService, providedIn: 'root' }); }
|
|
1840
|
+
}
|
|
1841
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomPropertiesDrawerService, decorators: [{
|
|
1842
|
+
type: Injectable,
|
|
1843
|
+
args: [{
|
|
1844
|
+
providedIn: 'root'
|
|
1845
|
+
}]
|
|
1846
|
+
}] });
|
|
1847
|
+
|
|
1487
1848
|
/**
|
|
1488
1849
|
* Represents a drawer component for selecting asset properties.
|
|
1489
1850
|
*/
|
|
@@ -1494,9 +1855,9 @@ class AssetPropertySelectorDrawerComponent {
|
|
|
1494
1855
|
*/
|
|
1495
1856
|
this.title = gettext('Select property');
|
|
1496
1857
|
/**
|
|
1497
|
-
*
|
|
1858
|
+
* Extra properties to be displayed in the list.
|
|
1498
1859
|
*/
|
|
1499
|
-
this.
|
|
1860
|
+
this.extraProperties = [];
|
|
1500
1861
|
/**
|
|
1501
1862
|
* Emits the selected properties when saved.
|
|
1502
1863
|
*/
|
|
@@ -1549,14 +1910,14 @@ class AssetPropertySelectorDrawerComponent {
|
|
|
1549
1910
|
selectIsDisabled() {
|
|
1550
1911
|
return this.selectedProperties?.every(({ active }) => !active);
|
|
1551
1912
|
}
|
|
1552
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
1553
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
1913
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertySelectorDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1914
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: AssetPropertySelectorDrawerComponent, isStandalone: true, selector: "c8y-asset-property-selector-drawer-component", inputs: { title: "title" }, outputs: { savePropertySelection: "savePropertySelection", cancelPropertySelection: "cancelPropertySelection" }, host: { classAttribute: "d-contents" }, ngImport: i0, template: "<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [asset]=\"asset\"\n [config]=\"config\"\n [extraProperties]=\"extraProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "component", type: AssetPropertyListComponent, selector: "c8y-asset-property-list", inputs: ["config", "asset", "extraProperties"], outputs: ["selectedProperties"] }] }); }
|
|
1554
1915
|
}
|
|
1555
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1916
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertySelectorDrawerComponent, decorators: [{
|
|
1556
1917
|
type: Component,
|
|
1557
1918
|
args: [{ selector: 'c8y-asset-property-selector-drawer-component', host: {
|
|
1558
1919
|
class: 'd-contents'
|
|
1559
|
-
}, standalone: true, imports: [C8yTranslatePipe, FormsModule$1, AssetPropertyListComponent], template: "<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [asset]=\"asset\"\n [config]=\"config\"\n [
|
|
1920
|
+
}, standalone: true, imports: [C8yTranslatePipe, FormsModule$1, AssetPropertyListComponent], template: "<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [asset]=\"asset\"\n [config]=\"config\"\n [extraProperties]=\"extraProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n" }]
|
|
1560
1921
|
}], propDecorators: { title: [{
|
|
1561
1922
|
type: Input
|
|
1562
1923
|
}], savePropertySelection: [{
|
|
@@ -1569,5 +1930,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
1569
1930
|
* Generated bundle index. Do not edit.
|
|
1570
1931
|
*/
|
|
1571
1932
|
|
|
1572
|
-
export { AssetPropertiesService, AssetPropertyActionDirective, AssetPropertyListComponent, AssetPropertySelectorDrawerComponent, RESULT_TYPES, defaultAssetProperties, defaultAssetPropertyListConfig, deviceAssetProperties };
|
|
1933
|
+
export { AssetPropertiesService, AssetPropertyActionDirective, AssetPropertyListComponent, AssetPropertySelectorDrawerComponent, CustomPropertiesDrawerService, RESULT_TYPES, defaultAssetProperties, defaultAssetPropertyListConfig, deviceAssetProperties };
|
|
1573
1934
|
//# sourceMappingURL=c8y-ngx-components-asset-properties.mjs.map
|