@c8y/ngx-components 1022.35.1 → 1022.44.7
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/actility-device-registration/actility-device-registration.component.d.ts.map +1 -1
- package/actility-device-registration/actility-device-registration.service.d.ts.map +1 -1
- package/alarms/alarm-details.component.d.ts.map +1 -1
- package/alarms/alarm-info.component.d.ts.map +1 -1
- package/alarms/alarm-severity-to-icon-class.pipe.d.ts +9 -0
- package/alarms/alarm-severity-to-icon-class.pipe.d.ts.map +1 -0
- package/alarms/alarms-icon.component.d.ts.map +1 -1
- package/alarms/alarms-interval-refresh.component.d.ts.map +1 -1
- package/alarms/alarms-list.component.d.ts.map +1 -1
- package/alarms/alarms-view.service.d.ts.map +1 -1
- package/alarms/alarms.component.d.ts.map +1 -1
- package/alarms/alarms.helper.d.ts.map +1 -1
- package/alarms/alarms.model.d.ts.map +1 -1
- package/alarms/cockpit/index.d.ts.map +1 -1
- package/alarms/devicemanagement/index.d.ts.map +1 -1
- package/alarms/index.d.ts +1 -0
- package/alarms/index.d.ts.map +1 -1
- package/asset-properties/asset-properties.model.d.ts +77 -1
- package/asset-properties/asset-properties.model.d.ts.map +1 -1
- package/asset-properties/asset-properties.service.d.ts +17 -0
- package/asset-properties/asset-properties.service.d.ts.map +1 -1
- package/asset-properties/asset-property-list/asset-property-collapse-button-title.pipe.d.ts +14 -0
- package/asset-properties/asset-property-list/asset-property-collapse-button-title.pipe.d.ts.map +1 -0
- package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts +2 -1
- 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 +52 -13
- package/asset-properties/asset-property-list/asset-property-list.component.d.ts.map +1 -1
- package/asset-properties/asset-property-list/asset-property-value.pipe.d.ts +7 -3
- package/asset-properties/asset-property-list/asset-property-value.pipe.d.ts.map +1 -1
- package/asset-properties/asset-property-list/tree-data-source.d.ts +1 -0
- package/asset-properties/asset-property-list/tree-data-source.d.ts.map +1 -1
- package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts.map +1 -1
- package/asset-properties/computed-properties-config/computed-properties-config.component.d.ts +39 -0
- package/asset-properties/computed-properties-config/computed-properties-config.component.d.ts.map +1 -0
- package/asset-properties/computed-properties.service.d.ts +27 -0
- package/asset-properties/computed-properties.service.d.ts.map +1 -0
- package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts +11 -6
- package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts.map +1 -1
- package/asset-properties/custom-properties-drawer.service.d.ts +2 -1
- package/asset-properties/custom-properties-drawer.service.d.ts.map +1 -1
- package/asset-properties/index.d.ts +1 -0
- package/asset-properties/index.d.ts.map +1 -1
- package/assets-navigator/asset-node.d.ts.map +1 -1
- package/assets-navigator/asset-node.service.d.ts.map +1 -1
- package/assets-navigator/asset-selector/asset-selector-node.component.d.ts.map +1 -1
- package/assets-navigator/asset-selector/asset-selector.model.d.ts +1 -2
- package/assets-navigator/asset-selector/asset-selector.model.d.ts.map +1 -1
- package/assets-navigator/asset-selector/miller-view.component.d.ts +17 -5
- package/assets-navigator/asset-selector/miller-view.component.d.ts.map +1 -1
- package/assets-navigator/asset-selector/unassigned-devices-node.d.ts.map +1 -1
- package/assets-navigator/load-more-node.d.ts.map +1 -1
- package/auth-configuration/basic-settings/login-settings.component.d.ts.map +1 -1
- package/auth-configuration/basic-settings/session-configuration.component.d.ts.map +1 -1
- package/auth-configuration/factories/navigation.factory.d.ts.map +1 -1
- package/auth-configuration/factories/tabs.factory.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/sso-configuration.component.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/template-parts/user-data-mapping.component.d.ts.map +1 -1
- package/binary-file-download/binary-file-download.service.d.ts.map +1 -1
- package/bookmarks/bookmarks.component.d.ts.map +1 -1
- package/bookmarks/bookmarks.service.d.ts.map +1 -1
- package/bookmarks/edit-bookmarks/edit-bookmarks.component.d.ts.map +1 -1
- package/branding/dark-theme/dark-theme-tab.factory.d.ts.map +1 -1
- package/branding/extra-css-branding-editor/extra-css-branding-editor-tab.factory.d.ts.map +1 -1
- package/branding/plain-branding-editor/plain-branding-editor-tab.factory.d.ts.map +1 -1
- package/branding/shared/lazy/branding-form/branding-form.component.d.ts.map +1 -1
- package/branding/shared/lazy/branding-import-modal/branding-import-modal.component.d.ts.map +1 -1
- package/branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.d.ts.map +1 -1
- package/cockpit-config/cockpit-config.guard.d.ts.map +1 -1
- package/cockpit-config/cockpit-configuration.component.d.ts.map +1 -1
- package/computed-asset-properties/alarm-count/alarm-count-3-months-computed-property.d.ts +8 -0
- package/computed-asset-properties/alarm-count/alarm-count-3-months-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/alarm-count/alarm-count-config.component.d.ts +26 -0
- package/computed-asset-properties/alarm-count/alarm-count-config.component.d.ts.map +1 -0
- package/computed-asset-properties/alarm-count/alarm-count-today-computed-property.d.ts +8 -0
- package/computed-asset-properties/alarm-count/alarm-count-today-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/alarm-count/alarm-count-value.d.ts +17 -0
- package/computed-asset-properties/alarm-count/alarm-count-value.d.ts.map +1 -0
- package/computed-asset-properties/alarm-count/alarm-count.model.d.ts +6 -0
- package/computed-asset-properties/alarm-count/alarm-count.model.d.ts.map +1 -0
- package/computed-asset-properties/c8y-ngx-components-computed-asset-properties.d.ts.map +1 -0
- package/computed-asset-properties/child-count/child-assets-count-computed-property.d.ts +14 -0
- package/computed-asset-properties/child-count/child-assets-count-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/child-count/child-count-value.d.ts +14 -0
- package/computed-asset-properties/child-count/child-count-value.d.ts.map +1 -0
- package/computed-asset-properties/child-count/child-devices-count-computed-property.d.ts +14 -0
- package/computed-asset-properties/child-count/child-devices-count-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/common/realtime-value-base.d.ts +32 -0
- package/computed-asset-properties/common/realtime-value-base.d.ts.map +1 -0
- package/computed-asset-properties/common/realtime-value-handler.d.ts +19 -0
- package/computed-asset-properties/common/realtime-value-handler.d.ts.map +1 -0
- package/computed-asset-properties/configuration-snapshot/configuration-snapshot-computed-property.d.ts +7 -0
- package/computed-asset-properties/configuration-snapshot/configuration-snapshot-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/configuration-snapshot/configuration-snapshot-config.component.d.ts +21 -0
- package/computed-asset-properties/configuration-snapshot/configuration-snapshot-config.component.d.ts.map +1 -0
- package/computed-asset-properties/configuration-snapshot/configuration-snapshot.model.d.ts +8 -0
- package/computed-asset-properties/configuration-snapshot/configuration-snapshot.model.d.ts.map +1 -0
- package/computed-asset-properties/event-count/event-count-3-months.d.ts +8 -0
- package/computed-asset-properties/event-count/event-count-3-months.d.ts.map +1 -0
- package/computed-asset-properties/event-count/event-count-config.component.d.ts +18 -0
- package/computed-asset-properties/event-count/event-count-config.component.d.ts.map +1 -0
- package/computed-asset-properties/event-count/event-count-today.d.ts +8 -0
- package/computed-asset-properties/event-count/event-count-today.d.ts.map +1 -0
- package/computed-asset-properties/event-count/event-count-value.d.ts +17 -0
- package/computed-asset-properties/event-count/event-count-value.d.ts.map +1 -0
- package/computed-asset-properties/event-count/event-count.model.d.ts +4 -0
- package/computed-asset-properties/event-count/event-count.model.d.ts.map +1 -0
- package/computed-asset-properties/index.d.ts +3 -0
- package/computed-asset-properties/index.d.ts.map +1 -0
- package/computed-asset-properties/last-device-message/last-device-message-computed-property.d.ts +3 -0
- package/computed-asset-properties/last-device-message/last-device-message-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/last-device-message/last-device-message-value.d.ts +13 -0
- package/computed-asset-properties/last-device-message/last-device-message-value.d.ts.map +1 -0
- package/computed-asset-properties/last-measurement/last-measurement-computed-property.d.ts +8 -0
- package/computed-asset-properties/last-measurement/last-measurement-computed-property.d.ts.map +1 -0
- package/computed-asset-properties/last-measurement/last-measurement-config.component.d.ts +48 -0
- package/computed-asset-properties/last-measurement/last-measurement-config.component.d.ts.map +1 -0
- package/computed-asset-properties/last-measurement/last-measurement-value.d.ts +13 -0
- package/computed-asset-properties/last-measurement/last-measurement-value.d.ts.map +1 -0
- package/computed-asset-properties/last-measurement/last-measurement.model.d.ts +28 -0
- package/computed-asset-properties/last-measurement/last-measurement.model.d.ts.map +1 -0
- package/computed-asset-properties/strategies/alarm-count-strategy.d.ts +17 -0
- package/computed-asset-properties/strategies/alarm-count-strategy.d.ts.map +1 -0
- package/computed-asset-properties/strategies/child-count-strategy.d.ts +14 -0
- package/computed-asset-properties/strategies/child-count-strategy.d.ts.map +1 -0
- package/computed-asset-properties/strategies/count-strategy-base.d.ts +12 -0
- package/computed-asset-properties/strategies/count-strategy-base.d.ts.map +1 -0
- package/computed-asset-properties/strategies/event-count-strategy.d.ts +16 -0
- package/computed-asset-properties/strategies/event-count-strategy.d.ts.map +1 -0
- package/computed-asset-properties/strategies/last-device-message-strategy.d.ts +20 -0
- package/computed-asset-properties/strategies/last-device-message-strategy.d.ts.map +1 -0
- package/computed-asset-properties/strategies/last-measurement-strategy.d.ts +16 -0
- package/computed-asset-properties/strategies/last-measurement-strategy.d.ts.map +1 -0
- package/connectivity/abstract-connectivity-node.factory.d.ts.map +1 -1
- package/connectivity/actility/actility-tab.factory.d.ts.map +1 -1
- package/connectivity/sigfox/sigfox-tab.factory.d.ts.map +1 -1
- package/connectivity/sim/sim.module.d.ts.map +1 -1
- package/context-dashboard/cockpit-home-dashboard/cockpit-dashboard.component.d.ts.map +1 -1
- package/context-dashboard/cockpit-home-dashboard/cockpit-dashboard.model.d.ts.map +1 -1
- package/context-dashboard/cockpit-home-dashboard/cockpit-dashboard.module.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.component.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.model.d.ts +16 -0
- package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-details-tabs.factory.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/dashboard-version-history.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
- package/context-dashboard/device-info-dashboard/device-info-dashboard.component.d.ts.map +1 -1
- package/context-dashboard/device-info-dashboard/device-info-dashboard.module.d.ts.map +1 -1
- package/context-dashboard/device-management-home-dashboard/device-management-home-dashboard.component.d.ts.map +1 -1
- package/context-dashboard/device-management-home-dashboard/device-management-home-dashboard.module.d.ts.map +1 -1
- package/context-dashboard/new-dashboard.guard.d.ts.map +1 -1
- package/context-dashboard/widget-config/appearance-settings.component.d.ts.map +1 -1
- package/context-dashboard/widget-config.service.d.ts +11 -1
- package/context-dashboard/widget-config.service.d.ts.map +1 -1
- package/core/action/action.service.d.ts +1 -1
- package/core/action-bar/action-bar.service.d.ts +1 -1
- package/core/authentication/simplified-auth.service.d.ts +1 -1
- package/core/authentication/simplified-auth.service.d.ts.map +1 -1
- package/core/bottom-drawer/bottom-drawer.component.d.ts +16 -2
- package/core/bottom-drawer/bottom-drawer.component.d.ts.map +1 -1
- package/core/bottom-drawer/bottom-drawer.service.d.ts +13 -5
- package/core/bottom-drawer/bottom-drawer.service.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb.service.d.ts +1 -1
- package/core/common/extension-hooks.d.ts.map +1 -1
- package/core/common/options.service.d.ts +1 -1
- package/core/common/service-registry.service.d.ts +1 -1
- package/core/common/ui-state.service.d.ts +7 -7
- package/core/common/ui-state.service.d.ts.map +1 -1
- package/core/common/user-preferences/user-preferences.service.d.ts +4 -4
- package/core/common/user-preferences/user-preferences.service.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts +9 -1
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/data-grid/action-controls-extension.service.d.ts +1 -1
- package/core/data-grid/filter-chip/filter-mapper.factory.d.ts +1 -1
- package/core/date-picker/date-picker.component.d.ts.map +1 -1
- package/core/docs/docs.models.d.ts +1 -1
- package/core/docs/docs.module.d.ts +1 -1
- package/core/docs/help-and-support-outlet/help-and-support-outlet.module.d.ts +1 -1
- package/core/docs/legal-notices-outlet/legal-notices-outlet.module.d.ts +1 -1
- package/core/docs/support-outlet/support-outlet.component.d.ts +4 -3
- package/core/docs/support-outlet/support-outlet.component.d.ts.map +1 -1
- package/core/docs/support-outlet/support-outlet.module.d.ts +1 -1
- package/core/drawer/drawer.service.d.ts +1 -1
- package/core/dynamic-component/dynamic-component.model.d.ts +18 -4
- package/core/dynamic-component/dynamic-component.model.d.ts.map +1 -1
- package/core/dynamic-forms/i18n/translate.extension.d.ts.map +1 -1
- package/core/feedback-form/feedback-form.component.d.ts +27 -0
- package/core/feedback-form/feedback-form.component.d.ts.map +1 -0
- package/core/feedback-form/feedback-form.model.d.ts +6 -0
- package/core/feedback-form/feedback-form.model.d.ts.map +1 -0
- package/core/feedback-form/index.d.ts +2 -0
- package/core/feedback-form/index.d.ts.map +1 -0
- package/core/i18n/gettext.d.ts +4 -1
- package/core/i18n/gettext.d.ts.map +1 -1
- package/core/i18n/pattern-messages.data.d.ts +61 -0
- package/core/i18n/pattern-messages.data.d.ts.map +1 -1
- package/core/i18n/patterns-message.hook.d.ts +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.d.ts.map +1 -1
- package/core/modal/modal.service.d.ts +0 -1
- package/core/modal/modal.service.d.ts.map +1 -1
- package/core/navigator/navigator-bottom/navigator-bottom.module.d.ts +1 -1
- package/core/navigator/navigator-top/navigator-top.module.d.ts +1 -1
- package/core/navigator/navigator.module.d.ts +1 -1
- package/core/navigator/navigator.service.d.ts +1 -1
- package/core/plugins/index.d.ts +1 -0
- package/core/plugins/index.d.ts.map +1 -1
- package/core/plugins/plugins-injection-token.d.ts +14 -0
- package/core/plugins/plugins-injection-token.d.ts.map +1 -0
- package/core/plugins/plugins-loader.service.d.ts +7 -21
- package/core/plugins/plugins-loader.service.d.ts.map +1 -1
- package/core/plugins/plugins-resolve.service.d.ts +1 -0
- package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
- package/core/preview-feature/preview-feature.component.d.ts.map +1 -1
- package/core/preview-feature/preview-feature.service.d.ts +1 -1
- package/core/provider-configuration/provider-configuration-hook.d.ts +1 -1
- package/core/query-param-handler/index.d.ts +1 -1
- package/core/query-param-handler/query-param-bottom-drawer.service.d.ts +1 -1
- package/core/query-param-handler/query-param-handler.service.d.ts +1 -1
- package/core/query-param-handler/query-param-modal-handler.service.d.ts +1 -1
- package/core/router/router.service.d.ts +1 -1
- package/core/search/search.service.d.ts +1 -1
- package/core/stepper/stepper.service.d.ts +1 -1
- package/core/tabs/tab.component.d.ts +2 -2
- package/core/tabs/tab.component.d.ts.map +1 -1
- package/core/tabs/tab.model.d.ts +2 -2
- package/core/tabs/tab.model.d.ts.map +1 -1
- package/core/tabs/tabs.service.d.ts +1 -1
- package/core/tabs/tabs.service.d.ts.map +1 -1
- package/core/ui-settings/ui-settings.module.d.ts +1 -1
- package/core/user/change-current-user-password.service.d.ts +10 -0
- package/core/user/change-current-user-password.service.d.ts.map +1 -0
- package/core/user/index.d.ts +1 -0
- package/core/user/index.d.ts.map +1 -1
- package/core/user/user-details-drawer/user-details-drawer.module.d.ts +1 -1
- package/core/user/user-menu.service.d.ts +1 -1
- package/core/user/user.module.d.ts +1 -1
- package/core/version/version.model.d.ts +1 -1
- package/core/version/version.module.d.ts +1 -1
- package/core/wizard/wizard.model.d.ts +1 -1
- package/dashboard-details-advanced-tab/advanced-tab.factory.d.ts.map +1 -1
- package/dashboard-details-advanced-tab/assign-widget-assets/assign-widget-asset-modal.component.d.ts.map +1 -1
- package/dashboard-details-advanced-tab/dashboard-json-editor/dashboard-json-editor.component.d.ts.map +1 -1
- package/dashboard-details-advanced-tab/dashboard-json-editor/import-export-widgets.service.d.ts.map +1 -1
- package/dashboard-manager/dashboard-manager-tabs.factory.d.ts.map +1 -1
- package/dashboard-manager/dashboard-manager.service.d.ts.map +1 -1
- package/dashboard-manager/devicemanagement/index.d.ts +1 -1
- package/dashboard-manager/type-dashboard-target-assets-grid/type-dashboard-target-assets-grid.component.d.ts.map +1 -1
- package/dashboard-manager/type-dashboard-target-assets-modal/type-dashboard-target-assets-modal.component.d.ts.map +1 -1
- package/dashboard-manager/type-dashboards-list/device-type-value.grid-column.d.ts.map +1 -1
- package/dashboard-manager/type-dashboards-list/type-dashboards-list.component.d.ts.map +1 -1
- package/data-grid-columns/asset-type/asset-type-grid-column.d.ts.map +1 -1
- package/data-grid-columns/asset-type/asset-type.cell-renderer.component.d.ts.map +1 -1
- package/datapoint-explorer/datapoint-explorer-navigation-factory.d.ts.map +1 -1
- package/datapoint-explorer/devicemanagement/index.d.ts +3 -0
- package/datapoint-explorer/devicemanagement/index.d.ts.map +1 -1
- package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts +4 -2
- package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -1
- package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts.map +1 -1
- package/datapoint-explorer/view/datapoint-explorer.model.d.ts +1 -0
- package/datapoint-explorer/view/datapoint-explorer.model.d.ts.map +1 -1
- package/datapoint-explorer/view/index.d.ts +3 -0
- package/datapoint-explorer/view/index.d.ts.map +1 -1
- package/datapoint-explorer/view/send-as-widget-to-dashboard-modal/send-as-widget-to-dashboard-modal.component.d.ts.map +1 -1
- package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts.map +1 -1
- package/datapoint-library/datapoint-library.module.d.ts.map +1 -1
- package/datapoint-library/details/datapoint-library-details.component.d.ts +1 -2
- package/datapoint-library/details/datapoint-library-details.component.d.ts.map +1 -1
- package/datapoint-library/list/datapoint-library-list.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-selector-modal/datapoint-selector-modal.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-template-popover/datapoint-template-popover.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
- package/default-subscriptions/default-subscriptions-navigation.factory.d.ts.map +1 -1
- package/default-subscriptions/default-subscriptions.component.d.ts.map +1 -1
- package/device-grid/columns/alarms.cell-renderer.component.d.ts.map +1 -1
- package/device-grid/columns/alarms.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/group.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/imei.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/model.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/name.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/registration-date.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/serial-number.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/status.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/system-id.device-grid-column.d.ts.map +1 -1
- package/device-grid/columns/type.device-grid-column.d.ts.map +1 -1
- package/device-grid/device-grid.component.d.ts.map +1 -1
- package/device-grid/device-grid.service.d.ts.map +1 -1
- package/device-list/add-smart-group.component.d.ts.map +1 -1
- package/device-list/device-list-navigation.factory.d.ts.map +1 -1
- package/device-list/devices.breadcrumb-factory.d.ts.map +1 -1
- package/device-map/device-map-navigation.factory.d.ts.map +1 -1
- package/device-profile/add-device-profile.component.d.ts.map +1 -1
- package/device-profile/device-profile-list.component.d.ts.map +1 -1
- package/device-profile/device-profile-navigation.factory.d.ts.map +1 -1
- package/device-profile/device-profile.component.d.ts.map +1 -1
- package/device-profile/device-profile.service.d.ts.map +1 -1
- package/device-profile/device-tab-profile/device-tab-profile.component.d.ts.map +1 -1
- package/device-profile/select-configuration-modal.component.d.ts.map +1 -1
- package/device-protocols/device-protocols.guard.d.ts.map +1 -1
- package/device-provisioned-certificates/device-provisioned-certificates.module.d.ts.map +1 -1
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts.map +1 -1
- package/device-shell/device-shell.module.d.ts.map +1 -1
- package/device-shell/shared/device-shell.service.d.ts.map +1 -1
- package/device-shell/shell/shell.component.d.ts.map +1 -1
- package/diagnostics/diagnostics.module.d.ts.map +1 -1
- package/diagnostics/diagnostics.service.d.ts.map +1 -1
- package/echart/services/echarts-options.service.d.ts +2 -3
- package/echart/services/echarts-options.service.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
- package/ecosystem/application-plugins/apps-to-update-remotes-select.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/orphaned-status-cell-renderer.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -1
- package/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.d.ts.map +1 -1
- package/ecosystem/application-properties/application-properties.component.d.ts.map +1 -1
- package/ecosystem/application-properties/subscription-modal/subscription-modal.component.d.ts.map +1 -1
- package/ecosystem/ecosystem-tabs.factory.d.ts.map +1 -1
- package/ecosystem/license-confirm/license-confirm-modal.component.d.ts.map +1 -1
- package/ecosystem/license-confirm/license-view.component.d.ts.map +1 -1
- package/ecosystem/microservices/add-microservice.component.d.ts.map +1 -1
- package/ecosystem/packages/add-package.component.d.ts.map +1 -1
- package/ecosystem/packages/deploy-application/deploy-application.component.d.ts.map +1 -1
- package/ecosystem/packages/package-list/packages-list.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/package-versions-list/package-versions-list.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
- package/ecosystem/plugin-setup-stepper/plugin-setup-stepper.module.d.ts.map +1 -1
- package/ecosystem/shared/add-application.component.d.ts.map +1 -1
- package/ecosystem/shared/application-card.component.d.ts.map +1 -1
- package/ecosystem/shared/archived-filter/archived-filter.component.d.ts.map +1 -1
- package/ecosystem/shared/ecosystem.constants.d.ts.map +1 -1
- package/ecosystem/shared/ecosystem.service.d.ts.map +1 -1
- package/ecosystem/shared/package-availability.service.d.ts.map +1 -1
- package/ecosystem/shared/package-version-select/package-version-select.component.d.ts.map +1 -1
- package/ecosystem/shared/upload-archive.component.d.ts.map +1 -1
- package/editor/editor.component.d.ts +16 -0
- package/editor/editor.component.d.ts.map +1 -1
- package/exports/index.d.ts +1 -1
- package/exports/index.d.ts.map +1 -1
- package/exports/list/exports-grid.service.d.ts.map +1 -1
- package/exports/list/exports-list/exports-list.component.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +2 -1
- package/fesm2022/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +8 -7
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +2 -1
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +2 -1
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +40 -2
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +608 -97
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-CRnyUbyz.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +70 -23
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +2 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs +2 -1
- package/fesm2022/c8y-ngx-components-binary-file-download.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +2 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs +2 -1
- package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs +3 -3
- package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +2 -1
- package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +22 -12
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-child-devices.mjs +2 -1
- package/fesm2022/c8y-ngx-components-child-devices.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +2 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-BOpIFCYh.mjs +68 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-BOpIFCYh.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-D8otkLI8.mjs +73 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-D8otkLI8.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-AVm6qa9k.mjs +44 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-AVm6qa9k.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CtUoKGuU.mjs +91 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CtUoKGuU.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +643 -0
- package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-connectivity.mjs +2 -1
- package/fesm2022/c8y-ngx-components-connectivity.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +2 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-BkcNSexF.mjs} +3 -2
- package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-BkcNSexF.mjs.map +1 -0
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-D9W68e7h.mjs} +3 -2
- package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-version-history.component-D9W68e7h.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +45 -12
- 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-CwfVxTSx.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-D0lATUjO.mjs} +12 -8
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-D0lATUjO.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +4 -3
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +2 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-broker.mjs +2 -1
- package/fesm2022/c8y-ngx-components-data-broker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs +2 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs +2 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs +38 -9
- package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +58 -53
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +2 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +2 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +2 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs +2 -1
- package/fesm2022/c8y-ngx-components-datapoint-library.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +2 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +2 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs +2 -1
- package/fesm2022/c8y-ngx-components-default-subscriptions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +3 -3
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs +2 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs +2 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +2 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs +3 -2
- package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-protocols.mjs +2 -1
- package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +2 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-shell.mjs +2 -1
- package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs +2 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +6 -8
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +2 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +2 -1
- package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +2 -1
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +2 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +2 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-editor.mjs +39 -1
- package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events.mjs +1 -1
- package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-exports-list.mjs +2 -1
- package/fesm2022/c8y-ngx-components-exports-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-exports.mjs +2 -1
- package/fesm2022/c8y-ngx-components-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-file-preview.mjs +2 -1
- package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs +2 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +2 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-location.mjs +2 -1
- package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +2 -1
- package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +2 -1
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +2 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +2 -1
- 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 +2 -1
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-shared.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations.mjs +2 -1
- package/fesm2022/c8y-ngx-components-operations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs +2 -1
- package/fesm2022/c8y-ngx-components-pending-mo-request.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs +2 -1
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +2 -1
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +2 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +2 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +2 -1
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +2 -1
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +2 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +2 -1
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +3 -3
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +2 -1
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +2 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device.mjs +2 -1
- package/fesm2022/c8y-ngx-components-replace-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +2 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-reports.mjs +2 -1
- package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +2 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +2 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +3 -2
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +2 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs +2 -1
- package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +2 -1
- package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs +3 -2
- package/fesm2022/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +2 -1
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-shared.mjs +1 -1
- package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs +2 -1
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +2 -1
- package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs +3 -2
- package/fesm2022/c8y-ngx-components-sms-gateway.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs +13 -9
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +37 -37
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs +2 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +5 -5
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +2 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +10 -3
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs +2 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +2 -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 +2 -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 +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs +2 -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 +2 -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 +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +2 -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 +2 -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 +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 +2 -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 +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +3 -6
- package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-quick-links.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs +9 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs +2 -1
- 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 +2 -1
- 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 +2 -1
- 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 +13 -8
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-import-export-config.mjs +3 -10
- package/fesm2022/c8y-ngx-components-widgets-import-export-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +789 -531
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/file-preview/file-preview.component.d.ts.map +1 -1
- package/files-repository/files-repository-navigation.factory.d.ts.map +1 -1
- package/files-repository/files-repository-upload.component.d.ts.map +1 -1
- package/files-repository/files-repository.component.d.ts.map +1 -1
- package/files-repository/files-repository.service.d.ts +1 -2
- package/files-repository/files-repository.service.d.ts.map +1 -1
- package/icon-selector/icon-selector-modal/icon-selector-modal.component.d.ts.map +1 -1
- package/icon-selector/icon-selector.component.d.ts.map +1 -1
- package/locales/de.po +105 -12
- package/locales/es.po +105 -12
- package/locales/fr.po +105 -12
- package/locales/ja_JP.po +99 -12
- package/locales/ko.po +104 -12
- package/locales/locales.pot +97 -12
- package/locales/nl.po +105 -12
- package/locales/pl.po +105 -12
- package/locales/pt_BR.po +105 -12
- package/locales/zh_CN.po +104 -12
- package/locales/zh_TW.po +104 -12
- package/location/location-tab.factory.d.ts.map +1 -1
- package/location/location.component.d.ts.map +1 -1
- package/loriot-device-registration/loriot-device-registration.component.d.ts.map +1 -1
- package/loriot-device-registration/loriot-provider.service.d.ts.map +1 -1
- package/map/map.component.d.ts.map +1 -1
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts.map +1 -1
- package/messaging-management/messaging/shared/usage/usage.component.d.ts.map +1 -1
- package/messaging-management/messaging/topic/topic-list-view.component.d.ts.map +1 -1
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts.map +1 -1
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts.map +1 -1
- package/messaging-management/messaging/topic/topics-data-grid.service.d.ts.map +1 -1
- package/messaging-management/navigator/messaging-navigator-factory.d.ts.map +1 -1
- package/messaging-management/navigator/topic-details-tab.factory.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/bulk-operation-list-item.component.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/modals/bulk-operations-reschedule-modal.component.d.ts.map +1 -1
- package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
- package/operations/bulk-operation-stepper/bulk-operation-stepper.component.d.ts.map +1 -1
- package/operations/bulk-single-operations-list/single-operation-item.component.d.ts.map +1 -1
- package/operations/bulk-single-operations-list/single-operations-list.component.d.ts.map +1 -1
- package/operations/factories/bulk-operations-tab.factory.d.ts.map +1 -1
- package/operations/grid-columns/creation-time.grid-column.d.ts.map +1 -1
- package/operations/grid-columns/device.grid-column.d.ts.map +1 -1
- package/operations/grid-columns/failure-reason.grid-column.d.ts.map +1 -1
- package/operations/grid-columns/status.grid-column.d.ts.map +1 -1
- package/operations/operations-list/device-control.feature.d.ts.map +1 -1
- package/operations/operations-list/operations-list-item.component.d.ts.map +1 -1
- package/operations/operations-list/operations-list.component.d.ts.map +1 -1
- package/operations/operations-list/single-operations-tab.factory.d.ts.map +1 -1
- package/operations/operations-list-item-details/operation-details-tabs.component.d.ts.map +1 -1
- package/operations/shared/nav.factory.d.ts.map +1 -1
- package/operations/shared/operations.service.d.ts.map +1 -1
- package/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-device-profile/stepper-bulk-type-device-profile.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-firmware/stepper-bulk-type-firmware.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/select-software-step.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/stepper-bulk-type-software.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/pending-mo-request/pending-mo-request-interceptor.d.ts.map +1 -1
- package/pending-mo-request/pending-mo-request.service.d.ts.map +1 -1
- package/platform-configuration/platform-configuration-form-provider.service.d.ts.map +1 -1
- package/protocol-lpwan/lpwan-protocol.module.d.ts.map +1 -1
- package/protocol-lpwan/lpwan-set-connections.component.d.ts.map +1 -1
- package/protocol-lpwan/lpwan-set-device-protocol.component.d.ts.map +1 -1
- package/protocol-lpwan/multiple-lns-connectors/actility-multiple-lns-connector.component.d.ts.map +1 -1
- package/protocol-lpwan/multiple-lns-connectors/connection-info-with-download-csv.component.d.ts.map +1 -1
- package/protocol-lpwan/multiple-lns-connectors/loriot/loriot-multiple-lns-connector.component.d.ts.map +1 -1
- package/protocol-lpwan/multiple-lns-connectors/no-connections-found.component.d.ts.map +1 -1
- package/protocol-lpwan/multiple-lns-connectors/sigfox-multiple-lns-connector.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-address-space.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-detail.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-server-config.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-servers.component.d.ts.map +1 -1
- package/register-device/bulk/bulk-device-registration-modal.component.d.ts.map +1 -1
- package/register-device/device-registration-view.component.d.ts.map +1 -1
- package/register-device/extensible/base-extensible-device-registration.service.d.ts.map +1 -1
- package/register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.d.ts.map +1 -1
- package/register-device/extensible/bulk/extensible-bulk-device-registration.service.d.ts.map +1 -1
- package/register-device/extensible/single/extensible-device-registration-modal.component.d.ts.map +1 -1
- package/register-device/extensible/single/extensible-device-registration-stepper.component.d.ts.map +1 -1
- package/register-device/extensible/single/extensible-device-registration.service.d.ts.map +1 -1
- package/register-device/general/general-device-registration.component.d.ts.map +1 -1
- package/register-device/register-device-navigation.factory.d.ts.map +1 -1
- package/register-device/register-device.service.d.ts.map +1 -1
- package/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.d.ts.map +1 -1
- package/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.d.ts.map +1 -1
- package/remote-access/passthrough/index.d.ts +1 -1
- package/remote-access/passthrough/index.d.ts.map +1 -1
- package/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.d.ts.map +1 -1
- package/remote-access/ssh/index.d.ts.map +1 -1
- package/remote-access/telnet/index.d.ts.map +1 -1
- package/remote-access/vnc/index.d.ts.map +1 -1
- package/replace-device/replace-device-grid-action.factory.d.ts.map +1 -1
- package/replace-device/replace-device-wizard/replace-device-wizard.component.d.ts.map +1 -1
- package/replace-device/replace-device-wizard/replace-device-wizard.service.d.ts.map +1 -1
- package/replace-device/replace-device.service.d.ts.map +1 -1
- package/report-dashboard/report-dashboard-list.component.d.ts.map +1 -1
- package/report-dashboard/report-dashboard-navigation.factory.d.ts.map +1 -1
- package/reports/export-schedules.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/configuration-repository-device-tab.module.d.ts.map +1 -1
- package/repository/configuration/device-tab/save-to-repository.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/text-based-configuration.component.d.ts.map +1 -1
- package/repository/configuration/list/configuration-detail.component.d.ts.map +1 -1
- package/repository/configuration/list/configuration-list.component.d.ts.map +1 -1
- package/repository/configuration/list/configuration-repository-navigation-factory.d.ts.map +1 -1
- package/repository/firmware/device-tab/firmware-device-tab.component.d.ts.map +1 -1
- package/repository/firmware/device-tab/firmware-repository-device-tab.module.d.ts.map +1 -1
- package/repository/firmware/list/add-firmware-modal.component.d.ts.map +1 -1
- package/repository/firmware/list/add-firmware-patch-modal.component.d.ts.map +1 -1
- package/repository/firmware/list/firmware-details.component.d.ts.map +1 -1
- package/repository/firmware/list/firmware-list.component.d.ts.map +1 -1
- package/repository/firmware/list/firmware-repository-navigation-factory.d.ts.map +1 -1
- package/repository/shared/columns/description.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/device-type.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/file.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/name.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/type.filtering-form-renderer.component.d.ts.map +1 -1
- package/repository/shared/columns/type.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/versions.grid-column.d.ts.map +1 -1
- package/repository/shared/repository.service.d.ts.map +1 -1
- package/repository/shared/select-modal/repository-select-modal.component.d.ts +1 -1
- package/repository/shared/select-modal/repository-select-modal.component.d.ts.map +1 -1
- package/repository/shared/software-type/software-type.component.d.ts.map +1 -1
- package/repository/software/device-tab/installed-software.component.d.ts.map +1 -1
- package/repository/software/device-tab/software-repository-device-tab.module.d.ts.map +1 -1
- package/repository/software/list/add-software-modal.component.d.ts.map +1 -1
- package/repository/software/list/software-details.component.d.ts.map +1 -1
- package/repository/software/list/software-list.component.d.ts.map +1 -1
- package/repository/software/list/software-repository-navigation-factory.d.ts.map +1 -1
- package/search/columns/asset-type-search-grid-column.d.ts.map +1 -1
- package/search/search-grid.component.d.ts.map +1 -1
- package/search/search-results.component.d.ts.map +1 -1
- package/sensor-phone/connect-smartphone.factory.d.ts.map +1 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone-modal.component.d.ts.map +1 -1
- package/sensor-phone/sensor-phone-modal/sensor-phone.service.d.ts.map +1 -1
- package/services/service-command-tab/service-command.feature.d.ts.map +1 -1
- package/services/services-device-tab/columns/last-updated-date.device-grid-column.d.ts.map +1 -1
- package/services/services-device-tab/columns/name.grid-column.d.ts.map +1 -1
- package/services/services-device-tab/columns/service-type.grid-column.d.ts.map +1 -1
- package/services/services-device-tab/columns/status.grid-column.d.ts.map +1 -1
- package/services/services-device-tab/services-device-tab.component.d.ts.map +1 -1
- package/services/services-device-tab/services-device-tab.module.d.ts.map +1 -1
- package/services/services-device-tab/services.breadcrumb-factory.d.ts.map +1 -1
- package/services/shared/service-command.service.d.ts.map +1 -1
- package/services/status-options/status-options.model.d.ts.map +1 -1
- package/sigfox-device-registration/sigfox-device-registration.component.d.ts.map +1 -1
- package/sigfox-device-registration/sigfox-provider.service.d.ts.map +1 -1
- package/sms-gateway/sms-gateway.module.d.ts.map +1 -1
- package/sub-assets/add-group/add-group.component.d.ts.map +1 -1
- package/sub-assets/asset-properties-item.component.d.ts.map +1 -1
- package/sub-assets/asset-properties.component.d.ts.map +1 -1
- package/sub-assets/assign-devices/assign-child-devices.component.d.ts.map +1 -1
- package/sub-assets/assign-devices/assign-devices.component.d.ts.map +1 -1
- package/sub-assets/delete-assets-modal/delete-assets-modal.component.d.ts.map +1 -1
- package/sub-assets/group-info.component.d.ts.map +1 -1
- package/sub-assets/sub-assets-grid.component.d.ts.map +1 -1
- package/sub-assets/sub-assets.component.d.ts.map +1 -1
- package/sub-assets/sub-assets.module.d.ts.map +1 -1
- package/sub-assets/sub-assets.service.d.ts.map +1 -1
- package/sub-assets/unassign-assets-modal/unassign-modal.component.d.ts.map +1 -1
- package/tenants/custom-properties/custom-properties.component.d.ts.map +1 -1
- package/tenants/tenant-form/tenant-form.component.d.ts.map +1 -1
- package/tenants/tenant-limits/tenant-limits.component.d.ts.map +1 -1
- package/tenants/tenant-list/creation-time.filtering-form-renderer.component.d.ts.map +1 -1
- package/tenants/tenant-list/tenant-list.component.d.ts.map +1 -1
- package/tenants/tenants-navigation.factory.d.ts.map +1 -1
- package/tenants/tenants.module.d.ts.map +1 -1
- package/tracking/tracking.feature.d.ts.map +1 -1
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -1
- package/trusted-certificates/crl/crl-check-settings.component.d.ts.map +1 -1
- package/trusted-certificates/crl/crl-settings.component.d.ts.map +1 -1
- package/trusted-certificates/factories/tabs.factory.d.ts.map +1 -1
- package/trusted-certificates/factories/trusted-certificates-navigation.factory.d.ts.map +1 -1
- package/trusted-certificates/list/add-trusted-certificate.component.d.ts.map +1 -1
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
- package/upgrade/auth-bridge.service.d.ts.map +1 -1
- package/upgrade/bridge.service.d.ts.map +1 -1
- package/upgrade/ng1/downgraded.services.d.ts +1 -0
- package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
- package/upgrade/ng1/index.d.ts.map +1 -1
- package/user-roles/roles-asset-tree/roles-asset-tree.component.d.ts.map +1 -1
- package/widgets/cockpit/index.d.ts +4 -4
- package/widgets/definitions/alarms/alarm-list/index.d.ts +1 -1
- package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +1 -1
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/recent-alarms/index.d.ts +1 -1
- package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/applications/index.d.ts +1 -1
- package/widgets/definitions/applications/index.d.ts.map +1 -1
- package/widgets/definitions/asset-notes/index.d.ts +1 -1
- package/widgets/definitions/asset-notes/index.d.ts.map +1 -1
- package/widgets/definitions/cockpit-legacy-welcome/index.d.ts +1 -1
- package/widgets/definitions/cockpit-legacy-welcome/index.d.ts.map +1 -1
- package/widgets/definitions/cockpit-welcome/index.d.ts +1 -1
- package/widgets/definitions/cockpit-welcome/index.d.ts.map +1 -1
- package/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.d.ts.map +1 -1
- package/widgets/definitions/datapoints-graph/index.d.ts +1 -1
- package/widgets/definitions/datapoints-table/index.d.ts +1 -1
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
- package/widgets/definitions/device-control-message/index.d.ts +1 -1
- package/widgets/definitions/device-control-message/index.d.ts.map +1 -1
- package/widgets/definitions/help-and-service/index.d.ts +1 -1
- package/widgets/definitions/help-and-service/index.d.ts.map +1 -1
- package/widgets/definitions/html-widget/html-widget.factory.d.ts.map +1 -1
- package/widgets/definitions/html-widget/index.d.ts +1 -1
- package/widgets/definitions/image/index.d.ts +5 -3
- package/widgets/definitions/image/index.d.ts.map +1 -1
- package/widgets/definitions/info-gauge/index.d.ts +2 -3
- package/widgets/definitions/info-gauge/index.d.ts.map +1 -1
- package/widgets/definitions/kpi/index.d.ts +1 -1
- package/widgets/definitions/kpi/index.d.ts.map +1 -1
- package/widgets/definitions/linear-gauge/index.d.ts +1 -1
- package/widgets/definitions/linear-gauge/index.d.ts.map +1 -1
- package/widgets/definitions/map/index.d.ts +1 -1
- package/widgets/definitions/map/index.d.ts.map +1 -1
- package/widgets/definitions/markdown/index.d.ts +5 -3
- package/widgets/definitions/markdown/index.d.ts.map +1 -1
- package/widgets/definitions/quick-links/index.d.ts +1 -1
- package/widgets/definitions/quick-links/index.d.ts.map +1 -1
- package/widgets/definitions/radial-gauge/index.d.ts +1 -1
- package/widgets/definitions/radial-gauge/index.d.ts.map +1 -1
- package/widgets/definitions/silo/index.d.ts +1 -1
- package/widgets/definitions/silo/index.d.ts.map +1 -1
- package/widgets/definitions/three-d-rotation/index.d.ts +1 -1
- package/widgets/definitions/three-d-rotation/index.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/cockpit-welcome/welcome.component.d.ts +3 -2
- package/widgets/implementations/cockpit-welcome/welcome.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.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/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -1
- package/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.d.ts.map +1 -1
- package/widgets/implementations/device-management-welcome/welcome.component.d.ts.map +1 -1
- package/widgets/implementations/help-and-service-widget/help-and-service-view/help-and-service-view.component.d.ts.map +1 -1
- package/widgets/implementations/html-widget/advanced-settings/advanced-settings.component.d.ts.map +1 -1
- package/widgets/implementations/html-widget/html-widget-config.service.d.ts.map +1 -1
- package/widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.d.ts +5 -3
- package/widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.d.ts.map +1 -1
- package/widgets/implementations/image/image-widget-config/image-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/image/image-widget.service.d.ts +1 -2
- package/widgets/implementations/image/image-widget.service.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
- package/widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/markdown/markdown-widget.service.d.ts.map +1 -1
- package/widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.d.ts.map +1 -1
- package/widgets/import-export-config/config-target-export.d.ts +3 -1
- package/widgets/import-export-config/config-target-export.d.ts.map +1 -1
- package/widgets/import-export-config/config-target-import.d.ts +3 -1
- package/widgets/import-export-config/config-target-import.d.ts.map +1 -1
- package/widgets/import-export-config/device-import-export.d.ts +3 -1
- package/widgets/import-export-config/device-import-export.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs.map +0 -1
- package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs.map +0 -1
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CwfVxTSx.mjs.map +0 -1
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { gettext, AssetTypesRealtimeService, GroupService, AlertService, ListGroupModule, C8yTranslatePipe, IconDirective, EmptyStateComponent, BottomDrawerRef, FormsModule as FormsModule$1, LoadMoreComponent, BottomDrawerService } from '@c8y/ngx-components';
|
|
1
|
+
import { gettext } from '@c8y/ngx-components/gettext';
|
|
3
2
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { inject, Injectable, Directive, Pipe,
|
|
3
|
+
import { InjectionToken, inject, Injectable, Directive, Injector, runInInjectionContext, Pipe, viewChildren, ViewContainerRef, effect, reflectComponentType, Input, Component, viewChild, EventEmitter, ContentChild, Output } from '@angular/core';
|
|
5
4
|
import { InventoryService } from '@c8y/client';
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import
|
|
5
|
+
import * as i2 from '@c8y/ngx-components';
|
|
6
|
+
import { hookGeneric, ExtensionPointForPlugins, GroupService, fromTriggerOnce, getInjectedHooks, stateToFactory, AssetTypesRealtimeService, AlertService, isPromise, C8yTranslatePipe, IconDirective, ListGroupModule, EmptyStateComponent, BottomDrawerRef, FormsModule as FormsModule$1, LoadMoreComponent, TabComponent, TabsOutletComponent, BottomDrawerService } from '@c8y/ngx-components';
|
|
7
|
+
import { isArray, isObjectLike, isEmpty, find, forOwn, get, isUndefined, cloneDeep } from 'lodash-es';
|
|
8
|
+
import { firstValueFrom, mergeMap, filter, take, map, distinctUntilChanged, shareReplay, BehaviorSubject, of, from, switchMap, isObservable, Subject, takeUntil, debounceTime } from 'rxjs';
|
|
9
|
+
import * as i1 from '@angular/router';
|
|
10
|
+
import { NgFor, NgIf, NgClass, AsyncPipe, NgTemplateOutlet } from '@angular/common';
|
|
11
|
+
import * as i1$1 from '@angular/forms';
|
|
12
|
+
import { NgForm, FormsModule } from '@angular/forms';
|
|
11
13
|
import * as i3 from 'ngx-bootstrap/tooltip';
|
|
12
14
|
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
13
15
|
import * as i4 from '@angular/cdk/tree';
|
|
14
16
|
import { CdkTreeModule } from '@angular/cdk/tree';
|
|
15
17
|
import { DataSource } from '@angular/cdk/collections';
|
|
16
18
|
import { TranslateService } from '@ngx-translate/core';
|
|
17
|
-
import {
|
|
19
|
+
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
|
|
18
20
|
|
|
19
21
|
const defaultAssetPropertyListConfig = {
|
|
20
22
|
filterable: true,
|
|
@@ -31,7 +33,7 @@ const defaultAssetProperties = [
|
|
|
31
33
|
{
|
|
32
34
|
c8y_JsonSchema: { properties: { name: { type: 'string', label: 'Name' } } },
|
|
33
35
|
name: 'name',
|
|
34
|
-
label: 'Name',
|
|
36
|
+
label: gettext('Name'),
|
|
35
37
|
type: 'string',
|
|
36
38
|
active: true,
|
|
37
39
|
isEditable: true,
|
|
@@ -40,7 +42,7 @@ const defaultAssetProperties = [
|
|
|
40
42
|
{
|
|
41
43
|
c8y_JsonSchema: { properties: { id: { type: 'string', label: 'ID' } } },
|
|
42
44
|
name: 'id',
|
|
43
|
-
label: 'ID',
|
|
45
|
+
label: gettext('ID'),
|
|
44
46
|
type: 'string',
|
|
45
47
|
active: true,
|
|
46
48
|
isEditable: false,
|
|
@@ -51,7 +53,7 @@ const defaultAssetProperties = [
|
|
|
51
53
|
properties: { type: { type: 'string', label: 'Type' } }
|
|
52
54
|
},
|
|
53
55
|
name: 'type',
|
|
54
|
-
label: 'Type',
|
|
56
|
+
label: gettext('Type'),
|
|
55
57
|
type: 'string',
|
|
56
58
|
active: true,
|
|
57
59
|
isEditable: false,
|
|
@@ -62,7 +64,7 @@ const defaultAssetProperties = [
|
|
|
62
64
|
properties: { owner: { type: 'string', label: 'Owner' } }
|
|
63
65
|
},
|
|
64
66
|
name: 'owner',
|
|
65
|
-
label: 'Owner',
|
|
67
|
+
label: gettext('Owner'),
|
|
66
68
|
type: 'string',
|
|
67
69
|
isEditable: false,
|
|
68
70
|
isStandardProperty: true
|
|
@@ -72,7 +74,7 @@ const defaultAssetProperties = [
|
|
|
72
74
|
properties: { lastUpdated: { type: 'string', label: 'Last updated' } }
|
|
73
75
|
},
|
|
74
76
|
name: 'lastUpdated',
|
|
75
|
-
label: 'Last updated',
|
|
77
|
+
label: gettext('Last updated'),
|
|
76
78
|
type: 'string',
|
|
77
79
|
isEditable: false,
|
|
78
80
|
isStandardProperty: true
|
|
@@ -80,7 +82,7 @@ const defaultAssetProperties = [
|
|
|
80
82
|
];
|
|
81
83
|
const deviceAssetProperties = [
|
|
82
84
|
{
|
|
83
|
-
label: 'Active alarms status',
|
|
85
|
+
label: gettext('Active alarms status'),
|
|
84
86
|
type: 'object',
|
|
85
87
|
isEditable: false,
|
|
86
88
|
isStandardProperty: true,
|
|
@@ -114,7 +116,7 @@ const deviceAssetProperties = [
|
|
|
114
116
|
}
|
|
115
117
|
},
|
|
116
118
|
{
|
|
117
|
-
label: 'Address',
|
|
119
|
+
label: gettext('Address'),
|
|
118
120
|
type: 'object',
|
|
119
121
|
isEditable: true,
|
|
120
122
|
isStandardProperty: true,
|
|
@@ -156,7 +158,7 @@ const deviceAssetProperties = [
|
|
|
156
158
|
}
|
|
157
159
|
},
|
|
158
160
|
{
|
|
159
|
-
label: 'Agent',
|
|
161
|
+
label: gettext('Agent'),
|
|
160
162
|
type: 'object',
|
|
161
163
|
isEditable: true,
|
|
162
164
|
isStandardProperty: true,
|
|
@@ -190,7 +192,7 @@ const deviceAssetProperties = [
|
|
|
190
192
|
}
|
|
191
193
|
},
|
|
192
194
|
{
|
|
193
|
-
label: 'Availability',
|
|
195
|
+
label: gettext('Availability'),
|
|
194
196
|
type: 'object',
|
|
195
197
|
isEditable: false,
|
|
196
198
|
isStandardProperty: true,
|
|
@@ -217,7 +219,7 @@ const deviceAssetProperties = [
|
|
|
217
219
|
}
|
|
218
220
|
},
|
|
219
221
|
{
|
|
220
|
-
label: 'Connection',
|
|
222
|
+
label: gettext('Connection'),
|
|
221
223
|
type: 'object',
|
|
222
224
|
isEditable: false,
|
|
223
225
|
isStandardProperty: true,
|
|
@@ -239,7 +241,7 @@ const deviceAssetProperties = [
|
|
|
239
241
|
}
|
|
240
242
|
},
|
|
241
243
|
{
|
|
242
|
-
label: 'Communication mode',
|
|
244
|
+
label: gettext('Communication mode'),
|
|
243
245
|
type: 'object',
|
|
244
246
|
isEditable: true,
|
|
245
247
|
isStandardProperty: true,
|
|
@@ -261,7 +263,7 @@ const deviceAssetProperties = [
|
|
|
261
263
|
}
|
|
262
264
|
},
|
|
263
265
|
{
|
|
264
|
-
label: 'Firmware',
|
|
266
|
+
label: gettext('Firmware'),
|
|
265
267
|
type: 'object',
|
|
266
268
|
isEditable: false,
|
|
267
269
|
isStandardProperty: true,
|
|
@@ -295,7 +297,7 @@ const deviceAssetProperties = [
|
|
|
295
297
|
}
|
|
296
298
|
},
|
|
297
299
|
{
|
|
298
|
-
label: 'Hardware',
|
|
300
|
+
label: gettext('Hardware'),
|
|
299
301
|
type: 'object',
|
|
300
302
|
isEditable: true,
|
|
301
303
|
isStandardProperty: true,
|
|
@@ -325,7 +327,7 @@ const deviceAssetProperties = [
|
|
|
325
327
|
}
|
|
326
328
|
},
|
|
327
329
|
{
|
|
328
|
-
label: 'LPWAN device',
|
|
330
|
+
label: gettext('LPWAN device'),
|
|
329
331
|
type: 'object',
|
|
330
332
|
isEditable: false,
|
|
331
333
|
isStandardProperty: true,
|
|
@@ -347,7 +349,7 @@ const deviceAssetProperties = [
|
|
|
347
349
|
}
|
|
348
350
|
},
|
|
349
351
|
{
|
|
350
|
-
label: 'Mobile',
|
|
352
|
+
label: gettext('Mobile'),
|
|
351
353
|
type: 'object',
|
|
352
354
|
isEditable: true,
|
|
353
355
|
isStandardProperty: true,
|
|
@@ -460,7 +462,7 @@ const deviceAssetProperties = [
|
|
|
460
462
|
}
|
|
461
463
|
},
|
|
462
464
|
{
|
|
463
|
-
label: 'Position',
|
|
465
|
+
label: gettext('Position'),
|
|
464
466
|
type: 'object',
|
|
465
467
|
isEditable: true,
|
|
466
468
|
isStandardProperty: true,
|
|
@@ -490,7 +492,7 @@ const deviceAssetProperties = [
|
|
|
490
492
|
}
|
|
491
493
|
},
|
|
492
494
|
{
|
|
493
|
-
label: 'Required availability',
|
|
495
|
+
label: gettext('Required availability'),
|
|
494
496
|
type: 'object',
|
|
495
497
|
isEditable: true,
|
|
496
498
|
isStandardProperty: true,
|
|
@@ -515,7 +517,7 @@ const deviceAssetProperties = [
|
|
|
515
517
|
}
|
|
516
518
|
},
|
|
517
519
|
{
|
|
518
|
-
label: 'Software',
|
|
520
|
+
label: gettext('Software'),
|
|
519
521
|
type: 'object',
|
|
520
522
|
isEditable: false,
|
|
521
523
|
isStandardProperty: true,
|
|
@@ -545,7 +547,7 @@ const deviceAssetProperties = [
|
|
|
545
547
|
}
|
|
546
548
|
},
|
|
547
549
|
{
|
|
548
|
-
label: 'Network',
|
|
550
|
+
label: gettext('Network'),
|
|
549
551
|
type: 'object',
|
|
550
552
|
isEditable: true,
|
|
551
553
|
isStandardProperty: true,
|
|
@@ -665,6 +667,84 @@ const RESULT_TYPES = {
|
|
|
665
667
|
VALUE_UNIT_TIME: { name: 'VALUE_UNIT_TIME', value: 3, label: gettext('Value, unit and time') }
|
|
666
668
|
};
|
|
667
669
|
|
|
670
|
+
const HOOK_COMPUTED_PROPERTY = new InjectionToken('HOOK_COMPUTED_PROPERTY');
|
|
671
|
+
function hookComputedProperty(property, options) {
|
|
672
|
+
return hookGeneric(property, HOOK_COMPUTED_PROPERTY, options);
|
|
673
|
+
}
|
|
674
|
+
class ComputedPropertiesService extends ExtensionPointForPlugins {
|
|
675
|
+
constructor(rootInjector, router, plugins) {
|
|
676
|
+
super(rootInjector, plugins);
|
|
677
|
+
this.router = router;
|
|
678
|
+
this.groupService = inject(GroupService);
|
|
679
|
+
this.items$ = this.setupItemsObservable();
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Returns the current state.
|
|
683
|
+
* @readonly
|
|
684
|
+
* @returns The current set of computed properties.
|
|
685
|
+
*/
|
|
686
|
+
get state() {
|
|
687
|
+
return this.state$.value;
|
|
688
|
+
}
|
|
689
|
+
add(propertyDef) {
|
|
690
|
+
this.state.add(propertyDef);
|
|
691
|
+
this.emitNewState();
|
|
692
|
+
}
|
|
693
|
+
getByName(name) {
|
|
694
|
+
if (!name) {
|
|
695
|
+
return Promise.resolve(undefined);
|
|
696
|
+
}
|
|
697
|
+
return firstValueFrom(this.items$.pipe(mergeMap((propertyDefs) => propertyDefs), filter((propertyDef) => propertyDef.name === name), take(1)));
|
|
698
|
+
}
|
|
699
|
+
getByContext(asset) {
|
|
700
|
+
if (!asset) {
|
|
701
|
+
return Promise.resolve([]);
|
|
702
|
+
}
|
|
703
|
+
const computedPropertyContextType = this.getTypeOfContext(asset);
|
|
704
|
+
return firstValueFrom(this.items$.pipe(map((propertyDefs) => propertyDefs.filter((propertyDef) => {
|
|
705
|
+
if (!propertyDef.contextType) {
|
|
706
|
+
return true;
|
|
707
|
+
}
|
|
708
|
+
return propertyDef.contextType.includes(computedPropertyContextType);
|
|
709
|
+
}))));
|
|
710
|
+
}
|
|
711
|
+
getTypeOfContext(context) {
|
|
712
|
+
const isEvent = (item) => !('severity' in item);
|
|
713
|
+
const isAlarm = (item) => 'severity' in item;
|
|
714
|
+
if (this.groupService.isDevice(context)) {
|
|
715
|
+
return 'device';
|
|
716
|
+
}
|
|
717
|
+
else if (this.groupService.isGroup(context) &&
|
|
718
|
+
!this.groupService.isAsset(context)) {
|
|
719
|
+
return 'group';
|
|
720
|
+
}
|
|
721
|
+
else if (this.groupService.isAsset(context)) {
|
|
722
|
+
return 'asset';
|
|
723
|
+
}
|
|
724
|
+
else if (isAlarm(context)) {
|
|
725
|
+
return 'alarm';
|
|
726
|
+
}
|
|
727
|
+
else if (isEvent(context)) {
|
|
728
|
+
return 'event';
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
setupItemsObservable() {
|
|
732
|
+
return fromTriggerOnce(this.router, this.refresh$, [
|
|
733
|
+
getInjectedHooks(HOOK_COMPUTED_PROPERTY, this.injectors),
|
|
734
|
+
() => this.factories,
|
|
735
|
+
stateToFactory(this.state$)
|
|
736
|
+
]).pipe(distinctUntilChanged(), shareReplay(1));
|
|
737
|
+
}
|
|
738
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ComputedPropertiesService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
739
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ComputedPropertiesService, providedIn: 'root' }); }
|
|
740
|
+
}
|
|
741
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ComputedPropertiesService, decorators: [{
|
|
742
|
+
type: Injectable,
|
|
743
|
+
args: [{
|
|
744
|
+
providedIn: 'root'
|
|
745
|
+
}]
|
|
746
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i2.PluginsResolveService }] });
|
|
747
|
+
|
|
668
748
|
/**
|
|
669
749
|
* Service for managing asset properties.
|
|
670
750
|
*/
|
|
@@ -690,6 +770,32 @@ class AssetPropertiesService {
|
|
|
690
770
|
this.assetTypesRealtimeService = inject(AssetTypesRealtimeService);
|
|
691
771
|
this.groupService = inject(GroupService);
|
|
692
772
|
this.alert = inject(AlertService);
|
|
773
|
+
this.computedPropertiesService = inject(ComputedPropertiesService);
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Filters added properties to only include those compatible with the given asset.
|
|
777
|
+
* Currently only checks compatibility for computed properties.
|
|
778
|
+
* @param allAddedProperties All properties that have been added by the user
|
|
779
|
+
* @param asset The current asset context
|
|
780
|
+
* @returns Promise resolving to properties compatible with the asset
|
|
781
|
+
*/
|
|
782
|
+
async filterCompatibleProperties(allAddedProperties, asset) {
|
|
783
|
+
if (!asset || !allAddedProperties.length) {
|
|
784
|
+
return allAddedProperties;
|
|
785
|
+
}
|
|
786
|
+
let availableComputedPropertyNames = null;
|
|
787
|
+
const computedProperties = allAddedProperties.filter(prop => prop.computed);
|
|
788
|
+
if (computedProperties.length > 0) {
|
|
789
|
+
const availableComputedProperties = await this.computedPropertiesService.getByContext(asset);
|
|
790
|
+
availableComputedPropertyNames = new Set(availableComputedProperties.map(({ prop }) => prop.name));
|
|
791
|
+
}
|
|
792
|
+
const compatibleProperties = [];
|
|
793
|
+
for (const property of allAddedProperties) {
|
|
794
|
+
if (await this.isPropertyAvailable(property, availableComputedPropertyNames)) {
|
|
795
|
+
compatibleProperties.push(property);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
return compatibleProperties;
|
|
693
799
|
}
|
|
694
800
|
/**
|
|
695
801
|
* Retrieves properties for an asset from asset library.
|
|
@@ -785,7 +891,10 @@ class AssetPropertiesService {
|
|
|
785
891
|
});
|
|
786
892
|
const result = sortedProperties.reduce((acc, property) => {
|
|
787
893
|
property.active = false;
|
|
788
|
-
if (
|
|
894
|
+
if (property.computed) {
|
|
895
|
+
acc.computed.push(property);
|
|
896
|
+
}
|
|
897
|
+
else if (this.isComplexProperty(property)) {
|
|
789
898
|
acc.complex.push(property);
|
|
790
899
|
this.addNestedProperties(property, acc.complex, true);
|
|
791
900
|
}
|
|
@@ -793,7 +902,7 @@ class AssetPropertiesService {
|
|
|
793
902
|
acc.simple.push(property);
|
|
794
903
|
}
|
|
795
904
|
return acc;
|
|
796
|
-
}, { simple: [], complex: [] });
|
|
905
|
+
}, { computed: [], simple: [], complex: [] });
|
|
797
906
|
return result;
|
|
798
907
|
}
|
|
799
908
|
/**
|
|
@@ -805,6 +914,21 @@ class AssetPropertiesService {
|
|
|
805
914
|
return (property.c8y_JsonSchema?.properties[property.name]?.type === 'object' ||
|
|
806
915
|
property.properties !== undefined);
|
|
807
916
|
}
|
|
917
|
+
/**
|
|
918
|
+
* Checks if property is available based on provided available computed property names.
|
|
919
|
+
* @param property The property to check.
|
|
920
|
+
* @param availableComputedPropertyNames Set of available computed property names.
|
|
921
|
+
* @returns True if the property is available, false otherwise.
|
|
922
|
+
*/
|
|
923
|
+
async isPropertyAvailable(property, availableComputedPropertyNames) {
|
|
924
|
+
if (property.computed) {
|
|
925
|
+
if (!availableComputedPropertyNames) {
|
|
926
|
+
return false;
|
|
927
|
+
}
|
|
928
|
+
return availableComputedPropertyNames.has(property.name);
|
|
929
|
+
}
|
|
930
|
+
return true;
|
|
931
|
+
}
|
|
808
932
|
/**
|
|
809
933
|
* Checks if two properties match for selection purposes.
|
|
810
934
|
* @param property1 First property to compare.
|
|
@@ -819,6 +943,12 @@ class AssetPropertiesService {
|
|
|
819
943
|
return keyPath1.join('.') === keyPath2.join('.');
|
|
820
944
|
}
|
|
821
945
|
else if (!keyPath1 && !keyPath2) {
|
|
946
|
+
if (property1.computed &&
|
|
947
|
+
property2.computed &&
|
|
948
|
+
property1.instanceId &&
|
|
949
|
+
property2.instanceId) {
|
|
950
|
+
return property1.instanceId === property2.instanceId;
|
|
951
|
+
}
|
|
822
952
|
return true;
|
|
823
953
|
}
|
|
824
954
|
}
|
|
@@ -854,7 +984,8 @@ class AssetPropertiesService {
|
|
|
854
984
|
pageSize: 20,
|
|
855
985
|
revert: true,
|
|
856
986
|
query,
|
|
857
|
-
withTotalPages: true
|
|
987
|
+
withTotalPages: true,
|
|
988
|
+
withTotalElements: true
|
|
858
989
|
};
|
|
859
990
|
try {
|
|
860
991
|
const results = await this.inventoryService.list(filter);
|
|
@@ -1000,22 +1131,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
1000
1131
|
class AssetPropertyValuePipe {
|
|
1001
1132
|
constructor() {
|
|
1002
1133
|
this.assetPropertiesService = inject(AssetPropertiesService);
|
|
1134
|
+
this.computedPropertiesService = inject(ComputedPropertiesService);
|
|
1135
|
+
this.injector = inject(Injector);
|
|
1003
1136
|
}
|
|
1004
|
-
transform(property,
|
|
1137
|
+
transform(property, context) {
|
|
1138
|
+
if (property.computed) {
|
|
1139
|
+
return this.getCallbackComputedPropertyValue(property, context);
|
|
1140
|
+
}
|
|
1005
1141
|
if (!property) {
|
|
1006
|
-
return '-';
|
|
1142
|
+
return of('-');
|
|
1007
1143
|
}
|
|
1008
1144
|
let value;
|
|
1009
1145
|
if (this.assetPropertiesService.isComplexProperty(property)) {
|
|
1010
|
-
value = JSON.stringify(
|
|
1146
|
+
value = JSON.stringify(context[property.name]);
|
|
1011
1147
|
}
|
|
1012
1148
|
else if ('keyPath' in property) {
|
|
1013
|
-
value = get(
|
|
1149
|
+
value = this.formatPropertyValue(get(context, property.keyPath));
|
|
1014
1150
|
}
|
|
1015
1151
|
else {
|
|
1016
|
-
value =
|
|
1152
|
+
value = this.formatPropertyValue(context[property.name]);
|
|
1017
1153
|
}
|
|
1018
|
-
return value ?? '-';
|
|
1154
|
+
return of(value ?? '-');
|
|
1155
|
+
}
|
|
1156
|
+
formatPropertyValue(value) {
|
|
1157
|
+
if (value == null) {
|
|
1158
|
+
return null;
|
|
1159
|
+
}
|
|
1160
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
1161
|
+
}
|
|
1162
|
+
getCallbackComputedPropertyValue(property, context) {
|
|
1163
|
+
return from(this.computedPropertiesService.getByName(property.name)).pipe(switchMap(definition => {
|
|
1164
|
+
let value = '-';
|
|
1165
|
+
runInInjectionContext(definition.injector || this.injector, () => {
|
|
1166
|
+
value = definition.value({ config: property.config, context });
|
|
1167
|
+
});
|
|
1168
|
+
if (isObservable(value) || value instanceof Promise) {
|
|
1169
|
+
return value;
|
|
1170
|
+
}
|
|
1171
|
+
else {
|
|
1172
|
+
return of(value);
|
|
1173
|
+
}
|
|
1174
|
+
}));
|
|
1019
1175
|
}
|
|
1020
1176
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1021
1177
|
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyValuePipe, isStandalone: true, name: "c8yAssetPropertyValue" }); }
|
|
@@ -1033,7 +1189,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
1033
1189
|
* Maps various property types to corresponding icon names.
|
|
1034
1190
|
*/
|
|
1035
1191
|
class AssetPropertyIconPipe {
|
|
1036
|
-
transform(
|
|
1192
|
+
transform(assetProperty) {
|
|
1193
|
+
if (assetProperty.computed) {
|
|
1194
|
+
return 'bolt';
|
|
1195
|
+
}
|
|
1196
|
+
const type = assetProperty.type;
|
|
1037
1197
|
switch (type) {
|
|
1038
1198
|
case 'string':
|
|
1039
1199
|
return 'string';
|
|
@@ -1081,7 +1241,7 @@ class AssetPropertyIconTooltipPipe {
|
|
|
1081
1241
|
return '';
|
|
1082
1242
|
}
|
|
1083
1243
|
else if (property.temporary) {
|
|
1084
|
-
return this.translateService.instant(gettext
|
|
1244
|
+
return this.translateService.instant(gettext('{{assetPropertyType}}\n(temporary)'), {
|
|
1085
1245
|
assetPropertyType: property.type
|
|
1086
1246
|
});
|
|
1087
1247
|
}
|
|
@@ -1100,6 +1260,172 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
1100
1260
|
}]
|
|
1101
1261
|
}] });
|
|
1102
1262
|
|
|
1263
|
+
class ComputedPropertiesConfigComponent {
|
|
1264
|
+
constructor() {
|
|
1265
|
+
this.properties = [];
|
|
1266
|
+
this.definitions = [];
|
|
1267
|
+
this.hosts = viewChildren('host', { read: ViewContainerRef });
|
|
1268
|
+
this.configForms = viewChildren('configForm', { read: NgForm });
|
|
1269
|
+
this.propertyConfigs = [];
|
|
1270
|
+
this.result = new Promise((resolve, reject) => {
|
|
1271
|
+
this._close = resolve;
|
|
1272
|
+
this._cancel = reject;
|
|
1273
|
+
});
|
|
1274
|
+
this.injector = inject(Injector);
|
|
1275
|
+
this.bsModalRef = inject(BsModalRef);
|
|
1276
|
+
effect(async () => {
|
|
1277
|
+
const hosts = this.hosts();
|
|
1278
|
+
if (!hosts || hosts.length === 0) {
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1281
|
+
for (let i = 0; i < this.propertyConfigs.length; i++) {
|
|
1282
|
+
const propertyConfig = this.propertyConfigs[i];
|
|
1283
|
+
const host = hosts[i];
|
|
1284
|
+
if (host && propertyConfig.definition) {
|
|
1285
|
+
await this.createConfigComponent(propertyConfig, host);
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
});
|
|
1289
|
+
}
|
|
1290
|
+
ngOnInit() {
|
|
1291
|
+
this.propertyConfigs = this.properties.map((property, index) => ({
|
|
1292
|
+
property,
|
|
1293
|
+
definition: this.definitions[index],
|
|
1294
|
+
config: property.config || this.definitions[index].prop.config
|
|
1295
|
+
}));
|
|
1296
|
+
}
|
|
1297
|
+
get isFormValid() {
|
|
1298
|
+
return this.configForms().every(form => form.valid) ?? false;
|
|
1299
|
+
}
|
|
1300
|
+
async apply() {
|
|
1301
|
+
const allValid = await this.callOnBeforeSaveHooks();
|
|
1302
|
+
if (allValid) {
|
|
1303
|
+
const configs = this.propertyConfigs.map(pc => pc.config);
|
|
1304
|
+
this._close(configs);
|
|
1305
|
+
this.bsModalRef.hide();
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
cancel() {
|
|
1309
|
+
this.bsModalRef.hide();
|
|
1310
|
+
this._cancel();
|
|
1311
|
+
}
|
|
1312
|
+
async createConfigComponent(propertyConfig, host) {
|
|
1313
|
+
const component = await this.getComponent(propertyConfig.definition);
|
|
1314
|
+
host.clear();
|
|
1315
|
+
const componentRef = host.createComponent(component, {
|
|
1316
|
+
environmentInjector: this.injector
|
|
1317
|
+
});
|
|
1318
|
+
propertyConfig.componentRef = componentRef;
|
|
1319
|
+
propertyConfig.componentInstance = componentRef.instance;
|
|
1320
|
+
const componentMetadata = this.safeReflectComponentType(component);
|
|
1321
|
+
const hasConfigInput = componentMetadata?.inputs.some(input => input.propName === 'config');
|
|
1322
|
+
if (hasConfigInput) {
|
|
1323
|
+
componentRef.setInput('config', propertyConfig.config);
|
|
1324
|
+
}
|
|
1325
|
+
else {
|
|
1326
|
+
propertyConfig.componentInstance.config = propertyConfig.config;
|
|
1327
|
+
}
|
|
1328
|
+
const hasAssetInput = componentMetadata?.inputs.some(input => input.propName === 'asset');
|
|
1329
|
+
if (hasAssetInput) {
|
|
1330
|
+
componentRef.setInput('asset', this.asset);
|
|
1331
|
+
}
|
|
1332
|
+
else {
|
|
1333
|
+
propertyConfig.componentInstance.asset = this.asset;
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
safeReflectComponentType(componentType) {
|
|
1337
|
+
try {
|
|
1338
|
+
return reflectComponentType(componentType);
|
|
1339
|
+
}
|
|
1340
|
+
catch (error) {
|
|
1341
|
+
console.warn('Failed to reflect component metadata:', error);
|
|
1342
|
+
return { inputs: [] };
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
async getComponent(definition) {
|
|
1346
|
+
if (!!definition.loadConfigComponent) {
|
|
1347
|
+
return await definition.loadConfigComponent();
|
|
1348
|
+
}
|
|
1349
|
+
else if (!!definition.configComponent) {
|
|
1350
|
+
return definition.configComponent;
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
async callOnBeforeSaveHooks() {
|
|
1354
|
+
const validationObservables = this.propertyConfigs
|
|
1355
|
+
.filter(pc => pc.componentRef)
|
|
1356
|
+
.map(pc => this.callSingleOnBeforeSaveHook(pc.componentRef, pc.config));
|
|
1357
|
+
try {
|
|
1358
|
+
const validationPromises = validationObservables.map(obs => firstValueFrom(obs));
|
|
1359
|
+
const results = await Promise.all(validationPromises);
|
|
1360
|
+
return results.every(result => result === true);
|
|
1361
|
+
}
|
|
1362
|
+
catch (error) {
|
|
1363
|
+
return false;
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
callSingleOnBeforeSaveHook(componentRef, config) {
|
|
1367
|
+
if (!componentRef) {
|
|
1368
|
+
return of(true);
|
|
1369
|
+
}
|
|
1370
|
+
const hook = componentRef.instance.onBeforeSave;
|
|
1371
|
+
if (hook) {
|
|
1372
|
+
const result = hook.call(componentRef.instance, config);
|
|
1373
|
+
if (isUndefined(result)) {
|
|
1374
|
+
return of(true);
|
|
1375
|
+
}
|
|
1376
|
+
if (isPromise(result)) {
|
|
1377
|
+
return from(result);
|
|
1378
|
+
}
|
|
1379
|
+
return (isObservable(result) ? result : of(result));
|
|
1380
|
+
}
|
|
1381
|
+
return of(true);
|
|
1382
|
+
}
|
|
1383
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ComputedPropertiesConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1384
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.15", type: ComputedPropertiesConfigComponent, isStandalone: true, selector: "c8y-computed-properties-config", inputs: { properties: "properties", definitions: "definitions", asset: "asset" }, viewQueries: [{ propertyName: "hosts", predicate: ["host"], descendants: true, read: ViewContainerRef, isSignal: true }, { propertyName: "configForms", predicate: ["configForm"], descendants: true, read: NgForm, isSignal: true }], ngImport: i0, template: "<div class=\"viewport-modal has-asset-selector\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bolt'\"></i>\n <div\n class=\"modal-title\"\n id=\"modal-title\"\n translate\n >\n Configure computed properties\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <p\n class=\"p-t-16 p-l-24 p-r-24 p-b-16 bg-component separator-bottom sticky-top text-center text-balance\"\n translate\n >\n Configure the settings below for each computed property. These configurations determine how\n the properties will be calculated and displayed. All required fields must be completed before\n you can apply the changes.\n </p>\n <div class=\"p-24 p-t-0\">\n <fieldset\n class=\"property-config-section c8y-fieldset p-b-8\"\n *ngFor=\"let propertyConfig of propertyConfigs; let i = index\"\n >\n <legend>\n {{ (propertyConfig.property.label || propertyConfig.property.name) | translate }}\n <span class=\"a-s-center m-l-8 tag tag--default\">{{ propertyConfig.property.name }}</span>\n </legend>\n <form\n class=\"property-config-form\"\n name=\"configForm{{ i }}\"\n #configForm=\"ngForm\"\n >\n <ng-template #host></ng-template>\n </form>\n </fieldset>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Apply' | translate\"\n type=\"button\"\n (click)=\"apply()\"\n [disabled]=\"!isFormValid\"\n >\n {{ 'Apply' | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); }
|
|
1385
|
+
}
|
|
1386
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: ComputedPropertiesConfigComponent, decorators: [{
|
|
1387
|
+
type: Component,
|
|
1388
|
+
args: [{ selector: 'c8y-computed-properties-config', standalone: true, imports: [C8yTranslatePipe, IconDirective, FormsModule, NgFor], template: "<div class=\"viewport-modal has-asset-selector\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bolt'\"></i>\n <div\n class=\"modal-title\"\n id=\"modal-title\"\n translate\n >\n Configure computed properties\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <p\n class=\"p-t-16 p-l-24 p-r-24 p-b-16 bg-component separator-bottom sticky-top text-center text-balance\"\n translate\n >\n Configure the settings below for each computed property. These configurations determine how\n the properties will be calculated and displayed. All required fields must be completed before\n you can apply the changes.\n </p>\n <div class=\"p-24 p-t-0\">\n <fieldset\n class=\"property-config-section c8y-fieldset p-b-8\"\n *ngFor=\"let propertyConfig of propertyConfigs; let i = index\"\n >\n <legend>\n {{ (propertyConfig.property.label || propertyConfig.property.name) | translate }}\n <span class=\"a-s-center m-l-8 tag tag--default\">{{ propertyConfig.property.name }}</span>\n </legend>\n <form\n class=\"property-config-form\"\n name=\"configForm{{ i }}\"\n #configForm=\"ngForm\"\n >\n <ng-template #host></ng-template>\n </form>\n </fieldset>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n [title]=\"'Apply' | translate\"\n type=\"button\"\n (click)=\"apply()\"\n [disabled]=\"!isFormValid\"\n >\n {{ 'Apply' | translate }}\n </button>\n </div>\n</div>\n" }]
|
|
1389
|
+
}], ctorParameters: () => [], propDecorators: { properties: [{
|
|
1390
|
+
type: Input
|
|
1391
|
+
}], definitions: [{
|
|
1392
|
+
type: Input
|
|
1393
|
+
}], asset: [{
|
|
1394
|
+
type: Input
|
|
1395
|
+
}] } });
|
|
1396
|
+
|
|
1397
|
+
/**
|
|
1398
|
+
* Pipe to get the title for the collapse/expand button of a tree node.
|
|
1399
|
+
*/
|
|
1400
|
+
class AssetPropertyCollapseButtonTitlePipe {
|
|
1401
|
+
constructor() {
|
|
1402
|
+
this.collapseLabel = gettext('Collapse "{{ assetPropertyLabel }}"');
|
|
1403
|
+
this.expandLabel = gettext('Expand "{{ assetPropertyLabel }}"');
|
|
1404
|
+
this.translateService = inject(TranslateService);
|
|
1405
|
+
}
|
|
1406
|
+
transform(expanded, node) {
|
|
1407
|
+
if (!node) {
|
|
1408
|
+
return '';
|
|
1409
|
+
}
|
|
1410
|
+
else {
|
|
1411
|
+
const template = expanded ? this.collapseLabel : this.expandLabel;
|
|
1412
|
+
const assetPropertyLabel = node.property.label || node.property.title || node.property.name;
|
|
1413
|
+
return this.translateService.instant(template, {
|
|
1414
|
+
assetPropertyLabel: this.translateService.instant(assetPropertyLabel)
|
|
1415
|
+
});
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyCollapseButtonTitlePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1419
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyCollapseButtonTitlePipe, isStandalone: true, name: "c8yAssetPropertyCollapseButtonTitle" }); }
|
|
1420
|
+
}
|
|
1421
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyCollapseButtonTitlePipe, decorators: [{
|
|
1422
|
+
type: Pipe,
|
|
1423
|
+
args: [{
|
|
1424
|
+
name: 'c8yAssetPropertyCollapseButtonTitle',
|
|
1425
|
+
standalone: true
|
|
1426
|
+
}]
|
|
1427
|
+
}] });
|
|
1428
|
+
|
|
1103
1429
|
/**
|
|
1104
1430
|
* Represents a list of asset properties with hierarchical tree structure.
|
|
1105
1431
|
*/
|
|
@@ -1148,10 +1474,16 @@ class AssetPropertyListComponent {
|
|
|
1148
1474
|
* Indicates if the selection state is indeterminate.
|
|
1149
1475
|
*/
|
|
1150
1476
|
this.indeterminate = false;
|
|
1477
|
+
this.collapseAllLabel = gettext('Collapse all');
|
|
1478
|
+
this.expandAllLabel = gettext('Expand all');
|
|
1151
1479
|
/**
|
|
1152
1480
|
* List of properties that have been added temporarily as custom properties.
|
|
1153
1481
|
*/
|
|
1154
|
-
this.
|
|
1482
|
+
this.allAddedProperties = [];
|
|
1483
|
+
/**
|
|
1484
|
+
* List of properties that have been added temporarily as custom properties filtered according to context asset.
|
|
1485
|
+
*/
|
|
1486
|
+
this.displayAddedProperties = [];
|
|
1155
1487
|
/**
|
|
1156
1488
|
* Subject for handling filter input.
|
|
1157
1489
|
*/
|
|
@@ -1165,6 +1497,8 @@ class AssetPropertyListComponent {
|
|
|
1165
1497
|
*/
|
|
1166
1498
|
this.assetPropertiesService = inject(AssetPropertiesService);
|
|
1167
1499
|
this.customPropertiesDrawerService = inject(CustomPropertiesDrawerService);
|
|
1500
|
+
this.computedPropertiesService = inject(ComputedPropertiesService);
|
|
1501
|
+
this.modalService = inject(BsModalService);
|
|
1168
1502
|
effect(() => {
|
|
1169
1503
|
if ((this.config.expansionMode === 'nonCollapsible' ||
|
|
1170
1504
|
this.config.expansionMode === 'expandedByDefault') &&
|
|
@@ -1184,7 +1518,10 @@ class AssetPropertyListComponent {
|
|
|
1184
1518
|
.pipe(takeUntil(this.destroy$), debounceTime(200))
|
|
1185
1519
|
.subscribe(() => this.filterTree());
|
|
1186
1520
|
}
|
|
1187
|
-
async ngOnChanges() {
|
|
1521
|
+
async ngOnChanges(changes) {
|
|
1522
|
+
if (changes['asset'] && !changes['asset'].firstChange) {
|
|
1523
|
+
await this.updateDisplayAddedProperties();
|
|
1524
|
+
}
|
|
1188
1525
|
await this.updateProperties();
|
|
1189
1526
|
}
|
|
1190
1527
|
ngAfterViewInit() {
|
|
@@ -1218,15 +1555,94 @@ class AssetPropertyListComponent {
|
|
|
1218
1555
|
* Opens the drawer to add new custom properties.
|
|
1219
1556
|
*/
|
|
1220
1557
|
async addProperty() {
|
|
1221
|
-
const propertiesToAdd = await this.customPropertiesDrawerService.getCustomProperties();
|
|
1558
|
+
const propertiesToAdd = await this.customPropertiesDrawerService.getCustomProperties(this.asset);
|
|
1222
1559
|
if (!propertiesToAdd || propertiesToAdd.length === 0) {
|
|
1223
1560
|
return;
|
|
1224
1561
|
}
|
|
1225
|
-
|
|
1226
|
-
|
|
1562
|
+
const propertiesNeedingConfig = [];
|
|
1563
|
+
const definitionsNeedingConfig = [];
|
|
1564
|
+
const propertiesToActuallyAdd = [];
|
|
1565
|
+
for (const prop of propertiesToAdd) {
|
|
1566
|
+
if (prop.computed) {
|
|
1567
|
+
const definition = await this.computedPropertiesService.getByName(prop.name);
|
|
1568
|
+
if (definition.configComponent || definition.loadConfigComponent) {
|
|
1569
|
+
propertiesNeedingConfig.push(prop);
|
|
1570
|
+
definitionsNeedingConfig.push(definition);
|
|
1571
|
+
}
|
|
1572
|
+
else {
|
|
1573
|
+
prop.temporary = true;
|
|
1574
|
+
propertiesToActuallyAdd.push(prop);
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
else {
|
|
1578
|
+
prop.temporary = true;
|
|
1579
|
+
propertiesToActuallyAdd.push(prop);
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
if (propertiesNeedingConfig.length > 0) {
|
|
1583
|
+
try {
|
|
1584
|
+
const configs = await this.configureMultipleProperties(propertiesNeedingConfig, definitionsNeedingConfig);
|
|
1585
|
+
propertiesNeedingConfig.forEach((prop, index) => {
|
|
1586
|
+
prop.config = configs[index];
|
|
1587
|
+
prop.temporary = true;
|
|
1588
|
+
propertiesToActuallyAdd.push(prop);
|
|
1589
|
+
});
|
|
1590
|
+
}
|
|
1591
|
+
catch { }
|
|
1592
|
+
}
|
|
1593
|
+
if (propertiesToActuallyAdd.length === 0) {
|
|
1594
|
+
return;
|
|
1595
|
+
}
|
|
1596
|
+
propertiesToActuallyAdd.forEach(prop => {
|
|
1597
|
+
if (this.asset?.id) {
|
|
1598
|
+
prop.contextAssetId = this.asset.id;
|
|
1599
|
+
}
|
|
1600
|
+
// Generate instanceId for computed properties to allow multiple instances
|
|
1601
|
+
if (prop.computed && !prop.instanceId) {
|
|
1602
|
+
prop.instanceId = crypto.randomUUID();
|
|
1603
|
+
}
|
|
1604
|
+
});
|
|
1605
|
+
this.allAddedProperties = this.allAddedProperties.concat(propertiesToActuallyAdd);
|
|
1606
|
+
await this.updateDisplayAddedProperties();
|
|
1227
1607
|
await this.updateProperties();
|
|
1228
1608
|
this.selectedProperties.next(this.dataSource.data.filter(n => n.property.active).map(n => n.property));
|
|
1229
1609
|
}
|
|
1610
|
+
/**
|
|
1611
|
+
* Displays the configuration modal for multiple computed properties and updates their configurations.
|
|
1612
|
+
* @param properties Properties to configure.
|
|
1613
|
+
* @param definitions Computed property definitions including config components.
|
|
1614
|
+
* @returns Promise resolving to array of configurations.
|
|
1615
|
+
*/
|
|
1616
|
+
configureMultipleProperties(properties, definitions) {
|
|
1617
|
+
const modalRef = this.modalService.show(ComputedPropertiesConfigComponent, {
|
|
1618
|
+
ignoreBackdropClick: true,
|
|
1619
|
+
class: 'modal-lg',
|
|
1620
|
+
ariaDescribedby: 'modal-body',
|
|
1621
|
+
ariaLabelledBy: 'modal-title',
|
|
1622
|
+
initialState: {
|
|
1623
|
+
properties,
|
|
1624
|
+
definitions,
|
|
1625
|
+
asset: this.asset
|
|
1626
|
+
}
|
|
1627
|
+
}).content;
|
|
1628
|
+
return modalRef.result;
|
|
1629
|
+
}
|
|
1630
|
+
/**
|
|
1631
|
+
* Displays the configuration modal for a computed property and updates its configuration.
|
|
1632
|
+
* @param property Property to configure.
|
|
1633
|
+
* @param definition Computed property definition including config component.
|
|
1634
|
+
* @returns true if the property was configured, false if cancelled.
|
|
1635
|
+
*/
|
|
1636
|
+
async configureProperty(property, definition) {
|
|
1637
|
+
try {
|
|
1638
|
+
const configs = await this.configureMultipleProperties([property], [definition]);
|
|
1639
|
+
property.config = configs[0];
|
|
1640
|
+
return true;
|
|
1641
|
+
}
|
|
1642
|
+
catch (err) {
|
|
1643
|
+
return false;
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1230
1646
|
/**
|
|
1231
1647
|
* Removes temporary property from the list.
|
|
1232
1648
|
* @param property The property to remove.
|
|
@@ -1251,12 +1667,33 @@ class AssetPropertyListComponent {
|
|
|
1251
1667
|
// Remove only the property itself
|
|
1252
1668
|
filterFn = (p) => p !== property;
|
|
1253
1669
|
}
|
|
1254
|
-
this.
|
|
1670
|
+
this.allAddedProperties = this.allAddedProperties.filter(filterFn);
|
|
1671
|
+
this.displayAddedProperties = this.displayAddedProperties.filter(filterFn);
|
|
1255
1672
|
await this.updateProperties();
|
|
1256
1673
|
}
|
|
1674
|
+
async editProperty(property) {
|
|
1675
|
+
const definition = await this.computedPropertiesService.getByName(property.name);
|
|
1676
|
+
const configured = await this.configureProperty(property, definition);
|
|
1677
|
+
if (configured && this.asset?.id) {
|
|
1678
|
+
property.contextAssetId = this.asset.id;
|
|
1679
|
+
}
|
|
1680
|
+
await this.updateProperties();
|
|
1681
|
+
this.selectedProperties.next(this.dataSource.data.filter(n => n.property.active).map(n => n.property));
|
|
1682
|
+
}
|
|
1257
1683
|
hasChild(node) {
|
|
1258
1684
|
return node.expandable;
|
|
1259
1685
|
}
|
|
1686
|
+
/**
|
|
1687
|
+
* Checks if the property's context asset matches the current asset.
|
|
1688
|
+
* @param node The node to check.
|
|
1689
|
+
* @returns True if the context asset doesn't match the current asset.
|
|
1690
|
+
*/
|
|
1691
|
+
isContextMismatch(node) {
|
|
1692
|
+
if (!node.property.computed || !node.contextAssetId) {
|
|
1693
|
+
return false;
|
|
1694
|
+
}
|
|
1695
|
+
return this.asset?.id !== node.contextAssetId;
|
|
1696
|
+
}
|
|
1260
1697
|
/**
|
|
1261
1698
|
* Gets the level of a node.
|
|
1262
1699
|
* @param node The node to check.
|
|
@@ -1363,11 +1800,54 @@ class AssetPropertyListComponent {
|
|
|
1363
1800
|
this.filterText = '';
|
|
1364
1801
|
this.onFilter();
|
|
1365
1802
|
}
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1803
|
+
/**
|
|
1804
|
+
* Toggles expansion of all nodes - expands all if any are collapsed, otherwise collapses all.
|
|
1805
|
+
*/
|
|
1806
|
+
toggleExpandCollapseAll() {
|
|
1807
|
+
const parentNodes = this.dataSource.data.filter(node => node.expandable);
|
|
1808
|
+
const expandedNodes = parentNodes.filter(node => this.tree().isExpanded(node));
|
|
1809
|
+
if (expandedNodes.length === parentNodes.length) {
|
|
1810
|
+
this.collapseAllNodes();
|
|
1811
|
+
}
|
|
1812
|
+
else {
|
|
1813
|
+
this.expandAllNodes();
|
|
1814
|
+
}
|
|
1815
|
+
this.onNodeToggle();
|
|
1816
|
+
}
|
|
1817
|
+
onNodeToggle() {
|
|
1818
|
+
if (!this.tree())
|
|
1819
|
+
return;
|
|
1820
|
+
const parentNodes = this.dataSource.data.filter(node => node.expandable);
|
|
1821
|
+
if (parentNodes.length === 0) {
|
|
1822
|
+
this.areAllNodesExpanded = false;
|
|
1823
|
+
}
|
|
1824
|
+
this.areAllNodesExpanded = parentNodes.every(node => this.tree().isExpanded(node));
|
|
1825
|
+
}
|
|
1826
|
+
/**
|
|
1827
|
+
* Expands all nodes in the tree.
|
|
1828
|
+
*/
|
|
1829
|
+
expandAllNodes() {
|
|
1830
|
+
if (!this.tree())
|
|
1831
|
+
return;
|
|
1832
|
+
const parentNodes = this.dataSource.data.filter(node => node.expandable);
|
|
1833
|
+
parentNodes.forEach(node => {
|
|
1834
|
+
if (!this.tree().isExpanded(node)) {
|
|
1835
|
+
this.tree().expand(node);
|
|
1836
|
+
}
|
|
1837
|
+
});
|
|
1838
|
+
}
|
|
1839
|
+
/**
|
|
1840
|
+
* Collapses all nodes in the tree.
|
|
1841
|
+
*/
|
|
1842
|
+
collapseAllNodes() {
|
|
1843
|
+
if (!this.tree())
|
|
1844
|
+
return;
|
|
1845
|
+
const parentNodes = this.dataSource.data.filter(node => node.expandable);
|
|
1846
|
+
parentNodes.forEach(node => {
|
|
1847
|
+
if (this.tree().isExpanded(node)) {
|
|
1848
|
+
this.tree().collapse(node);
|
|
1849
|
+
}
|
|
1850
|
+
});
|
|
1371
1851
|
}
|
|
1372
1852
|
/**
|
|
1373
1853
|
* Updates the list of properties based on the configuration.
|
|
@@ -1375,13 +1855,13 @@ class AssetPropertyListComponent {
|
|
|
1375
1855
|
async updateProperties() {
|
|
1376
1856
|
if (this.config.inputPropertiesHandle === 'merge' || !this.config.inputPropertiesHandle) {
|
|
1377
1857
|
this.properties = [
|
|
1378
|
-
...this.
|
|
1858
|
+
...this.displayAddedProperties,
|
|
1379
1859
|
...this.extraProperties,
|
|
1380
1860
|
...(await this.getProperties())
|
|
1381
1861
|
];
|
|
1382
1862
|
}
|
|
1383
1863
|
else if (this.config.inputPropertiesHandle === 'override') {
|
|
1384
|
-
this.properties = [...this.
|
|
1864
|
+
this.properties = [...this.displayAddedProperties, ...this.extraProperties];
|
|
1385
1865
|
}
|
|
1386
1866
|
this.buildTreeNodes();
|
|
1387
1867
|
this.applySelectedPropertiesFromConfig();
|
|
@@ -1406,6 +1886,12 @@ class AssetPropertyListComponent {
|
|
|
1406
1886
|
}
|
|
1407
1887
|
});
|
|
1408
1888
|
}
|
|
1889
|
+
/**
|
|
1890
|
+
* Updates the display added properties based on compatibility with current asset.
|
|
1891
|
+
*/
|
|
1892
|
+
async updateDisplayAddedProperties() {
|
|
1893
|
+
this.displayAddedProperties = await this.assetPropertiesService.filterCompatibleProperties(this.allAddedProperties, this.asset);
|
|
1894
|
+
}
|
|
1409
1895
|
/**
|
|
1410
1896
|
* Updates the selection status of child nodes.
|
|
1411
1897
|
* @param parent The parent node.
|
|
@@ -1461,13 +1947,24 @@ class AssetPropertyListComponent {
|
|
|
1461
1947
|
const isComplex = this.assetPropertiesService.isComplexProperty(property);
|
|
1462
1948
|
const hasKeyPath = !!property.keyPath;
|
|
1463
1949
|
const level = hasKeyPath ? property.keyPath.length - 1 : 0;
|
|
1464
|
-
|
|
1950
|
+
// For computed properties with instanceId, include it in the key to allow multiple instances
|
|
1951
|
+
let key;
|
|
1952
|
+
if (hasKeyPath) {
|
|
1953
|
+
key = property.keyPath.join('.');
|
|
1954
|
+
}
|
|
1955
|
+
else if (property.computed && property.instanceId) {
|
|
1956
|
+
key = `${property.name}:${property.instanceId}`;
|
|
1957
|
+
}
|
|
1958
|
+
else {
|
|
1959
|
+
key = property.name;
|
|
1960
|
+
}
|
|
1465
1961
|
const node = {
|
|
1466
1962
|
expandable: isComplex,
|
|
1467
1963
|
level,
|
|
1468
1964
|
property,
|
|
1469
1965
|
isVisible: true,
|
|
1470
|
-
indeterminate: false // add indeterminate property
|
|
1966
|
+
indeterminate: false, // add indeterminate property
|
|
1967
|
+
contextAssetId: property.contextAssetId
|
|
1471
1968
|
};
|
|
1472
1969
|
this.flatNodeMap.set(key, node);
|
|
1473
1970
|
treeData.push(node);
|
|
@@ -1475,10 +1972,12 @@ class AssetPropertyListComponent {
|
|
|
1475
1972
|
this.dataSource.data = treeData;
|
|
1476
1973
|
this.filterTree();
|
|
1477
1974
|
this.updateSelectAllState();
|
|
1975
|
+
this.hasExpandableNodes = this.dataSource.data.some(node => node.expandable);
|
|
1478
1976
|
if (this.config.expansionMode === 'nonCollapsible' ||
|
|
1479
1977
|
this.config.expansionMode === 'expandedByDefault') {
|
|
1480
1978
|
queueMicrotask(() => {
|
|
1481
1979
|
this.expandAllNodes();
|
|
1980
|
+
this.onNodeToggle();
|
|
1482
1981
|
});
|
|
1483
1982
|
}
|
|
1484
1983
|
}
|
|
@@ -1517,19 +2016,6 @@ class AssetPropertyListComponent {
|
|
|
1517
2016
|
}
|
|
1518
2017
|
});
|
|
1519
2018
|
}
|
|
1520
|
-
/**
|
|
1521
|
-
* Expands all nodes in the tree.
|
|
1522
|
-
*/
|
|
1523
|
-
expandAllNodes() {
|
|
1524
|
-
if (!this.tree())
|
|
1525
|
-
return;
|
|
1526
|
-
const parentNodes = this.dataSource.data.filter(node => node.expandable);
|
|
1527
|
-
parentNodes.forEach(node => {
|
|
1528
|
-
if (!this.tree().isExpanded(node)) {
|
|
1529
|
-
this.tree().expand(node);
|
|
1530
|
-
}
|
|
1531
|
-
});
|
|
1532
|
-
}
|
|
1533
2019
|
/**
|
|
1534
2020
|
* Filters the tree nodes based on the filter input.
|
|
1535
2021
|
*/
|
|
@@ -1607,25 +2093,18 @@ class AssetPropertyListComponent {
|
|
|
1607
2093
|
* @returns The flattened list of properties.
|
|
1608
2094
|
*/
|
|
1609
2095
|
categorizeAndFlattenHierarchicalProperties(properties) {
|
|
1610
|
-
const { simple, complex } = this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);
|
|
1611
|
-
return [...simple, ...complex];
|
|
1612
|
-
}
|
|
1613
|
-
/**
|
|
1614
|
-
* Fix syntax error in the file.
|
|
1615
|
-
*/
|
|
1616
|
-
fixSyntaxError() {
|
|
1617
|
-
if (true) {
|
|
1618
|
-
// Correct syntax
|
|
1619
|
-
}
|
|
2096
|
+
const { computed, simple, complex } = this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);
|
|
2097
|
+
return [...computed, ...simple, ...complex];
|
|
1620
2098
|
}
|
|
1621
2099
|
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" }] }); }
|
|
2100
|
+
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 d-flex a-i-center\"\n [ngClass]=\"{\n 'p-l-40': !hasExpandableNodes && config.expansionMode !== 'nonCollapsible',\n 'p-r-16': config.selectMode === 'none',\n 'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n }\"\n >\n <ng-container *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasExpandableNodes\">\n @let collapseAllButtonTitle =\n (areAllNodesExpanded ? collapseAllLabel : expandAllLabel) | translate;\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [title]=\"collapseAllButtonTitle\"\n [attr.aria-label]=\"collapseAllButtonTitle\"\n type=\"button\"\n [ngClass]=\"{ active: areAllNodesExpanded }\"\n (click)=\"toggleExpandCollapseAll()\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n </ng-container>\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-t-40\"\n [ngClass]=\"{ 'p-l-24': config.selectMode === 'single' }\"\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 asset-property-list__actions\"\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 class=\"c8y-list__item--dense\"\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 <ng-container *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasChild(node)\">\n @let collapseButtonTitle =\n tree.isExpanded(node) | c8yAssetPropertyCollapseButtonTitle: node;\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [title]=\"collapseButtonTitle\"\n [attr.aria-label]=\"collapseButtonTitle\"\n [attr.aria-expanded]=\"tree.isExpanded(node)\"\n type=\"button\"\n cdkTreeNodeToggle\n (click)=\"onNodeToggle()\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n </ng-container>\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 min-width-0\">\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' }}% - {{\n (getLevel(node) + 1) * 24\n }}px + {{ getLevel(node) * 12 }}px)\"\n >\n <c8y-li-icon\n class=\"p-r-4\"\n [icon]=\"node.property | 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 d-flex a-i-center\">\n @if (isContextMismatch(node)) {\n @let tooltipText =\n 'Property configured for a different asset. Reconfigure to match current asset.'\n | translate;\n <button\n class=\"btn-clean m-r-4\"\n [attr.aria-label]=\"tooltipText\"\n [tooltip]=\"tooltipText\"\n placement=\"top\"\n type=\"button\"\n [container]=\"'body'\"\n >\n <i\n class=\"status critical stroked-icon\"\n c8yIcon=\"exclamation-circle\"\n ></i>\n </button>\n }\n\n <div\n class=\"text-truncate\"\n title=\"{{\n node.property.label || node.property.title || node.property.name | translate\n }}\"\n [ngClass]=\"{\n 'text-muted': node.property.temporary,\n 'text-danger': isContextMismatch(node)\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 @let value = node.property | c8yAssetPropertyValue: asset | async;\n <span\n class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n title=\"{{ value }}\"\n >\n {{ value }}\n </span>\n </div>\n </div>\n <div\n class=\"m-l-8 showOnHover d-flex a-i-center j-c-end asset-property-list__actions\"\n *ngIf=\"assetPropertyAction || node.property.temporary\"\n [ngClass]=\"{\n 'p-l-32': !node.property.temporary,\n 'has-computed': node.property.computed && node.property.config\n }\"\n >\n <button\n class=\"btn btn-dot m-l-auto\"\n title=\"{{ 'Configure' | translate }}\"\n *ngIf=\"node.property.computed && node.property.config\"\n (click)=\"editProperty(node.property)\"\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"{{ 'Remove' | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ 'm-l-auto': !node.property.computed || !node.property.config }\"\n *ngIf=\"node.property.temporary\"\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-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: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.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" }, { kind: "pipe", type: AssetPropertyCollapseButtonTitlePipe, name: "c8yAssetPropertyCollapseButtonTitle" }] }); }
|
|
1623
2101
|
}
|
|
1624
2102
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: AssetPropertyListComponent, decorators: [{
|
|
1625
2103
|
type: Component,
|
|
1626
2104
|
args: [{ selector: 'c8y-asset-property-list', standalone: true, imports: [
|
|
1627
2105
|
NgIf,
|
|
1628
2106
|
NgClass,
|
|
2107
|
+
AsyncPipe,
|
|
1629
2108
|
FormsModule,
|
|
1630
2109
|
ListGroupModule,
|
|
1631
2110
|
C8yTranslatePipe,
|
|
@@ -1637,8 +2116,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
1637
2116
|
EmptyStateComponent,
|
|
1638
2117
|
AssetPropertyIconPipe,
|
|
1639
2118
|
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" }]
|
|
2119
|
+
AssetPropertyIconTooltipPipe,
|
|
2120
|
+
AssetPropertyCollapseButtonTitlePipe
|
|
2121
|
+
], 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 d-flex a-i-center\"\n [ngClass]=\"{\n 'p-l-40': !hasExpandableNodes && config.expansionMode !== 'nonCollapsible',\n 'p-r-16': config.selectMode === 'none',\n 'p-r-8': config.selectMode !== 'none' && config.expansionMode === 'nonCollapsible'\n }\"\n >\n <ng-container *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasExpandableNodes\">\n @let collapseAllButtonTitle =\n (areAllNodesExpanded ? collapseAllLabel : expandAllLabel) | translate;\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [title]=\"collapseAllButtonTitle\"\n [attr.aria-label]=\"collapseAllButtonTitle\"\n type=\"button\"\n [ngClass]=\"{ active: areAllNodesExpanded }\"\n (click)=\"toggleExpandCollapseAll()\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n </ng-container>\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-t-40\"\n [ngClass]=\"{ 'p-l-24': config.selectMode === 'single' }\"\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 asset-property-list__actions\"\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 class=\"c8y-list__item--dense\"\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 <ng-container *ngIf=\"config.expansionMode !== 'nonCollapsible' && hasChild(node)\">\n @let collapseButtonTitle =\n tree.isExpanded(node) | c8yAssetPropertyCollapseButtonTitle: node;\n <button\n class=\"collapse-btn btn-dot flex-no-shrink\"\n [title]=\"collapseButtonTitle\"\n [attr.aria-label]=\"collapseButtonTitle\"\n [attr.aria-expanded]=\"tree.isExpanded(node)\"\n type=\"button\"\n cdkTreeNodeToggle\n (click)=\"onNodeToggle()\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n </ng-container>\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 min-width-0\">\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' }}% - {{\n (getLevel(node) + 1) * 24\n }}px + {{ getLevel(node) * 12 }}px)\"\n >\n <c8y-li-icon\n class=\"p-r-4\"\n [icon]=\"node.property | 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 d-flex a-i-center\">\n @if (isContextMismatch(node)) {\n @let tooltipText =\n 'Property configured for a different asset. Reconfigure to match current asset.'\n | translate;\n <button\n class=\"btn-clean m-r-4\"\n [attr.aria-label]=\"tooltipText\"\n [tooltip]=\"tooltipText\"\n placement=\"top\"\n type=\"button\"\n [container]=\"'body'\"\n >\n <i\n class=\"status critical stroked-icon\"\n c8yIcon=\"exclamation-circle\"\n ></i>\n </button>\n }\n\n <div\n class=\"text-truncate\"\n title=\"{{\n node.property.label || node.property.title || node.property.name | translate\n }}\"\n [ngClass]=\"{\n 'text-muted': node.property.temporary,\n 'text-danger': isContextMismatch(node)\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 @let value = node.property | c8yAssetPropertyValue: asset | async;\n <span\n class=\"tag tag--info d-inline-block a-s-center text-truncate\"\n title=\"{{ value }}\"\n >\n {{ value }}\n </span>\n </div>\n </div>\n <div\n class=\"m-l-8 showOnHover d-flex a-i-center j-c-end asset-property-list__actions\"\n *ngIf=\"assetPropertyAction || node.property.temporary\"\n [ngClass]=\"{\n 'p-l-32': !node.property.temporary,\n 'has-computed': node.property.computed && node.property.config\n }\"\n >\n <button\n class=\"btn btn-dot m-l-auto\"\n title=\"{{ 'Configure' | translate }}\"\n *ngIf=\"node.property.computed && node.property.config\"\n (click)=\"editProperty(node.property)\"\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n tooltip=\"{{ 'Remove' | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ 'm-l-auto': !node.property.computed || !node.property.config }\"\n *ngIf=\"node.property.temporary\"\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-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" }]
|
|
1642
2122
|
}], ctorParameters: () => [], propDecorators: { config: [{
|
|
1643
2123
|
type: Input
|
|
1644
2124
|
}], asset: [{
|
|
@@ -1673,10 +2153,6 @@ class CustomPropertiesDrawerComponent {
|
|
|
1673
2153
|
allowAddingCustomProperties: false,
|
|
1674
2154
|
inputPropertiesHandle: 'override'
|
|
1675
2155
|
};
|
|
1676
|
-
/**
|
|
1677
|
-
* Extra properties to be displayed in the list.
|
|
1678
|
-
*/
|
|
1679
|
-
this.extraProperties = [];
|
|
1680
2156
|
/**
|
|
1681
2157
|
* Emits the selected properties when saved.
|
|
1682
2158
|
*/
|
|
@@ -1701,19 +2177,28 @@ class CustomPropertiesDrawerComponent {
|
|
|
1701
2177
|
this._cancel = reject;
|
|
1702
2178
|
});
|
|
1703
2179
|
this.tabNames = {
|
|
1704
|
-
regular: gettext('
|
|
1705
|
-
computed: gettext('Computed
|
|
2180
|
+
regular: gettext('Properties'),
|
|
2181
|
+
computed: gettext('Computed properties')
|
|
1706
2182
|
};
|
|
1707
2183
|
this.inputText = '';
|
|
1708
2184
|
this.selectedTab = 'regular';
|
|
2185
|
+
this.regularProperties = [];
|
|
2186
|
+
this.computedProperties = [];
|
|
2187
|
+
this.displayedProperties = [];
|
|
2188
|
+
this.regularCount = 0;
|
|
2189
|
+
this.computedCount = 0;
|
|
2190
|
+
this.allComputedProperties = [];
|
|
1709
2191
|
this.searchSubject$ = new BehaviorSubject('');
|
|
1710
2192
|
/**
|
|
1711
2193
|
* Subject for handling component destruction.
|
|
1712
2194
|
*/
|
|
1713
2195
|
this.destroy$ = new Subject();
|
|
1714
2196
|
this.assetPropertiesService = inject(AssetPropertiesService);
|
|
2197
|
+
this.computedPropertiesService = inject(ComputedPropertiesService);
|
|
1715
2198
|
}
|
|
1716
2199
|
async ngOnInit() {
|
|
2200
|
+
const computedPropsResult = await this.computedPropertiesService.getByContext(this.asset);
|
|
2201
|
+
this.allComputedProperties = computedPropsResult.map(({ prop }) => prop);
|
|
1717
2202
|
await this.updateProperties();
|
|
1718
2203
|
this.searchSubject$
|
|
1719
2204
|
.pipe(takeUntil(this.destroy$), debounceTime(350))
|
|
@@ -1732,6 +2217,7 @@ class CustomPropertiesDrawerComponent {
|
|
|
1732
2217
|
}
|
|
1733
2218
|
onTabChange(tabName) {
|
|
1734
2219
|
this.selectedTab = tabName;
|
|
2220
|
+
this.updateDisplayedProperties();
|
|
1735
2221
|
}
|
|
1736
2222
|
onSearch() {
|
|
1737
2223
|
this.searchSubject$.next(this.inputText);
|
|
@@ -1755,6 +2241,9 @@ class CustomPropertiesDrawerComponent {
|
|
|
1755
2241
|
this.bottomDrawerRef.close();
|
|
1756
2242
|
}
|
|
1757
2243
|
async loadMore() {
|
|
2244
|
+
if (this.selectedTab !== 'regular' || !this.paging) {
|
|
2245
|
+
return;
|
|
2246
|
+
}
|
|
1758
2247
|
const res = await this.paging.next();
|
|
1759
2248
|
this.paging = res.paging;
|
|
1760
2249
|
const propertiesFromLibrary = [];
|
|
@@ -1767,7 +2256,12 @@ class CustomPropertiesDrawerComponent {
|
|
|
1767
2256
|
type: prop.c8y_JsonSchema.type
|
|
1768
2257
|
});
|
|
1769
2258
|
});
|
|
1770
|
-
|
|
2259
|
+
const categorizedNewProps = this.categorizeAndFlattenHierarchicalProperties(propertiesFromLibrary);
|
|
2260
|
+
const newRegularProps = categorizedNewProps.filter(prop => !prop.computed);
|
|
2261
|
+
this.regularProperties = [...this.regularProperties, ...newRegularProps];
|
|
2262
|
+
if (this.selectedTab === 'regular') {
|
|
2263
|
+
this.displayedProperties = this.regularProperties;
|
|
2264
|
+
}
|
|
1771
2265
|
}
|
|
1772
2266
|
/**
|
|
1773
2267
|
* Checks if the select button should be disabled.
|
|
@@ -1779,10 +2273,22 @@ class CustomPropertiesDrawerComponent {
|
|
|
1779
2273
|
async updateProperties() {
|
|
1780
2274
|
const { propertiesFromLibrary, paging } = await this.assetPropertiesService.getPropertiesFromPropertiesLibrary(this.inputText);
|
|
1781
2275
|
this.paging = paging;
|
|
1782
|
-
this.
|
|
2276
|
+
const filteredComputedProperties = this.allComputedProperties.filter(prop => prop.label.toLowerCase().includes(this.inputText?.trim().toLowerCase() || ''));
|
|
2277
|
+
const filteredDefaultProperties = defaultAssetProperties.filter(prop => prop.label.toLowerCase().includes(this.inputText?.trim().toLowerCase() || ''));
|
|
2278
|
+
const allProperties = this.categorizeAndFlattenHierarchicalProperties([
|
|
2279
|
+
...filteredComputedProperties,
|
|
1783
2280
|
...propertiesFromLibrary,
|
|
1784
|
-
...
|
|
2281
|
+
...filteredDefaultProperties
|
|
1785
2282
|
]);
|
|
2283
|
+
this.regularProperties = allProperties.filter(prop => !prop.computed);
|
|
2284
|
+
this.computedProperties = allProperties.filter(prop => prop.computed);
|
|
2285
|
+
this.regularCount = (paging.totalElements || 0) + filteredDefaultProperties.length;
|
|
2286
|
+
this.computedCount = filteredComputedProperties.length;
|
|
2287
|
+
this.updateDisplayedProperties();
|
|
2288
|
+
}
|
|
2289
|
+
updateDisplayedProperties() {
|
|
2290
|
+
this.displayedProperties =
|
|
2291
|
+
this.selectedTab === 'regular' ? this.regularProperties : this.computedProperties;
|
|
1786
2292
|
}
|
|
1787
2293
|
/**
|
|
1788
2294
|
* Categorizes and flattens hierarchical properties.
|
|
@@ -1790,11 +2296,11 @@ class CustomPropertiesDrawerComponent {
|
|
|
1790
2296
|
* @returns The flattened list of properties.
|
|
1791
2297
|
*/
|
|
1792
2298
|
categorizeAndFlattenHierarchicalProperties(properties) {
|
|
1793
|
-
const { simple, complex } = this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);
|
|
1794
|
-
return [...simple, ...complex];
|
|
2299
|
+
const { computed, simple, complex } = this.assetPropertiesService.categorizeAndFlattenHierarchicalProperties(properties);
|
|
2300
|
+
return [...computed, ...simple, ...complex];
|
|
1795
2301
|
}
|
|
1796
2302
|
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
|
|
2303
|
+
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 class=\"input-group input-group-search\">\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<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 [isActive]=\"selectedTab === 'regular'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [priority]=\"1000\"\n (onSelect)=\"onTabChange('regular')\"\n>\n <i [c8yIcon]=\"'c8y-css'\"></i>\n <span>\n {{ tabNames.regular | translate }}\n <span aria-live=\"assertive\" class=\"m-l-4 badge badge-default flex-no-shrink\">\n {{ regularCount }}\n </span>\n </span>\n</c8y-tab>\n\n<c8y-tab\n [isActive]=\"selectedTab === 'computed'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [priority]=\"900\"\n (onSelect)=\"onTabChange('computed')\"\n>\n <i [c8yIcon]=\"'bolt'\"></i>\n <span>\n {{ tabNames.computed | translate }}\n <span class=\"m-l-4 badge badge-default flex-no-shrink\" aria-live=\"assertive\">\n {{ computedCount }}\n </span>\n </span>\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]=\"displayedProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n <c8y-load-more\n *ngIf=\"selectedTab === 'regular'\"\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$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.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"] }, { kind: "component", type: TabComponent, selector: "c8y-tab", inputs: ["path", "label", "icon", "priority", "orientation", "injector", "tabsOutlet", "isActive", "showAlways"], outputs: ["onSelect"] }, { kind: "component", type: TabsOutletComponent, selector: "c8y-tabs-outlet,c8y-ui-tabs", inputs: ["tabs", "orientation", "navigatorOpen", "outletName", "context", "openFirstTab", "hasHeader"] }] }); }
|
|
1798
2304
|
}
|
|
1799
2305
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomPropertiesDrawerComponent, decorators: [{
|
|
1800
2306
|
type: Component,
|
|
@@ -1806,8 +2312,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
1806
2312
|
AssetPropertyListComponent,
|
|
1807
2313
|
LoadMoreComponent,
|
|
1808
2314
|
IconDirective,
|
|
1809
|
-
NgIf
|
|
1810
|
-
|
|
2315
|
+
NgIf,
|
|
2316
|
+
TabComponent,
|
|
2317
|
+
TabsOutletComponent
|
|
2318
|
+
], 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 class=\"input-group input-group-search\">\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<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 [isActive]=\"selectedTab === 'regular'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [priority]=\"1000\"\n (onSelect)=\"onTabChange('regular')\"\n>\n <i [c8yIcon]=\"'c8y-css'\"></i>\n <span>\n {{ tabNames.regular | translate }}\n <span aria-live=\"assertive\" class=\"m-l-4 badge badge-default flex-no-shrink\">\n {{ regularCount }}\n </span>\n </span>\n</c8y-tab>\n\n<c8y-tab\n [isActive]=\"selectedTab === 'computed'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [priority]=\"900\"\n (onSelect)=\"onTabChange('computed')\"\n>\n <i [c8yIcon]=\"'bolt'\"></i>\n <span>\n {{ tabNames.computed | translate }}\n <span class=\"m-l-4 badge badge-default flex-no-shrink\" aria-live=\"assertive\">\n {{ computedCount }}\n </span>\n </span>\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]=\"displayedProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n <c8y-load-more\n *ngIf=\"selectedTab === 'regular'\"\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
2319
|
}], propDecorators: { title: [{
|
|
1812
2320
|
type: Input
|
|
1813
2321
|
}], savePropertySelection: [{
|
|
@@ -1823,9 +2331,12 @@ class CustomPropertiesDrawerService {
|
|
|
1823
2331
|
constructor() {
|
|
1824
2332
|
this.bottomDrawerService = inject(BottomDrawerService);
|
|
1825
2333
|
}
|
|
1826
|
-
async getCustomProperties() {
|
|
2334
|
+
async getCustomProperties(asset) {
|
|
1827
2335
|
const drawer = this.bottomDrawerService.openDrawer(CustomPropertiesDrawerComponent, {
|
|
1828
|
-
disableClickOutside: true
|
|
2336
|
+
disableClickOutside: true,
|
|
2337
|
+
initialState: {
|
|
2338
|
+
asset
|
|
2339
|
+
}
|
|
1829
2340
|
});
|
|
1830
2341
|
try {
|
|
1831
2342
|
const resultOf = await drawer.instance.result;
|
|
@@ -1930,5 +2441,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
1930
2441
|
* Generated bundle index. Do not edit.
|
|
1931
2442
|
*/
|
|
1932
2443
|
|
|
1933
|
-
export { AssetPropertiesService, AssetPropertyActionDirective, AssetPropertyListComponent, AssetPropertySelectorDrawerComponent, CustomPropertiesDrawerService, RESULT_TYPES, defaultAssetProperties, defaultAssetPropertyListConfig, deviceAssetProperties };
|
|
2444
|
+
export { AssetPropertiesService, AssetPropertyActionDirective, AssetPropertyListComponent, AssetPropertySelectorDrawerComponent, ComputedPropertiesService, CustomPropertiesDrawerService, HOOK_COMPUTED_PROPERTY, RESULT_TYPES, defaultAssetProperties, defaultAssetPropertyListConfig, deviceAssetProperties, hookComputedProperty };
|
|
1934
2445
|
//# sourceMappingURL=c8y-ngx-components-asset-properties.mjs.map
|