@c8y/ngx-components 1022.35.1 → 1022.44.3

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.
Files changed (920) hide show
  1. package/actility-device-registration/actility-device-registration.component.d.ts.map +1 -1
  2. package/actility-device-registration/actility-device-registration.service.d.ts.map +1 -1
  3. package/alarms/alarm-details.component.d.ts.map +1 -1
  4. package/alarms/alarm-info.component.d.ts.map +1 -1
  5. package/alarms/alarm-severity-to-icon-class.pipe.d.ts +9 -0
  6. package/alarms/alarm-severity-to-icon-class.pipe.d.ts.map +1 -0
  7. package/alarms/alarms-icon.component.d.ts.map +1 -1
  8. package/alarms/alarms-interval-refresh.component.d.ts.map +1 -1
  9. package/alarms/alarms-list.component.d.ts.map +1 -1
  10. package/alarms/alarms-view.service.d.ts.map +1 -1
  11. package/alarms/alarms.component.d.ts.map +1 -1
  12. package/alarms/alarms.helper.d.ts.map +1 -1
  13. package/alarms/alarms.model.d.ts.map +1 -1
  14. package/alarms/cockpit/index.d.ts.map +1 -1
  15. package/alarms/devicemanagement/index.d.ts.map +1 -1
  16. package/alarms/index.d.ts +1 -0
  17. package/alarms/index.d.ts.map +1 -1
  18. package/asset-properties/asset-properties.model.d.ts +77 -1
  19. package/asset-properties/asset-properties.model.d.ts.map +1 -1
  20. package/asset-properties/asset-properties.service.d.ts +17 -0
  21. package/asset-properties/asset-properties.service.d.ts.map +1 -1
  22. package/asset-properties/asset-property-list/asset-property-collapse-button-title.pipe.d.ts +14 -0
  23. package/asset-properties/asset-property-list/asset-property-collapse-button-title.pipe.d.ts.map +1 -0
  24. package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts +2 -1
  25. package/asset-properties/asset-property-list/asset-property-icon.pipe.d.ts.map +1 -1
  26. package/asset-properties/asset-property-list/asset-property-list.component.d.ts +52 -13
  27. package/asset-properties/asset-property-list/asset-property-list.component.d.ts.map +1 -1
  28. package/asset-properties/asset-property-list/asset-property-value.pipe.d.ts +7 -3
  29. package/asset-properties/asset-property-list/asset-property-value.pipe.d.ts.map +1 -1
  30. package/asset-properties/asset-property-list/tree-data-source.d.ts +1 -0
  31. package/asset-properties/asset-property-list/tree-data-source.d.ts.map +1 -1
  32. package/asset-properties/asset-property-selector-drawer/asset-property-selector-drawer.component.d.ts.map +1 -1
  33. package/asset-properties/computed-properties-config/computed-properties-config.component.d.ts +39 -0
  34. package/asset-properties/computed-properties-config/computed-properties-config.component.d.ts.map +1 -0
  35. package/asset-properties/computed-properties.service.d.ts +27 -0
  36. package/asset-properties/computed-properties.service.d.ts.map +1 -0
  37. package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts +11 -6
  38. package/asset-properties/custom-properties-drawer/custom-properties-drawer.component.d.ts.map +1 -1
  39. package/asset-properties/custom-properties-drawer.service.d.ts +2 -1
  40. package/asset-properties/custom-properties-drawer.service.d.ts.map +1 -1
  41. package/asset-properties/index.d.ts +1 -0
  42. package/asset-properties/index.d.ts.map +1 -1
  43. package/assets-navigator/asset-node.d.ts.map +1 -1
  44. package/assets-navigator/asset-node.service.d.ts.map +1 -1
  45. package/assets-navigator/asset-selector/asset-selector-node.component.d.ts.map +1 -1
  46. package/assets-navigator/asset-selector/asset-selector.model.d.ts +1 -2
  47. package/assets-navigator/asset-selector/asset-selector.model.d.ts.map +1 -1
  48. package/assets-navigator/asset-selector/miller-view.component.d.ts +17 -5
  49. package/assets-navigator/asset-selector/miller-view.component.d.ts.map +1 -1
  50. package/assets-navigator/asset-selector/unassigned-devices-node.d.ts.map +1 -1
  51. package/assets-navigator/load-more-node.d.ts.map +1 -1
  52. package/auth-configuration/basic-settings/login-settings.component.d.ts.map +1 -1
  53. package/auth-configuration/basic-settings/session-configuration.component.d.ts.map +1 -1
  54. package/auth-configuration/factories/navigation.factory.d.ts.map +1 -1
  55. package/auth-configuration/factories/tabs.factory.d.ts.map +1 -1
  56. package/auth-configuration/sso-configuration/sso-configuration.component.d.ts.map +1 -1
  57. package/auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.d.ts.map +1 -1
  58. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts.map +1 -1
  59. package/auth-configuration/sso-configuration/template-parts/user-data-mapping.component.d.ts.map +1 -1
  60. package/binary-file-download/binary-file-download.service.d.ts.map +1 -1
  61. package/bookmarks/bookmarks.component.d.ts.map +1 -1
  62. package/bookmarks/bookmarks.service.d.ts.map +1 -1
  63. package/bookmarks/edit-bookmarks/edit-bookmarks.component.d.ts.map +1 -1
  64. package/branding/dark-theme/dark-theme-tab.factory.d.ts.map +1 -1
  65. package/branding/extra-css-branding-editor/extra-css-branding-editor-tab.factory.d.ts.map +1 -1
  66. package/branding/plain-branding-editor/plain-branding-editor-tab.factory.d.ts.map +1 -1
  67. package/branding/shared/lazy/branding-form/branding-form.component.d.ts.map +1 -1
  68. package/branding/shared/lazy/branding-import-modal/branding-import-modal.component.d.ts.map +1 -1
  69. package/branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.d.ts.map +1 -1
  70. package/cockpit-config/cockpit-config.guard.d.ts.map +1 -1
  71. package/cockpit-config/cockpit-configuration.component.d.ts.map +1 -1
  72. package/computed-asset-properties/alarm-count/alarm-count-3-months-computed-property.d.ts +8 -0
  73. package/computed-asset-properties/alarm-count/alarm-count-3-months-computed-property.d.ts.map +1 -0
  74. package/computed-asset-properties/alarm-count/alarm-count-config.component.d.ts +26 -0
  75. package/computed-asset-properties/alarm-count/alarm-count-config.component.d.ts.map +1 -0
  76. package/computed-asset-properties/alarm-count/alarm-count-today-computed-property.d.ts +8 -0
  77. package/computed-asset-properties/alarm-count/alarm-count-today-computed-property.d.ts.map +1 -0
  78. package/computed-asset-properties/alarm-count/alarm-count-value.d.ts +17 -0
  79. package/computed-asset-properties/alarm-count/alarm-count-value.d.ts.map +1 -0
  80. package/computed-asset-properties/alarm-count/alarm-count.model.d.ts +6 -0
  81. package/computed-asset-properties/alarm-count/alarm-count.model.d.ts.map +1 -0
  82. package/computed-asset-properties/c8y-ngx-components-computed-asset-properties.d.ts.map +1 -0
  83. package/computed-asset-properties/child-count/child-assets-count-computed-property.d.ts +14 -0
  84. package/computed-asset-properties/child-count/child-assets-count-computed-property.d.ts.map +1 -0
  85. package/computed-asset-properties/child-count/child-count-value.d.ts +14 -0
  86. package/computed-asset-properties/child-count/child-count-value.d.ts.map +1 -0
  87. package/computed-asset-properties/child-count/child-devices-count-computed-property.d.ts +14 -0
  88. package/computed-asset-properties/child-count/child-devices-count-computed-property.d.ts.map +1 -0
  89. package/computed-asset-properties/common/realtime-value-base.d.ts +32 -0
  90. package/computed-asset-properties/common/realtime-value-base.d.ts.map +1 -0
  91. package/computed-asset-properties/common/realtime-value-handler.d.ts +19 -0
  92. package/computed-asset-properties/common/realtime-value-handler.d.ts.map +1 -0
  93. package/computed-asset-properties/configuration-snapshot/configuration-snapshot-computed-property.d.ts +7 -0
  94. package/computed-asset-properties/configuration-snapshot/configuration-snapshot-computed-property.d.ts.map +1 -0
  95. package/computed-asset-properties/configuration-snapshot/configuration-snapshot-config.component.d.ts +21 -0
  96. package/computed-asset-properties/configuration-snapshot/configuration-snapshot-config.component.d.ts.map +1 -0
  97. package/computed-asset-properties/configuration-snapshot/configuration-snapshot.model.d.ts +8 -0
  98. package/computed-asset-properties/configuration-snapshot/configuration-snapshot.model.d.ts.map +1 -0
  99. package/computed-asset-properties/event-count/event-count-3-months.d.ts +8 -0
  100. package/computed-asset-properties/event-count/event-count-3-months.d.ts.map +1 -0
  101. package/computed-asset-properties/event-count/event-count-config.component.d.ts +18 -0
  102. package/computed-asset-properties/event-count/event-count-config.component.d.ts.map +1 -0
  103. package/computed-asset-properties/event-count/event-count-today.d.ts +8 -0
  104. package/computed-asset-properties/event-count/event-count-today.d.ts.map +1 -0
  105. package/computed-asset-properties/event-count/event-count-value.d.ts +17 -0
  106. package/computed-asset-properties/event-count/event-count-value.d.ts.map +1 -0
  107. package/computed-asset-properties/event-count/event-count.model.d.ts +4 -0
  108. package/computed-asset-properties/event-count/event-count.model.d.ts.map +1 -0
  109. package/computed-asset-properties/index.d.ts +3 -0
  110. package/computed-asset-properties/index.d.ts.map +1 -0
  111. package/computed-asset-properties/last-device-message/last-device-message-computed-property.d.ts +3 -0
  112. package/computed-asset-properties/last-device-message/last-device-message-computed-property.d.ts.map +1 -0
  113. package/computed-asset-properties/last-device-message/last-device-message-value.d.ts +13 -0
  114. package/computed-asset-properties/last-device-message/last-device-message-value.d.ts.map +1 -0
  115. package/computed-asset-properties/last-measurement/last-measurement-computed-property.d.ts +8 -0
  116. package/computed-asset-properties/last-measurement/last-measurement-computed-property.d.ts.map +1 -0
  117. package/computed-asset-properties/last-measurement/last-measurement-config.component.d.ts +48 -0
  118. package/computed-asset-properties/last-measurement/last-measurement-config.component.d.ts.map +1 -0
  119. package/computed-asset-properties/last-measurement/last-measurement-value.d.ts +13 -0
  120. package/computed-asset-properties/last-measurement/last-measurement-value.d.ts.map +1 -0
  121. package/computed-asset-properties/last-measurement/last-measurement.model.d.ts +28 -0
  122. package/computed-asset-properties/last-measurement/last-measurement.model.d.ts.map +1 -0
  123. package/computed-asset-properties/strategies/alarm-count-strategy.d.ts +17 -0
  124. package/computed-asset-properties/strategies/alarm-count-strategy.d.ts.map +1 -0
  125. package/computed-asset-properties/strategies/child-count-strategy.d.ts +14 -0
  126. package/computed-asset-properties/strategies/child-count-strategy.d.ts.map +1 -0
  127. package/computed-asset-properties/strategies/count-strategy-base.d.ts +12 -0
  128. package/computed-asset-properties/strategies/count-strategy-base.d.ts.map +1 -0
  129. package/computed-asset-properties/strategies/event-count-strategy.d.ts +16 -0
  130. package/computed-asset-properties/strategies/event-count-strategy.d.ts.map +1 -0
  131. package/computed-asset-properties/strategies/last-device-message-strategy.d.ts +20 -0
  132. package/computed-asset-properties/strategies/last-device-message-strategy.d.ts.map +1 -0
  133. package/computed-asset-properties/strategies/last-measurement-strategy.d.ts +16 -0
  134. package/computed-asset-properties/strategies/last-measurement-strategy.d.ts.map +1 -0
  135. package/connectivity/abstract-connectivity-node.factory.d.ts.map +1 -1
  136. package/connectivity/actility/actility-tab.factory.d.ts.map +1 -1
  137. package/connectivity/sigfox/sigfox-tab.factory.d.ts.map +1 -1
  138. package/connectivity/sim/sim.module.d.ts.map +1 -1
  139. package/context-dashboard/cockpit-home-dashboard/cockpit-dashboard.component.d.ts.map +1 -1
  140. package/context-dashboard/cockpit-home-dashboard/cockpit-dashboard.model.d.ts.map +1 -1
  141. package/context-dashboard/cockpit-home-dashboard/cockpit-dashboard.module.d.ts.map +1 -1
  142. package/context-dashboard/context-dashboard.component.d.ts.map +1 -1
  143. package/context-dashboard/context-dashboard.model.d.ts +16 -0
  144. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  145. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  146. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  147. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  148. package/context-dashboard/dashboard-details-tabs.factory.d.ts.map +1 -1
  149. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  150. package/context-dashboard/dashboard-settings/dashboard-version-history.component.d.ts.map +1 -1
  151. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  152. package/context-dashboard/device-info-dashboard/device-info-dashboard.component.d.ts.map +1 -1
  153. package/context-dashboard/device-info-dashboard/device-info-dashboard.module.d.ts.map +1 -1
  154. package/context-dashboard/device-management-home-dashboard/device-management-home-dashboard.component.d.ts.map +1 -1
  155. package/context-dashboard/device-management-home-dashboard/device-management-home-dashboard.module.d.ts.map +1 -1
  156. package/context-dashboard/new-dashboard.guard.d.ts.map +1 -1
  157. package/context-dashboard/widget-config/appearance-settings.component.d.ts.map +1 -1
  158. package/context-dashboard/widget-config.service.d.ts +11 -1
  159. package/context-dashboard/widget-config.service.d.ts.map +1 -1
  160. package/core/action/action.service.d.ts +1 -1
  161. package/core/action-bar/action-bar.service.d.ts +1 -1
  162. package/core/authentication/simplified-auth.service.d.ts +1 -1
  163. package/core/authentication/simplified-auth.service.d.ts.map +1 -1
  164. package/core/breadcrumb/breadcrumb.service.d.ts +1 -1
  165. package/core/common/extension-hooks.d.ts.map +1 -1
  166. package/core/common/options.service.d.ts +1 -1
  167. package/core/common/service-registry.service.d.ts +1 -1
  168. package/core/common/ui-state.service.d.ts +7 -7
  169. package/core/common/ui-state.service.d.ts.map +1 -1
  170. package/core/common/user-preferences/user-preferences.service.d.ts +4 -4
  171. package/core/common/user-preferences/user-preferences.service.d.ts.map +1 -1
  172. package/core/dashboard/widgets-dashboard.component.d.ts +1 -1
  173. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  174. package/core/data-grid/action-controls-extension.service.d.ts +1 -1
  175. package/core/data-grid/filter-chip/filter-mapper.factory.d.ts +1 -1
  176. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  177. package/core/docs/docs.models.d.ts +1 -1
  178. package/core/docs/docs.module.d.ts +1 -1
  179. package/core/docs/help-and-support-outlet/help-and-support-outlet.module.d.ts +1 -1
  180. package/core/docs/legal-notices-outlet/legal-notices-outlet.module.d.ts +1 -1
  181. package/core/docs/support-outlet/support-outlet.component.d.ts +4 -3
  182. package/core/docs/support-outlet/support-outlet.component.d.ts.map +1 -1
  183. package/core/docs/support-outlet/support-outlet.module.d.ts +1 -1
  184. package/core/drawer/drawer.service.d.ts +1 -1
  185. package/core/dynamic-component/dynamic-component.model.d.ts +18 -4
  186. package/core/dynamic-component/dynamic-component.model.d.ts.map +1 -1
  187. package/core/dynamic-forms/i18n/translate.extension.d.ts.map +1 -1
  188. package/core/feedback-form/feedback-form.component.d.ts +27 -0
  189. package/core/feedback-form/feedback-form.component.d.ts.map +1 -0
  190. package/core/feedback-form/feedback-form.model.d.ts +6 -0
  191. package/core/feedback-form/feedback-form.model.d.ts.map +1 -0
  192. package/core/feedback-form/index.d.ts +2 -0
  193. package/core/feedback-form/index.d.ts.map +1 -0
  194. package/core/i18n/gettext.d.ts +4 -1
  195. package/core/i18n/gettext.d.ts.map +1 -1
  196. package/core/i18n/pattern-messages.data.d.ts +61 -0
  197. package/core/i18n/pattern-messages.data.d.ts.map +1 -1
  198. package/core/i18n/patterns-message.hook.d.ts +1 -1
  199. package/core/index.d.ts +1 -0
  200. package/core/index.d.ts.map +1 -1
  201. package/core/modal/modal.service.d.ts +0 -1
  202. package/core/modal/modal.service.d.ts.map +1 -1
  203. package/core/navigator/navigator-bottom/navigator-bottom.module.d.ts +1 -1
  204. package/core/navigator/navigator-top/navigator-top.module.d.ts +1 -1
  205. package/core/navigator/navigator.module.d.ts +1 -1
  206. package/core/navigator/navigator.service.d.ts +1 -1
  207. package/core/plugins/index.d.ts +1 -0
  208. package/core/plugins/index.d.ts.map +1 -1
  209. package/core/plugins/plugins-injection-token.d.ts +14 -0
  210. package/core/plugins/plugins-injection-token.d.ts.map +1 -0
  211. package/core/plugins/plugins-loader.service.d.ts +7 -21
  212. package/core/plugins/plugins-loader.service.d.ts.map +1 -1
  213. package/core/plugins/plugins-resolve.service.d.ts +1 -0
  214. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  215. package/core/preview-feature/preview-feature.component.d.ts.map +1 -1
  216. package/core/preview-feature/preview-feature.service.d.ts +1 -1
  217. package/core/provider-configuration/provider-configuration-hook.d.ts +1 -1
  218. package/core/query-param-handler/index.d.ts +1 -1
  219. package/core/query-param-handler/query-param-bottom-drawer.service.d.ts +1 -1
  220. package/core/query-param-handler/query-param-handler.service.d.ts +1 -1
  221. package/core/query-param-handler/query-param-modal-handler.service.d.ts +1 -1
  222. package/core/router/router.service.d.ts +1 -1
  223. package/core/search/search.service.d.ts +1 -1
  224. package/core/stepper/stepper.service.d.ts +1 -1
  225. package/core/tabs/tab.component.d.ts +2 -2
  226. package/core/tabs/tab.component.d.ts.map +1 -1
  227. package/core/tabs/tab.model.d.ts +2 -2
  228. package/core/tabs/tab.model.d.ts.map +1 -1
  229. package/core/tabs/tabs.service.d.ts +1 -1
  230. package/core/tabs/tabs.service.d.ts.map +1 -1
  231. package/core/ui-settings/ui-settings.module.d.ts +1 -1
  232. package/core/user/change-current-user-password.service.d.ts +10 -0
  233. package/core/user/change-current-user-password.service.d.ts.map +1 -0
  234. package/core/user/index.d.ts +1 -0
  235. package/core/user/index.d.ts.map +1 -1
  236. package/core/user/user-details-drawer/user-details-drawer.module.d.ts +1 -1
  237. package/core/user/user-menu.service.d.ts +1 -1
  238. package/core/user/user.module.d.ts +1 -1
  239. package/core/version/version.model.d.ts +1 -1
  240. package/core/version/version.module.d.ts +1 -1
  241. package/core/wizard/wizard.model.d.ts +1 -1
  242. package/dashboard-details-advanced-tab/advanced-tab.factory.d.ts.map +1 -1
  243. package/dashboard-details-advanced-tab/assign-widget-assets/assign-widget-asset-modal.component.d.ts.map +1 -1
  244. package/dashboard-details-advanced-tab/dashboard-json-editor/dashboard-json-editor.component.d.ts.map +1 -1
  245. package/dashboard-details-advanced-tab/dashboard-json-editor/import-export-widgets.service.d.ts.map +1 -1
  246. package/dashboard-manager/dashboard-manager-tabs.factory.d.ts.map +1 -1
  247. package/dashboard-manager/dashboard-manager.service.d.ts.map +1 -1
  248. package/dashboard-manager/devicemanagement/index.d.ts +1 -1
  249. package/dashboard-manager/type-dashboard-target-assets-grid/type-dashboard-target-assets-grid.component.d.ts.map +1 -1
  250. package/dashboard-manager/type-dashboard-target-assets-modal/type-dashboard-target-assets-modal.component.d.ts.map +1 -1
  251. package/dashboard-manager/type-dashboards-list/device-type-value.grid-column.d.ts.map +1 -1
  252. package/dashboard-manager/type-dashboards-list/type-dashboards-list.component.d.ts.map +1 -1
  253. package/data-grid-columns/asset-type/asset-type-grid-column.d.ts.map +1 -1
  254. package/data-grid-columns/asset-type/asset-type.cell-renderer.component.d.ts.map +1 -1
  255. package/datapoint-explorer/datapoint-explorer-navigation-factory.d.ts.map +1 -1
  256. package/datapoint-explorer/devicemanagement/index.d.ts +3 -0
  257. package/datapoint-explorer/devicemanagement/index.d.ts.map +1 -1
  258. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts +4 -2
  259. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -1
  260. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts.map +1 -1
  261. package/datapoint-explorer/view/datapoint-explorer.model.d.ts +1 -0
  262. package/datapoint-explorer/view/datapoint-explorer.model.d.ts.map +1 -1
  263. package/datapoint-explorer/view/index.d.ts +3 -0
  264. package/datapoint-explorer/view/index.d.ts.map +1 -1
  265. package/datapoint-explorer/view/send-as-widget-to-dashboard-modal/send-as-widget-to-dashboard-modal.component.d.ts.map +1 -1
  266. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts.map +1 -1
  267. package/datapoint-library/datapoint-library.module.d.ts.map +1 -1
  268. package/datapoint-library/details/datapoint-library-details.component.d.ts +1 -2
  269. package/datapoint-library/details/datapoint-library-details.component.d.ts.map +1 -1
  270. package/datapoint-library/list/datapoint-library-list.component.d.ts.map +1 -1
  271. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  272. package/datapoint-selector/datapoint-selector-modal/datapoint-selector-modal.component.d.ts.map +1 -1
  273. package/datapoint-selector/datapoint-template-popover/datapoint-template-popover.component.d.ts.map +1 -1
  274. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
  275. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -1
  276. 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
  277. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -1
  278. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
  279. package/default-subscriptions/default-subscriptions-navigation.factory.d.ts.map +1 -1
  280. package/default-subscriptions/default-subscriptions.component.d.ts.map +1 -1
  281. package/device-grid/columns/alarms.cell-renderer.component.d.ts.map +1 -1
  282. package/device-grid/columns/alarms.device-grid-column.d.ts.map +1 -1
  283. package/device-grid/columns/group.device-grid-column.d.ts.map +1 -1
  284. package/device-grid/columns/imei.device-grid-column.d.ts.map +1 -1
  285. package/device-grid/columns/model.device-grid-column.d.ts.map +1 -1
  286. package/device-grid/columns/name.device-grid-column.d.ts.map +1 -1
  287. package/device-grid/columns/registration-date.device-grid-column.d.ts.map +1 -1
  288. package/device-grid/columns/serial-number.device-grid-column.d.ts.map +1 -1
  289. package/device-grid/columns/status.device-grid-column.d.ts.map +1 -1
  290. package/device-grid/columns/system-id.device-grid-column.d.ts.map +1 -1
  291. package/device-grid/columns/type.device-grid-column.d.ts.map +1 -1
  292. package/device-grid/device-grid.component.d.ts.map +1 -1
  293. package/device-grid/device-grid.service.d.ts.map +1 -1
  294. package/device-list/add-smart-group.component.d.ts.map +1 -1
  295. package/device-list/device-list-navigation.factory.d.ts.map +1 -1
  296. package/device-list/devices.breadcrumb-factory.d.ts.map +1 -1
  297. package/device-map/device-map-navigation.factory.d.ts.map +1 -1
  298. package/device-profile/add-device-profile.component.d.ts.map +1 -1
  299. package/device-profile/device-profile-list.component.d.ts.map +1 -1
  300. package/device-profile/device-profile-navigation.factory.d.ts.map +1 -1
  301. package/device-profile/device-profile.component.d.ts.map +1 -1
  302. package/device-profile/device-profile.service.d.ts.map +1 -1
  303. package/device-profile/device-tab-profile/device-tab-profile.component.d.ts.map +1 -1
  304. package/device-profile/select-configuration-modal.component.d.ts.map +1 -1
  305. package/device-protocols/device-protocols.guard.d.ts.map +1 -1
  306. package/device-provisioned-certificates/device-provisioned-certificates.module.d.ts.map +1 -1
  307. package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts.map +1 -1
  308. package/device-shell/device-shell.module.d.ts.map +1 -1
  309. package/device-shell/shared/device-shell.service.d.ts.map +1 -1
  310. package/device-shell/shell/shell.component.d.ts.map +1 -1
  311. package/diagnostics/diagnostics.module.d.ts.map +1 -1
  312. package/diagnostics/diagnostics.service.d.ts.map +1 -1
  313. package/echart/services/echarts-options.service.d.ts +2 -3
  314. package/echart/services/echarts-options.service.d.ts.map +1 -1
  315. package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
  316. package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
  317. package/ecosystem/application-plugins/apps-to-update-remotes-select.component.d.ts.map +1 -1
  318. package/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.d.ts.map +1 -1
  319. package/ecosystem/application-plugins/orphaned-status-cell-renderer.component.d.ts.map +1 -1
  320. package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -1
  321. package/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.d.ts.map +1 -1
  322. package/ecosystem/application-properties/application-properties.component.d.ts.map +1 -1
  323. package/ecosystem/application-properties/subscription-modal/subscription-modal.component.d.ts.map +1 -1
  324. package/ecosystem/ecosystem-tabs.factory.d.ts.map +1 -1
  325. package/ecosystem/license-confirm/license-confirm-modal.component.d.ts.map +1 -1
  326. package/ecosystem/license-confirm/license-view.component.d.ts.map +1 -1
  327. package/ecosystem/microservices/add-microservice.component.d.ts.map +1 -1
  328. package/ecosystem/packages/add-package.component.d.ts.map +1 -1
  329. package/ecosystem/packages/deploy-application/deploy-application.component.d.ts.map +1 -1
  330. package/ecosystem/packages/package-list/packages-list.component.d.ts.map +1 -1
  331. package/ecosystem/packages/package-versions/package-versions-list/package-versions-list.component.d.ts.map +1 -1
  332. package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
  333. package/ecosystem/plugin-setup-stepper/plugin-setup-stepper.module.d.ts.map +1 -1
  334. package/ecosystem/shared/add-application.component.d.ts.map +1 -1
  335. package/ecosystem/shared/application-card.component.d.ts.map +1 -1
  336. package/ecosystem/shared/archived-filter/archived-filter.component.d.ts.map +1 -1
  337. package/ecosystem/shared/ecosystem.constants.d.ts.map +1 -1
  338. package/ecosystem/shared/ecosystem.service.d.ts.map +1 -1
  339. package/ecosystem/shared/package-availability.service.d.ts.map +1 -1
  340. package/ecosystem/shared/package-version-select/package-version-select.component.d.ts.map +1 -1
  341. package/ecosystem/shared/upload-archive.component.d.ts.map +1 -1
  342. package/editor/editor.component.d.ts +15 -0
  343. package/editor/editor.component.d.ts.map +1 -1
  344. package/exports/index.d.ts +1 -1
  345. package/exports/index.d.ts.map +1 -1
  346. package/exports/list/exports-grid.service.d.ts.map +1 -1
  347. package/exports/list/exports-list/exports-list.component.d.ts.map +1 -1
  348. package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +2 -1
  349. package/fesm2022/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
  350. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +8 -7
  351. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  352. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +2 -1
  353. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
  354. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +2 -1
  355. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
  356. package/fesm2022/c8y-ngx-components-alarms.mjs +40 -2
  357. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  358. package/fesm2022/c8y-ngx-components-asset-properties.mjs +608 -97
  359. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  360. package/fesm2022/c8y-ngx-components-asset-property-grid.component-CRnyUbyz.mjs.map +1 -1
  361. package/fesm2022/c8y-ngx-components-assets-navigator.mjs +70 -23
  362. package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  363. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +2 -1
  364. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  365. package/fesm2022/c8y-ngx-components-binary-file-download.mjs +2 -1
  366. package/fesm2022/c8y-ngx-components-binary-file-download.mjs.map +1 -1
  367. package/fesm2022/c8y-ngx-components-bookmarks.mjs +2 -1
  368. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  369. package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs +2 -1
  370. package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs.map +1 -1
  371. package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs +3 -3
  372. package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs.map +1 -1
  373. package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +2 -1
  374. package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs.map +1 -1
  375. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +22 -12
  376. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  377. package/fesm2022/c8y-ngx-components-child-devices.mjs +2 -1
  378. package/fesm2022/c8y-ngx-components-child-devices.mjs.map +1 -1
  379. package/fesm2022/c8y-ngx-components-cockpit-config.mjs +2 -1
  380. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  381. package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-BOpIFCYh.mjs +68 -0
  382. package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-BOpIFCYh.mjs.map +1 -0
  383. package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-D8otkLI8.mjs +73 -0
  384. package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-D8otkLI8.mjs.map +1 -0
  385. package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-AVm6qa9k.mjs +44 -0
  386. package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-AVm6qa9k.mjs.map +1 -0
  387. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CtUoKGuU.mjs +91 -0
  388. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CtUoKGuU.mjs.map +1 -0
  389. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +643 -0
  390. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs.map +1 -0
  391. package/fesm2022/c8y-ngx-components-connectivity.mjs +2 -1
  392. package/fesm2022/c8y-ngx-components-connectivity.mjs.map +1 -1
  393. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +2 -1
  394. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
  395. 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
  396. package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-BkcNSexF.mjs.map +1 -0
  397. 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
  398. package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-version-history.component-D9W68e7h.mjs.map +1 -0
  399. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +43 -10
  400. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  401. 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
  402. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-D0lATUjO.mjs.map +1 -0
  403. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +4 -3
  404. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs.map +1 -1
  405. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +2 -1
  406. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
  407. package/fesm2022/c8y-ngx-components-data-broker.mjs +2 -1
  408. package/fesm2022/c8y-ngx-components-data-broker.mjs.map +1 -1
  409. package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs +2 -1
  410. package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs.map +1 -1
  411. package/fesm2022/c8y-ngx-components-data-grid-columns.mjs +2 -1
  412. package/fesm2022/c8y-ngx-components-data-grid-columns.mjs.map +1 -1
  413. package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs +38 -9
  414. package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs.map +1 -1
  415. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +58 -53
  416. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  417. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +2 -1
  418. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
  419. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +2 -1
  420. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  421. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +2 -1
  422. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
  423. package/fesm2022/c8y-ngx-components-datapoint-library.mjs +2 -1
  424. package/fesm2022/c8y-ngx-components-datapoint-library.mjs.map +1 -1
  425. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +2 -1
  426. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  427. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +2 -1
  428. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  429. package/fesm2022/c8y-ngx-components-default-subscriptions.mjs +2 -1
  430. package/fesm2022/c8y-ngx-components-default-subscriptions.mjs.map +1 -1
  431. package/fesm2022/c8y-ngx-components-device-grid.mjs +3 -3
  432. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  433. package/fesm2022/c8y-ngx-components-device-list.mjs +2 -1
  434. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  435. package/fesm2022/c8y-ngx-components-device-map.mjs +2 -1
  436. package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
  437. package/fesm2022/c8y-ngx-components-device-profile.mjs +2 -1
  438. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  439. package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs +3 -2
  440. package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
  441. package/fesm2022/c8y-ngx-components-device-protocols.mjs +2 -1
  442. package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
  443. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +2 -1
  444. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
  445. package/fesm2022/c8y-ngx-components-device-shell.mjs +2 -1
  446. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  447. package/fesm2022/c8y-ngx-components-diagnostics.mjs +2 -1
  448. package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
  449. package/fesm2022/c8y-ngx-components-echart.mjs +6 -8
  450. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  451. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +2 -1
  452. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  453. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +2 -1
  454. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
  455. package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +2 -1
  456. package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs.map +1 -1
  457. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +2 -1
  458. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  459. package/fesm2022/c8y-ngx-components-ecosystem.mjs +2 -1
  460. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  461. package/fesm2022/c8y-ngx-components-editor.mjs +15 -0
  462. package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
  463. package/fesm2022/c8y-ngx-components-events.mjs +1 -1
  464. package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
  465. package/fesm2022/c8y-ngx-components-exports-list.mjs +2 -1
  466. package/fesm2022/c8y-ngx-components-exports-list.mjs.map +1 -1
  467. package/fesm2022/c8y-ngx-components-exports.mjs +2 -1
  468. package/fesm2022/c8y-ngx-components-exports.mjs.map +1 -1
  469. package/fesm2022/c8y-ngx-components-file-preview.mjs +2 -1
  470. package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
  471. package/fesm2022/c8y-ngx-components-files-repository.mjs +2 -1
  472. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  473. package/fesm2022/c8y-ngx-components-icon-selector.mjs +2 -1
  474. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  475. package/fesm2022/c8y-ngx-components-location.mjs +2 -1
  476. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  477. package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +2 -1
  478. package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
  479. package/fesm2022/c8y-ngx-components-map.mjs +2 -1
  480. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  481. package/fesm2022/c8y-ngx-components-messaging-management.mjs +2 -1
  482. package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
  483. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +2 -1
  484. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
  485. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +2 -1
  486. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  487. package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +2 -1
  488. package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
  489. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +2 -1
  490. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  491. package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs +2 -1
  492. package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
  493. package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +2 -1
  494. package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs.map +1 -1
  495. package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +2 -1
  496. package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
  497. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +2 -1
  498. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  499. package/fesm2022/c8y-ngx-components-operations-shared.mjs +2 -1
  500. package/fesm2022/c8y-ngx-components-operations-shared.mjs.map +1 -1
  501. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +4 -4
  502. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
  503. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +4 -4
  504. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  505. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +4 -4
  506. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  507. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +4 -4
  508. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  509. package/fesm2022/c8y-ngx-components-operations.mjs +2 -1
  510. package/fesm2022/c8y-ngx-components-operations.mjs.map +1 -1
  511. package/fesm2022/c8y-ngx-components-pending-mo-request.mjs +2 -1
  512. package/fesm2022/c8y-ngx-components-pending-mo-request.mjs.map +1 -1
  513. package/fesm2022/c8y-ngx-components-platform-configuration.mjs +2 -1
  514. package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
  515. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +2 -1
  516. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  517. package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs +1 -1
  518. package/fesm2022/c8y-ngx-components-protocol-opcua-mappings.mjs.map +1 -1
  519. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +2 -1
  520. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  521. package/fesm2022/c8y-ngx-components-register-device.mjs +2 -1
  522. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  523. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +3 -3
  524. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
  525. package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +2 -1
  526. package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs.map +1 -1
  527. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +2 -1
  528. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
  529. package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +2 -1
  530. package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs.map +1 -1
  531. package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +2 -1
  532. package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs.map +1 -1
  533. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +3 -3
  534. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
  535. package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +2 -1
  536. package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs.map +1 -1
  537. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +2 -1
  538. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
  539. package/fesm2022/c8y-ngx-components-replace-device.mjs +2 -1
  540. package/fesm2022/c8y-ngx-components-replace-device.mjs.map +1 -1
  541. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +2 -1
  542. package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
  543. package/fesm2022/c8y-ngx-components-reports.mjs +2 -1
  544. package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
  545. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +2 -1
  546. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  547. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +2 -1
  548. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  549. package/fesm2022/c8y-ngx-components-repository-shared.mjs +3 -2
  550. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  551. package/fesm2022/c8y-ngx-components-repository-software.mjs +2 -1
  552. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  553. package/fesm2022/c8y-ngx-components-search.mjs +2 -1
  554. package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
  555. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +2 -1
  556. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
  557. package/fesm2022/c8y-ngx-components-sensor-phone.mjs +3 -2
  558. package/fesm2022/c8y-ngx-components-sensor-phone.mjs.map +1 -1
  559. package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +2 -1
  560. package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs.map +1 -1
  561. package/fesm2022/c8y-ngx-components-services-shared.mjs +1 -1
  562. package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -1
  563. package/fesm2022/c8y-ngx-components-services.mjs +2 -1
  564. package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
  565. package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +2 -1
  566. package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
  567. package/fesm2022/c8y-ngx-components-sms-gateway.mjs +3 -2
  568. package/fesm2022/c8y-ngx-components-sms-gateway.mjs.map +1 -1
  569. package/fesm2022/c8y-ngx-components-sub-assets.mjs +2 -1
  570. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  571. package/fesm2022/c8y-ngx-components-tenants.mjs +37 -37
  572. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  573. package/fesm2022/c8y-ngx-components-tracking.mjs +2 -1
  574. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
  575. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +5 -5
  576. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  577. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +2 -1
  578. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  579. package/fesm2022/c8y-ngx-components-upgrade.mjs +10 -3
  580. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  581. package/fesm2022/c8y-ngx-components-user-roles.mjs +2 -1
  582. package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
  583. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +2 -1
  584. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  585. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +2 -1
  586. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  587. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +2 -1
  588. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  589. package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs +2 -1
  590. package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs.map +1 -1
  591. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs +2 -1
  592. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs.map +1 -1
  593. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-legacy-welcome.mjs +2 -1
  594. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-legacy-welcome.mjs.map +1 -1
  595. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs +2 -1
  596. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs.map +1 -1
  597. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +2 -1
  598. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
  599. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +2 -1
  600. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
  601. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs +2 -1
  602. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs.map +1 -1
  603. package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs +1 -1
  604. package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
  605. package/fesm2022/c8y-ngx-components-widgets-definitions-help-and-service.mjs +2 -1
  606. package/fesm2022/c8y-ngx-components-widgets-definitions-help-and-service.mjs.map +1 -1
  607. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +3 -3
  608. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
  609. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +3 -6
  610. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
  611. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs +2 -1
  612. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
  613. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs +2 -1
  614. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
  615. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs +2 -1
  616. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
  617. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +2 -1
  618. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  619. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +2 -2
  620. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
  621. package/fesm2022/c8y-ngx-components-widgets-definitions-quick-links.mjs +2 -1
  622. package/fesm2022/c8y-ngx-components-widgets-definitions-quick-links.mjs.map +1 -1
  623. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +2 -1
  624. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -1
  625. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs +2 -1
  626. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
  627. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs +2 -1
  628. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
  629. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +2 -1
  630. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  631. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +2 -1
  632. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs.map +1 -1
  633. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs +9 -6
  634. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
  635. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +2 -1
  636. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  637. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs +2 -1
  638. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
  639. package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs +2 -1
  640. package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs.map +1 -1
  641. package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs +2 -1
  642. package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs.map +1 -1
  643. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +13 -8
  644. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  645. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +2 -1
  646. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
  647. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +2 -1
  648. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  649. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +2 -1
  650. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  651. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +2 -1
  652. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  653. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +2 -1
  654. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
  655. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +2 -1
  656. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
  657. package/fesm2022/c8y-ngx-components-widgets-import-export-config.mjs +3 -10
  658. package/fesm2022/c8y-ngx-components-widgets-import-export-config.mjs.map +1 -1
  659. package/fesm2022/c8y-ngx-components.mjs +692 -504
  660. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  661. package/file-preview/file-preview.component.d.ts.map +1 -1
  662. package/files-repository/files-repository-navigation.factory.d.ts.map +1 -1
  663. package/files-repository/files-repository-upload.component.d.ts.map +1 -1
  664. package/files-repository/files-repository.component.d.ts.map +1 -1
  665. package/files-repository/files-repository.service.d.ts +1 -2
  666. package/files-repository/files-repository.service.d.ts.map +1 -1
  667. package/icon-selector/icon-selector-modal/icon-selector-modal.component.d.ts.map +1 -1
  668. package/icon-selector/icon-selector.component.d.ts.map +1 -1
  669. package/locales/de.po +105 -12
  670. package/locales/es.po +105 -12
  671. package/locales/fr.po +105 -12
  672. package/locales/ja_JP.po +99 -12
  673. package/locales/ko.po +104 -12
  674. package/locales/locales.pot +97 -12
  675. package/locales/nl.po +105 -12
  676. package/locales/pl.po +105 -12
  677. package/locales/pt_BR.po +105 -12
  678. package/locales/zh_CN.po +104 -12
  679. package/locales/zh_TW.po +104 -12
  680. package/location/location-tab.factory.d.ts.map +1 -1
  681. package/location/location.component.d.ts.map +1 -1
  682. package/loriot-device-registration/loriot-device-registration.component.d.ts.map +1 -1
  683. package/loriot-device-registration/loriot-provider.service.d.ts.map +1 -1
  684. package/map/map.component.d.ts.map +1 -1
  685. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts.map +1 -1
  686. package/messaging-management/messaging/shared/usage/usage.component.d.ts.map +1 -1
  687. package/messaging-management/messaging/topic/topic-list-view.component.d.ts.map +1 -1
  688. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts.map +1 -1
  689. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts.map +1 -1
  690. package/messaging-management/messaging/topic/topics-data-grid.service.d.ts.map +1 -1
  691. package/messaging-management/navigator/messaging-navigator-factory.d.ts.map +1 -1
  692. package/messaging-management/navigator/topic-details-tab.factory.d.ts.map +1 -1
  693. package/operations/bulk-operation-list-item/bulk-operation-list-item.component.d.ts.map +1 -1
  694. package/operations/bulk-operation-list-item/modals/bulk-operations-reschedule-modal.component.d.ts.map +1 -1
  695. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
  696. package/operations/bulk-operation-stepper/bulk-operation-stepper.component.d.ts.map +1 -1
  697. package/operations/bulk-single-operations-list/single-operation-item.component.d.ts.map +1 -1
  698. package/operations/bulk-single-operations-list/single-operations-list.component.d.ts.map +1 -1
  699. package/operations/factories/bulk-operations-tab.factory.d.ts.map +1 -1
  700. package/operations/grid-columns/creation-time.grid-column.d.ts.map +1 -1
  701. package/operations/grid-columns/device.grid-column.d.ts.map +1 -1
  702. package/operations/grid-columns/failure-reason.grid-column.d.ts.map +1 -1
  703. package/operations/grid-columns/status.grid-column.d.ts.map +1 -1
  704. package/operations/operations-list/device-control.feature.d.ts.map +1 -1
  705. package/operations/operations-list/operations-list-item.component.d.ts.map +1 -1
  706. package/operations/operations-list/operations-list.component.d.ts.map +1 -1
  707. package/operations/operations-list/single-operations-tab.factory.d.ts.map +1 -1
  708. package/operations/operations-list-item-details/operation-details-tabs.component.d.ts.map +1 -1
  709. package/operations/shared/nav.factory.d.ts.map +1 -1
  710. package/operations/shared/operations.service.d.ts.map +1 -1
  711. package/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.component.d.ts.map +1 -1
  712. package/operations/stepper-bulk-type-device-profile/stepper-bulk-type-device-profile.component.d.ts.map +1 -1
  713. package/operations/stepper-bulk-type-firmware/stepper-bulk-type-firmware.component.d.ts.map +1 -1
  714. package/operations/stepper-bulk-type-software/select-software-step.component.d.ts.map +1 -1
  715. package/operations/stepper-bulk-type-software/stepper-bulk-type-software.component.d.ts.map +1 -1
  716. package/package.json +1 -1
  717. package/pending-mo-request/pending-mo-request-interceptor.d.ts.map +1 -1
  718. package/pending-mo-request/pending-mo-request.service.d.ts.map +1 -1
  719. package/platform-configuration/platform-configuration-form-provider.service.d.ts.map +1 -1
  720. package/protocol-lpwan/lpwan-protocol.module.d.ts.map +1 -1
  721. package/protocol-lpwan/lpwan-set-connections.component.d.ts.map +1 -1
  722. package/protocol-lpwan/lpwan-set-device-protocol.component.d.ts.map +1 -1
  723. package/protocol-lpwan/multiple-lns-connectors/actility-multiple-lns-connector.component.d.ts.map +1 -1
  724. package/protocol-lpwan/multiple-lns-connectors/connection-info-with-download-csv.component.d.ts.map +1 -1
  725. package/protocol-lpwan/multiple-lns-connectors/loriot/loriot-multiple-lns-connector.component.d.ts.map +1 -1
  726. package/protocol-lpwan/multiple-lns-connectors/no-connections-found.component.d.ts.map +1 -1
  727. package/protocol-lpwan/multiple-lns-connectors/sigfox-multiple-lns-connector.component.d.ts.map +1 -1
  728. package/protocol-opcua/opcua-address-space.component.d.ts.map +1 -1
  729. package/protocol-opcua/opcua-device-protocol-detail.component.d.ts.map +1 -1
  730. package/protocol-opcua/opcua-server-config.component.d.ts.map +1 -1
  731. package/protocol-opcua/opcua-servers.component.d.ts.map +1 -1
  732. package/register-device/bulk/bulk-device-registration-modal.component.d.ts.map +1 -1
  733. package/register-device/device-registration-view.component.d.ts.map +1 -1
  734. package/register-device/extensible/base-extensible-device-registration.service.d.ts.map +1 -1
  735. package/register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.d.ts.map +1 -1
  736. package/register-device/extensible/bulk/extensible-bulk-device-registration.service.d.ts.map +1 -1
  737. package/register-device/extensible/single/extensible-device-registration-modal.component.d.ts.map +1 -1
  738. package/register-device/extensible/single/extensible-device-registration-stepper.component.d.ts.map +1 -1
  739. package/register-device/extensible/single/extensible-device-registration.service.d.ts.map +1 -1
  740. package/register-device/general/general-device-registration.component.d.ts.map +1 -1
  741. package/register-device/register-device-navigation.factory.d.ts.map +1 -1
  742. package/register-device/register-device.service.d.ts.map +1 -1
  743. package/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.d.ts.map +1 -1
  744. package/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.d.ts.map +1 -1
  745. package/remote-access/passthrough/index.d.ts +1 -1
  746. package/remote-access/passthrough/index.d.ts.map +1 -1
  747. package/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.d.ts.map +1 -1
  748. package/remote-access/ssh/index.d.ts.map +1 -1
  749. package/remote-access/telnet/index.d.ts.map +1 -1
  750. package/remote-access/vnc/index.d.ts.map +1 -1
  751. package/replace-device/replace-device-grid-action.factory.d.ts.map +1 -1
  752. package/replace-device/replace-device-wizard/replace-device-wizard.component.d.ts.map +1 -1
  753. package/replace-device/replace-device-wizard/replace-device-wizard.service.d.ts.map +1 -1
  754. package/replace-device/replace-device.service.d.ts.map +1 -1
  755. package/report-dashboard/report-dashboard-list.component.d.ts.map +1 -1
  756. package/report-dashboard/report-dashboard-navigation.factory.d.ts.map +1 -1
  757. package/reports/export-schedules.component.d.ts.map +1 -1
  758. package/repository/configuration/device-tab/configuration-repository-device-tab.module.d.ts.map +1 -1
  759. package/repository/configuration/device-tab/save-to-repository.component.d.ts.map +1 -1
  760. package/repository/configuration/device-tab/text-based-configuration.component.d.ts.map +1 -1
  761. package/repository/configuration/list/configuration-detail.component.d.ts.map +1 -1
  762. package/repository/configuration/list/configuration-list.component.d.ts.map +1 -1
  763. package/repository/configuration/list/configuration-repository-navigation-factory.d.ts.map +1 -1
  764. package/repository/firmware/device-tab/firmware-device-tab.component.d.ts.map +1 -1
  765. package/repository/firmware/device-tab/firmware-repository-device-tab.module.d.ts.map +1 -1
  766. package/repository/firmware/list/add-firmware-modal.component.d.ts.map +1 -1
  767. package/repository/firmware/list/add-firmware-patch-modal.component.d.ts.map +1 -1
  768. package/repository/firmware/list/firmware-details.component.d.ts.map +1 -1
  769. package/repository/firmware/list/firmware-list.component.d.ts.map +1 -1
  770. package/repository/firmware/list/firmware-repository-navigation-factory.d.ts.map +1 -1
  771. package/repository/shared/columns/description.grid-column.d.ts.map +1 -1
  772. package/repository/shared/columns/device-type.grid-column.d.ts.map +1 -1
  773. package/repository/shared/columns/file.grid-column.d.ts.map +1 -1
  774. package/repository/shared/columns/name.grid-column.d.ts.map +1 -1
  775. package/repository/shared/columns/type.filtering-form-renderer.component.d.ts.map +1 -1
  776. package/repository/shared/columns/type.grid-column.d.ts.map +1 -1
  777. package/repository/shared/columns/versions.grid-column.d.ts.map +1 -1
  778. package/repository/shared/repository.service.d.ts.map +1 -1
  779. package/repository/shared/select-modal/repository-select-modal.component.d.ts +1 -1
  780. package/repository/shared/select-modal/repository-select-modal.component.d.ts.map +1 -1
  781. package/repository/shared/software-type/software-type.component.d.ts.map +1 -1
  782. package/repository/software/device-tab/installed-software.component.d.ts.map +1 -1
  783. package/repository/software/device-tab/software-repository-device-tab.module.d.ts.map +1 -1
  784. package/repository/software/list/add-software-modal.component.d.ts.map +1 -1
  785. package/repository/software/list/software-details.component.d.ts.map +1 -1
  786. package/repository/software/list/software-list.component.d.ts.map +1 -1
  787. package/repository/software/list/software-repository-navigation-factory.d.ts.map +1 -1
  788. package/search/columns/asset-type-search-grid-column.d.ts.map +1 -1
  789. package/search/search-grid.component.d.ts.map +1 -1
  790. package/search/search-results.component.d.ts.map +1 -1
  791. package/sensor-phone/connect-smartphone.factory.d.ts.map +1 -1
  792. package/sensor-phone/sensor-phone-modal/sensor-phone-modal.component.d.ts.map +1 -1
  793. package/sensor-phone/sensor-phone-modal/sensor-phone.service.d.ts.map +1 -1
  794. package/services/service-command-tab/service-command.feature.d.ts.map +1 -1
  795. package/services/services-device-tab/columns/last-updated-date.device-grid-column.d.ts.map +1 -1
  796. package/services/services-device-tab/columns/name.grid-column.d.ts.map +1 -1
  797. package/services/services-device-tab/columns/service-type.grid-column.d.ts.map +1 -1
  798. package/services/services-device-tab/columns/status.grid-column.d.ts.map +1 -1
  799. package/services/services-device-tab/services-device-tab.component.d.ts.map +1 -1
  800. package/services/services-device-tab/services-device-tab.module.d.ts.map +1 -1
  801. package/services/services-device-tab/services.breadcrumb-factory.d.ts.map +1 -1
  802. package/services/shared/service-command.service.d.ts.map +1 -1
  803. package/services/status-options/status-options.model.d.ts.map +1 -1
  804. package/sigfox-device-registration/sigfox-device-registration.component.d.ts.map +1 -1
  805. package/sigfox-device-registration/sigfox-provider.service.d.ts.map +1 -1
  806. package/sms-gateway/sms-gateway.module.d.ts.map +1 -1
  807. package/sub-assets/add-group/add-group.component.d.ts.map +1 -1
  808. package/sub-assets/asset-properties-item.component.d.ts.map +1 -1
  809. package/sub-assets/asset-properties.component.d.ts.map +1 -1
  810. package/sub-assets/assign-devices/assign-child-devices.component.d.ts.map +1 -1
  811. package/sub-assets/assign-devices/assign-devices.component.d.ts.map +1 -1
  812. package/sub-assets/delete-assets-modal/delete-assets-modal.component.d.ts.map +1 -1
  813. package/sub-assets/group-info.component.d.ts.map +1 -1
  814. package/sub-assets/sub-assets-grid.component.d.ts.map +1 -1
  815. package/sub-assets/sub-assets.module.d.ts.map +1 -1
  816. package/sub-assets/sub-assets.service.d.ts.map +1 -1
  817. package/sub-assets/unassign-assets-modal/unassign-modal.component.d.ts.map +1 -1
  818. package/tenants/custom-properties/custom-properties.component.d.ts.map +1 -1
  819. package/tenants/tenant-form/tenant-form.component.d.ts.map +1 -1
  820. package/tenants/tenant-limits/tenant-limits.component.d.ts.map +1 -1
  821. package/tenants/tenant-list/creation-time.filtering-form-renderer.component.d.ts.map +1 -1
  822. package/tenants/tenant-list/tenant-list.component.d.ts.map +1 -1
  823. package/tenants/tenants-navigation.factory.d.ts.map +1 -1
  824. package/tenants/tenants.module.d.ts.map +1 -1
  825. package/tracking/tracking.feature.d.ts.map +1 -1
  826. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -1
  827. package/trusted-certificates/crl/crl-check-settings.component.d.ts.map +1 -1
  828. package/trusted-certificates/crl/crl-settings.component.d.ts.map +1 -1
  829. package/trusted-certificates/factories/tabs.factory.d.ts.map +1 -1
  830. package/trusted-certificates/factories/trusted-certificates-navigation.factory.d.ts.map +1 -1
  831. package/trusted-certificates/list/add-trusted-certificate.component.d.ts.map +1 -1
  832. package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
  833. package/upgrade/auth-bridge.service.d.ts.map +1 -1
  834. package/upgrade/bridge.service.d.ts.map +1 -1
  835. package/upgrade/ng1/downgraded.services.d.ts +1 -0
  836. package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
  837. package/upgrade/ng1/index.d.ts.map +1 -1
  838. package/user-roles/roles-asset-tree/roles-asset-tree.component.d.ts.map +1 -1
  839. package/widgets/cockpit/index.d.ts +4 -4
  840. package/widgets/definitions/alarms/alarm-list/index.d.ts +1 -1
  841. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  842. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +1 -1
  843. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  844. package/widgets/definitions/alarms/recent-alarms/index.d.ts +1 -1
  845. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  846. package/widgets/definitions/applications/index.d.ts +1 -1
  847. package/widgets/definitions/applications/index.d.ts.map +1 -1
  848. package/widgets/definitions/asset-notes/index.d.ts +1 -1
  849. package/widgets/definitions/asset-notes/index.d.ts.map +1 -1
  850. package/widgets/definitions/cockpit-legacy-welcome/index.d.ts +1 -1
  851. package/widgets/definitions/cockpit-legacy-welcome/index.d.ts.map +1 -1
  852. package/widgets/definitions/cockpit-welcome/index.d.ts +1 -1
  853. package/widgets/definitions/cockpit-welcome/index.d.ts.map +1 -1
  854. package/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.d.ts.map +1 -1
  855. package/widgets/definitions/datapoints-graph/index.d.ts +1 -1
  856. package/widgets/definitions/datapoints-table/index.d.ts +1 -1
  857. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
  858. package/widgets/definitions/device-control-message/index.d.ts +1 -1
  859. package/widgets/definitions/device-control-message/index.d.ts.map +1 -1
  860. package/widgets/definitions/help-and-service/index.d.ts +1 -1
  861. package/widgets/definitions/help-and-service/index.d.ts.map +1 -1
  862. package/widgets/definitions/html-widget/html-widget.factory.d.ts.map +1 -1
  863. package/widgets/definitions/html-widget/index.d.ts +1 -1
  864. package/widgets/definitions/image/index.d.ts +5 -3
  865. package/widgets/definitions/image/index.d.ts.map +1 -1
  866. package/widgets/definitions/info-gauge/index.d.ts +2 -3
  867. package/widgets/definitions/info-gauge/index.d.ts.map +1 -1
  868. package/widgets/definitions/kpi/index.d.ts +1 -1
  869. package/widgets/definitions/kpi/index.d.ts.map +1 -1
  870. package/widgets/definitions/linear-gauge/index.d.ts +1 -1
  871. package/widgets/definitions/linear-gauge/index.d.ts.map +1 -1
  872. package/widgets/definitions/map/index.d.ts +1 -1
  873. package/widgets/definitions/map/index.d.ts.map +1 -1
  874. package/widgets/definitions/markdown/index.d.ts +5 -3
  875. package/widgets/definitions/markdown/index.d.ts.map +1 -1
  876. package/widgets/definitions/quick-links/index.d.ts +1 -1
  877. package/widgets/definitions/quick-links/index.d.ts.map +1 -1
  878. package/widgets/definitions/radial-gauge/index.d.ts +1 -1
  879. package/widgets/definitions/radial-gauge/index.d.ts.map +1 -1
  880. package/widgets/definitions/silo/index.d.ts +1 -1
  881. package/widgets/definitions/silo/index.d.ts.map +1 -1
  882. package/widgets/definitions/three-d-rotation/index.d.ts +1 -1
  883. package/widgets/definitions/three-d-rotation/index.d.ts.map +1 -1
  884. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  885. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  886. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  887. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  888. package/widgets/implementations/cockpit-welcome/welcome.component.d.ts +3 -2
  889. package/widgets/implementations/cockpit-welcome/welcome.component.d.ts.map +1 -1
  890. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
  891. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -1
  892. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
  893. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
  894. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -1
  895. package/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.d.ts.map +1 -1
  896. package/widgets/implementations/device-management-welcome/welcome.component.d.ts.map +1 -1
  897. package/widgets/implementations/help-and-service-widget/help-and-service-view/help-and-service-view.component.d.ts.map +1 -1
  898. package/widgets/implementations/html-widget/advanced-settings/advanced-settings.component.d.ts.map +1 -1
  899. package/widgets/implementations/html-widget/html-widget-config.service.d.ts.map +1 -1
  900. package/widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.d.ts +5 -3
  901. package/widgets/implementations/html-widget/widget-code-editor-section/widget-code-editor.component.d.ts.map +1 -1
  902. package/widgets/implementations/image/image-widget-config/image-widget-config.component.d.ts.map +1 -1
  903. package/widgets/implementations/image/image-widget.service.d.ts +1 -2
  904. package/widgets/implementations/image/image-widget.service.d.ts.map +1 -1
  905. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
  906. package/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.d.ts.map +1 -1
  907. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  908. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  909. package/widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.d.ts.map +1 -1
  910. package/widgets/implementations/markdown/markdown-widget.service.d.ts.map +1 -1
  911. package/widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.d.ts.map +1 -1
  912. package/widgets/import-export-config/config-target-export.d.ts +3 -1
  913. package/widgets/import-export-config/config-target-export.d.ts.map +1 -1
  914. package/widgets/import-export-config/config-target-import.d.ts +3 -1
  915. package/widgets/import-export-config/config-target-import.d.ts.map +1 -1
  916. package/widgets/import-export-config/device-import-export.d.ts +3 -1
  917. package/widgets/import-export-config/device-import-export.d.ts.map +1 -1
  918. package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DjlpSztw.mjs.map +0 -1
  919. package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-version-history.component-B2zLhv0X.mjs.map +0 -1
  920. 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 * as i2 from '@c8y/ngx-components';
2
- import { gettext, AssetTypesRealtimeService, GroupService, AlertService, ListGroupModule, C8yTranslatePipe, IconDirective, EmptyStateComponent, BottomDrawerRef, FormsModule as FormsModule$1, LoadMoreComponent, BottomDrawerService } from '@c8y/ngx-components';
1
+ import { gettext } from '@c8y/ngx-components/gettext';
3
2
  import * as i0 from '@angular/core';
4
- import { inject, Injectable, Directive, Pipe, viewChild, EventEmitter, effect, ContentChild, Output, Input, Component } from '@angular/core';
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 { isArray, isObjectLike, isEmpty, find, forOwn, get, cloneDeep } from 'lodash-es';
7
- import { firstValueFrom, BehaviorSubject, Subject, takeUntil, debounceTime } from 'rxjs';
8
- import { NgIf, NgClass, NgTemplateOutlet } from '@angular/common';
9
- import * as i1 from '@angular/forms';
10
- import { FormsModule } from '@angular/forms';
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 { gettext as gettext$1 } from '@c8y/ngx-components/gettext';
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 (this.isComplexProperty(property)) {
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, asset) {
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(asset[property.name]);
1146
+ value = JSON.stringify(context[property.name]);
1011
1147
  }
1012
1148
  else if ('keyPath' in property) {
1013
- value = get(asset, property.keyPath);
1149
+ value = this.formatPropertyValue(get(context, property.keyPath));
1014
1150
  }
1015
1151
  else {
1016
- value = asset[property.name];
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(type) {
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$1('{{assetPropertyType}}\n(temporary)'), {
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.addedProperties = [];
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
- propertiesToAdd.forEach(prop => (prop.temporary = true));
1226
- this.addedProperties = this.addedProperties.concat(propertiesToAdd);
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.addedProperties = this.addedProperties.filter(filterFn);
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
- collapseButtonTitle(node) {
1367
- const expanded = this.tree().isExpanded(node);
1368
- return expanded
1369
- ? gettext('Collapse {{ assetPropertyLabel }}')
1370
- : gettext('Expand {{ assetPropertyLabel }}');
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.addedProperties,
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.addedProperties, ...this.extraProperties];
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
- const key = hasKeyPath ? property.keyPath.join('.') : property.name;
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('Regular`properties`'),
1705
- computed: gettext('Computed`properties`')
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
- this.extraProperties = [...this.extraProperties, ...propertiesFromLibrary];
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.extraProperties = this.categorizeAndFlattenHierarchicalProperties([
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
- ...defaultAssetProperties.filter(prop => prop.label.includes(this.inputText?.trim().toLowerCase()))
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\n class=\"input-group input-group-search\"\n >\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Search properties' | translate\"\n placeholder=\"{{ 'Search properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"inputText\"\n (input)=\"onSearch()\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear search' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearSearch()\"\n ></i>\n </span>\n </div>\n</div>\n\n<!-- TODO: uncomment when computed properties are supported https://cumulocity.atlassian.net/browse/MTM-63490 -->\n<!-- <c8y-tabs-outlet\n class=\"elevation-none m-b-16\"\n outletName=\"assetPropertiesDrawerTabs\"\n orientation=\"horizontal\"\n></c8y-tabs-outlet>\n\n<c8y-tab\n [icon]=\"'c8y-css'\"\n [title]=\"'Regular asset properties' | translate\"\n [isActive]=\"selectedTab === 'regular'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.regular | translate\"\n [priority]=\"1000\"\n (onSelect)=\"onTabChange('regular')\"\n></c8y-tab>\n<c8y-tab\n [icon]=\"'bolt'\"\n [title]=\"'Computed asset properties' | translate\"\n [isActive]=\"selectedTab === 'computed'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.computed | translate\"\n [priority]=\"900\"\n (onSelect)=\"onTabChange('computed')\"\n></c8y-tab> -->\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [config]=\"config\"\n [extraProperties]=\"extraProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n <c8y-load-more\n [paging]=\"paging\"\n [useIntersection]=\"true\"\n (onLoad)=\"loadMore()\"\n ></c8y-load-more>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AssetPropertyListComponent, selector: "c8y-asset-property-list", inputs: ["config", "asset", "extraProperties"], outputs: ["selectedProperties"] }, { kind: "component", type: LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
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
- ], template: "<div class=\"card-header separator\">\n <span class=\"h4 card-title\">{{ title | translate }}</span>\n</div>\n\n<div class=\"form-group m-b-8 p-16 d-flex\">\n <div\n class=\"input-group input-group-search\"\n >\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Search properties' | translate\"\n placeholder=\"{{ 'Search properties' | translate }}\"\n role=\"searchbox\"\n type=\"search\"\n autocomplete=\"off\"\n [(ngModel)]=\"inputText\"\n (input)=\"onSearch()\"\n #filter\n />\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length === 0\"\n >\n <i\n class=\"dlt-c8y-icon-search\"\n [c8yIcon]=\"'search'\"\n ></i>\n </span>\n <span\n class=\"input-group-addon\"\n [attr.aria-hidden]=\"true\"\n *ngIf=\"filter.value.length > 0\"\n >\n <i\n class=\"text-muted dlt-c8y-icon-times\"\n [c8yIcon]=\"'times'\"\n [attr.aria-label]=\"'Clear search' | translate\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"clearSearch()\"\n ></i>\n </span>\n </div>\n</div>\n\n<!-- TODO: uncomment when computed properties are supported https://cumulocity.atlassian.net/browse/MTM-63490 -->\n<!-- <c8y-tabs-outlet\n class=\"elevation-none m-b-16\"\n outletName=\"assetPropertiesDrawerTabs\"\n orientation=\"horizontal\"\n></c8y-tabs-outlet>\n\n<c8y-tab\n [icon]=\"'c8y-css'\"\n [title]=\"'Regular asset properties' | translate\"\n [isActive]=\"selectedTab === 'regular'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.regular | translate\"\n [priority]=\"1000\"\n (onSelect)=\"onTabChange('regular')\"\n></c8y-tab>\n<c8y-tab\n [icon]=\"'bolt'\"\n [title]=\"'Computed asset properties' | translate\"\n [isActive]=\"selectedTab === 'computed'\"\n [tabsOutlet]=\"'assetPropertiesDrawerTabs'\"\n [label]=\"tabNames.computed | translate\"\n [priority]=\"900\"\n (onSelect)=\"onTabChange('computed')\"\n></c8y-tab> -->\n\n<div class=\"inner-scroll flex-grow\">\n <c8y-asset-property-list\n class=\"bg-component\"\n [config]=\"config\"\n [extraProperties]=\"extraProperties\"\n (selectedProperties)=\"onSelectedProperties($event)\"\n ></c8y-asset-property-list>\n <c8y-load-more\n [paging]=\"paging\"\n [useIntersection]=\"true\"\n (onLoad)=\"loadMore()\"\n ></c8y-load-more>\n</div>\n\n<div class=\"card-footer text-center p-24 separator flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Select' | translate }}\"\n type=\"button\"\n [disabled]=\"selectIsDisabled()\"\n (click)=\"onSave()\"\n >\n {{ 'Select' | translate }}\n </button>\n</div>\n" }]
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