@c8y/ngx-components 1023.71.1 → 1023.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/asset-properties/index.d.ts +19 -1
  2. package/asset-properties/index.d.ts.map +1 -1
  3. package/cockpit-config/index.d.ts +4 -3
  4. package/cockpit-config/index.d.ts.map +1 -1
  5. package/context-dashboard/index.d.ts +202 -4
  6. package/context-dashboard/index.d.ts.map +1 -1
  7. package/datapoints-export-selector/index.d.ts +8 -1
  8. package/datapoints-export-selector/index.d.ts.map +1 -1
  9. package/device-profile/index.d.ts +8 -1
  10. package/device-profile/index.d.ts.map +1 -1
  11. package/events/cockpit/index.d.ts +6 -0
  12. package/events/cockpit/index.d.ts.map +1 -0
  13. package/events/devicemanagement/index.d.ts +6 -0
  14. package/events/devicemanagement/index.d.ts.map +1 -0
  15. package/events/events-timeline/index.d.ts +10 -10
  16. package/events/events-timeline/index.d.ts.map +1 -1
  17. package/events/index.d.ts +363 -5
  18. package/events/index.d.ts.map +1 -1
  19. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +1 -1
  20. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-alarms.mjs +1 -1
  22. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
  24. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +1 -1
  26. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  27. package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +1 -1
  28. package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs.map +1 -1
  29. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +1 -1
  30. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -2
  32. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-cockpit-config.mjs +8 -11
  34. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  35. package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-CPLDClTp.mjs → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-DX9Rgjgl.mjs} +2 -2
  36. package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-CPLDClTp.mjs.map → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-DX9Rgjgl.mjs.map} +1 -1
  37. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-9be_iMQg.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CRpLJ5H7.mjs} +8 -8
  38. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-9be_iMQg.mjs.map → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CRpLJ5H7.mjs.map} +1 -1
  39. package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-B2em01_W.mjs → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-2rDsrxcs.mjs} +2 -2
  40. package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-B2em01_W.mjs.map → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-2rDsrxcs.mjs.map} +1 -1
  41. package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-CQuGa1RI.mjs → c8y-ngx-components-computed-asset-properties-event-count-config.component-BJNoqWZf.mjs} +2 -2
  42. package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-CQuGa1RI.mjs.map → c8y-ngx-components-computed-asset-properties-event-count-config.component-BJNoqWZf.mjs.map} +1 -1
  43. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-CkmurxJv.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DYac6foX.mjs} +3 -3
  44. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-CkmurxJv.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DYac6foX.mjs.map} +1 -1
  45. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CTK9zNUh.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-3yTe6lIr.mjs} +3 -3
  46. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CTK9zNUh.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-3yTe6lIr.mjs.map} +1 -1
  47. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
  48. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-DsCDppJx.mjs → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C7yXSDYC.mjs} +3 -3
  49. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-DsCDppJx.mjs.map → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C7yXSDYC.mjs.map} +1 -1
  50. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RdLW5nde.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-w8N16Z3t.mjs} +4 -4
  51. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RdLW5nde.mjs.map → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-w8N16Z3t.mjs.map} +1 -1
  52. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +561 -21
  53. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  54. package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-Cek3_qZQ.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DVEnCRzW.mjs} +2 -2
  55. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DVEnCRzW.mjs.map +1 -0
  56. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +2 -2
  57. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +2 -2
  58. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +1 -1
  60. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +1 -1
  62. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  63. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +41 -8
  64. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  65. package/fesm2022/c8y-ngx-components-device-profile.mjs +38 -12
  66. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  67. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +1 -1
  68. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
  69. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +1 -1
  70. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  71. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
  72. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  73. package/fesm2022/c8y-ngx-components-events-cockpit.mjs +54 -0
  74. package/fesm2022/c8y-ngx-components-events-cockpit.mjs.map +1 -0
  75. package/fesm2022/c8y-ngx-components-events-devicemanagement.mjs +79 -0
  76. package/fesm2022/c8y-ngx-components-events-devicemanagement.mjs.map +1 -0
  77. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +30 -23
  78. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
  79. package/fesm2022/c8y-ngx-components-events.mjs +1080 -4
  80. package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
  81. package/fesm2022/c8y-ngx-components-file-preview.mjs +48 -41
  82. package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
  83. package/fesm2022/c8y-ngx-components-files-repository.mjs +1 -1
  84. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  85. package/fesm2022/c8y-ngx-components-global-context.mjs +108 -52
  86. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  87. package/fesm2022/c8y-ngx-components-interval-picker.mjs +3 -3
  88. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  89. package/fesm2022/c8y-ngx-components-location.mjs +1 -1
  90. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  91. package/fesm2022/c8y-ngx-components-operation-picker.mjs +1 -1
  92. package/fesm2022/c8y-ngx-components-operation-picker.mjs.map +1 -1
  93. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +1 -1
  94. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +1 -1
  96. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +1 -1
  98. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +5 -5
  100. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  101. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +2 -2
  102. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  103. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +1 -1
  104. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
  105. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +1 -1
  106. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +1 -1
  108. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +1 -1
  110. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +1 -1
  112. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  113. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
  114. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  115. package/fesm2022/c8y-ngx-components-time-context.mjs +1 -1
  116. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  117. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +1 -1
  118. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  119. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +1 -1
  120. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  121. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +4 -5
  122. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  123. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +4 -5
  124. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  125. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs +1 -1
  126. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs.map +1 -1
  127. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs +1 -1
  128. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs.map +1 -1
  129. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +1 -1
  130. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
  131. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +1 -1
  132. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
  133. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs +1 -1
  134. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs.map +1 -1
  135. package/fesm2022/c8y-ngx-components-widgets-definitions-event-list.mjs +39 -1
  136. package/fesm2022/c8y-ngx-components-widgets-definitions-event-list.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +77 -5
  138. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
  139. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +1 -1
  140. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
  141. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs +1 -1
  142. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
  143. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs +1 -1
  144. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
  145. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs +1 -1
  146. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
  147. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +1 -1
  148. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  149. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +1 -1
  150. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
  151. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +1 -1
  152. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -1
  153. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs +1 -1
  154. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
  155. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs +1 -1
  156. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
  157. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +67 -60
  158. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  159. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +1 -1
  160. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  161. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +236 -0
  162. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs.map +1 -0
  163. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +271 -31
  164. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  165. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +1 -1
  166. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
  167. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +2 -2
  168. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  169. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +1 -1
  170. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  171. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +1 -1
  172. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  173. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +1 -1
  174. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  175. package/fesm2022/c8y-ngx-components.mjs +380 -170
  176. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  177. package/file-preview/index.d.ts +7 -6
  178. package/file-preview/index.d.ts.map +1 -1
  179. package/global-context/index.d.ts +90 -1
  180. package/global-context/index.d.ts.map +1 -1
  181. package/index.d.ts +116 -15
  182. package/index.d.ts.map +1 -1
  183. package/locales/de.po +120 -3
  184. package/locales/es.po +120 -3
  185. package/locales/fr.po +120 -3
  186. package/locales/ja_JP.po +120 -3
  187. package/locales/ko.po +120 -3
  188. package/locales/locales.pot +120 -3
  189. package/locales/nl.po +120 -3
  190. package/locales/pl.po +120 -3
  191. package/locales/pt_BR.po +120 -3
  192. package/locales/zh_CN.po +120 -3
  193. package/locales/zh_TW.po +120 -3
  194. package/package.json +1 -1
  195. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +1 -2
  196. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  197. package/widgets/definitions/alarms/recent-alarms/index.d.ts +1 -2
  198. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  199. package/widgets/definitions/event-list/index.d.ts +44 -1
  200. package/widgets/definitions/event-list/index.d.ts.map +1 -1
  201. package/widgets/implementations/alarms/index.d.ts +8 -1
  202. package/widgets/implementations/alarms/index.d.ts.map +1 -1
  203. package/widgets/implementations/events/index.d.ts +89 -0
  204. package/widgets/implementations/events/index.d.ts.map +1 -0
  205. package/widgets/implementations/html-widget/index.d.ts +69 -9
  206. package/widgets/implementations/html-widget/index.d.ts.map +1 -1
  207. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-Cek3_qZQ.mjs.map +0 -1
@@ -9,7 +9,7 @@ import { get, isEmpty, mapValues, omitBy, keyBy, uniqBy, keys, pickBy, sortBy, t
9
9
  import * as i1$1 from '@c8y/ngx-components/repository/shared';
10
10
  import { PRODUCT_EXPERIENCE_REPOSITORY_SHARED, RepositoryType, RepositorySelectModalComponent, RepositoryItemNameGridColumn, DeviceTypeGridColumn, SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';
11
11
  import { Subject, from, BehaviorSubject, pipe, combineLatest } from 'rxjs';
12
- import { switchMap, map, take, distinctUntilChanged, shareReplay, filter, tap } from 'rxjs/operators';
12
+ import { switchMap, map, take, distinctUntilChanged, shareReplay, filter, tap, debounceTime } from 'rxjs/operators';
13
13
  import { AsyncPipe, NgIf, NgFor, NgTemplateOutlet, NgClass } from '@angular/common';
14
14
  import * as i5 from '@angular/router';
15
15
  import { RouterModule } from '@angular/router';
@@ -894,7 +894,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
894
894
 
895
895
  class DeviceProfileItemListComponent {
896
896
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DeviceProfileItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
897
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: DeviceProfileItemListComponent, isStandalone: true, selector: "c8y-device-profile-item-list", inputs: { icon: "icon", comparisonResults: "comparisonResults", showProfileItems: "showProfileItems", showTextLabel: "showTextLabel" }, ngImport: i0, template: "<div\n class=\"d-contents\"\n *ngFor=\"let comparisonResult of comparisonResults\"\n>\n <div\n class=\"p-l-16 p-r-16\"\n *ngIf=\"showProfileItems\"\n >\n <div class=\"c8y-list__item fit-h\">\n <div\n class=\"c8y-list__item__block\"\n *ngIf=\"comparisonResult.profile\"\n >\n <div class=\"c8y-list__item__icon\">\n <i [c8yIcon]=\"icon\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <ng-container\n *ngTemplateOutlet=\"comparisonResultInfo; context: comparisonResult.profile\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"p-l-16 p-r-16 bg-level-1\">\n <div\n class=\"c8y-list__item bg-level-1\"\n [ngClass]=\"{\n 'has-warning': !!comparisonResult.comparisonAlert\n }\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i [c8yIcon]=\"icon\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <ng-container\n *ngTemplateOutlet=\"\n comparisonResultInfo;\n context: comparisonResult.device ? comparisonResult.device : comparisonResult.profile\n \"\n ></ng-container>\n <c8y-messages\n class=\"m-0\"\n style=\"margin-bottom: calc(var(--margin-base, 8px) * -1)\"\n *ngIf=\"comparisonResult.comparisonAlert\"\n >\n <c8y-message>\n {{ comparisonResult.comparisonAlert | translate }}\n </c8y-message>\n </c8y-messages>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"p-l-16 p-r-16 bg-level-0 hidden-xs hidden-sm\"\n *ngIf=\"!showProfileItems\"\n ></div>\n</div>\n\n<ng-template\n #comparisonResultInfo\n let-name=\"itemName\"\n let-details=\"itemDetails\"\n let-type=\"itemType\"\n>\n <div class=\"content-flex-40\">\n <div class=\"col-5\">\n <span class=\"text-truncate\">\n <span class=\"text-label-small m-r-4\">Name</span>\n <span title=\"{{ name }}\">\n {{ name }}\n </span>\n </span>\n </div>\n <div class=\"col-3\">\n <span\n class=\"text-truncate\"\n *ngIf=\"!!type\"\n >\n <span class=\"text-label-small m-r-4\">Type</span>\n <span title=\"{{ type }}\">\n <span class=\"label label-info m-l-4\">\n {{ type }}\n </span>\n </span>\n </span>\n </div>\n <div class=\"col-4\">\n <span\n class=\"text-truncate\"\n *ngIf=\"showTextLabel && details; else showInfoLabel\"\n >\n <span\n class=\"text-label-small m-r-4\"\n translate\n >\n Version\n </span>\n <span title=\"{{ details }}\">{{ details }}</span>\n </span>\n <ng-template #showInfoLabel>\n <span class=\"label label-info\">{{ details }}</span>\n </ng-template>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
897
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: DeviceProfileItemListComponent, isStandalone: true, selector: "c8y-device-profile-item-list", inputs: { icon: "icon", comparisonResults: "comparisonResults", showProfileItems: "showProfileItems", showTextLabel: "showTextLabel" }, ngImport: i0, template: "<div\n class=\"d-contents\"\n *ngFor=\"let comparisonResult of comparisonResults\"\n>\n <div\n class=\"p-l-16 p-r-16\"\n *ngIf=\"showProfileItems\"\n >\n <div class=\"c8y-list__item fit-h\">\n <div\n class=\"c8y-list__item__block\"\n *ngIf=\"comparisonResult.profile\"\n >\n <div class=\"c8y-list__item__icon\">\n <i [c8yIcon]=\"icon\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <ng-container\n *ngTemplateOutlet=\"comparisonResultInfo; context: comparisonResult.profile\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"p-l-16 p-r-16 bg-level-1\">\n <div\n class=\"c8y-list__item bg-level-1\"\n [ngClass]=\"{\n 'has-warning': !!comparisonResult.comparisonAlert\n }\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i [c8yIcon]=\"icon\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <ng-container\n *ngTemplateOutlet=\"\n comparisonResultInfo;\n context: comparisonResult.device ? comparisonResult.device : comparisonResult.profile\n \"\n ></ng-container>\n <c8y-messages\n class=\"m-0\"\n style=\"margin-bottom: calc(var(--margin-base, 8px) * -1)\"\n *ngIf=\"comparisonResult.comparisonAlert\"\n >\n <c8y-message>\n {{ comparisonResult.comparisonAlert | translate }}\n </c8y-message>\n </c8y-messages>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"p-l-16 p-r-16 bg-level-0 hidden-xs hidden-sm\"\n *ngIf=\"!showProfileItems\"\n ></div>\n</div>\n\n<ng-template\n #comparisonResultInfo\n let-name=\"itemName\"\n let-details=\"itemDetails\"\n let-type=\"itemType\"\n>\n <div class=\"content-flex-40\">\n <div class=\"col-5\">\n <span class=\"text-truncate\">\n <span class=\"text-label-small m-r-4\">Name</span>\n <span title=\"{{ name }}\">\n {{ name }}\n </span>\n </span>\n </div>\n <div class=\"col-3\">\n <span\n class=\"text-truncate\"\n *ngIf=\"!!type\"\n >\n <span class=\"text-label-small m-r-4\">Type</span>\n <span title=\"{{ type }}\">\n <span class=\"label label-info m-l-4\">\n {{ type }}\n </span>\n </span>\n </span>\n </div>\n <div class=\"col-4\">\n <span\n class=\"text-truncate\"\n *ngIf=\"showTextLabel && details; else showInfoLabel\"\n >\n <span\n class=\"text-label-small m-r-4\"\n translate\n >\n Version\n </span>\n <span title=\"{{ details }}\">{{ details }}</span>\n </span>\n <ng-template #showInfoLabel>\n <span class=\"label label-info\">{{ details }}</span>\n </ng-template>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
898
898
  }
899
899
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DeviceProfileItemListComponent, decorators: [{
900
900
  type: Component,
@@ -956,18 +956,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
956
956
  }] } });
957
957
 
958
958
  class DeviceTabProfileComponent {
959
- constructor(deviceRealtime, deviceProfileService, route, operationRealtime, alertService) {
959
+ constructor(deviceRealtime, deviceProfileService, route, operationRealtime, alertService, inventoryService) {
960
960
  this.deviceRealtime = deviceRealtime;
961
961
  this.deviceProfileService = deviceProfileService;
962
962
  this.route = route;
963
963
  this.operationRealtime = operationRealtime;
964
964
  this.alertService = alertService;
965
+ this.inventoryService = inventoryService;
965
966
  this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_DEVICE_PROFILE;
966
967
  this.firmwareItems = [];
967
968
  this.softwareItems = [];
968
969
  this.configurationItems = [];
969
970
  this.pattern$ = new BehaviorSubject('');
970
971
  this.reload$ = new BehaviorSubject(true);
972
+ this.autoSyncProfile = true;
973
+ this.deviceReload$ = new Subject();
971
974
  this.productExperienceEvent = {
972
975
  eventName: PRODUCT_EXPERIENCE_DEVICE_PROFILE.EVENTS.DEVICE_TAB,
973
976
  data: {
@@ -978,6 +981,10 @@ class DeviceTabProfileComponent {
978
981
  this.device = this.route.snapshot.parent.data.contextData;
979
982
  }
980
983
  async ngOnInit() {
984
+ await this.loadDevice();
985
+ this.subscribeToDeviceReload();
986
+ this.subscribeToPatternChanges();
987
+ this.subscribeToOperations();
981
988
  this.getDeviceProfilesAndUpdateProfileItems();
982
989
  this.subscribeToManagedObjects();
983
990
  const supportedSoftwareTypes = new Set(this.device.c8y_SupportedSoftwareTypes);
@@ -995,19 +1002,23 @@ class DeviceTabProfileComponent {
995
1002
  }
996
1003
  async getDeviceProfilesAndUpdateProfileItems() {
997
1004
  this.deviceProfiles$ = combineLatest([this.reload$.pipe(filter(Boolean)), this.pattern$]).pipe(switchMap(([_, name]) => this.deviceProfileService.getDeviceProfilesByDevice(this.device, name)), tap(async (profiles) => {
998
- if (this.device.c8y_Profile) {
1005
+ if (this.autoSyncProfile && this.device.c8y_Profile && !this.pattern$.value) {
999
1006
  const profileId = this.device.c8y_Profile.profileId;
1000
- this.selectedProfile = profiles.data.find(mo => mo.id === profileId);
1007
+ this.selectedProfile = profiles.data.find(({ id }) => id === profileId);
1001
1008
  }
1002
1009
  this.updateProfileItems(this.device, this.selectedProfile);
1003
1010
  this.operation = await this.deviceProfileService.getProfileOperation(this.device.id);
1004
- this.subscribeToOperations();
1005
1011
  }), tap(() => this.reload$.next(false)), takeUntilDestroyed(this.destroyRef));
1006
1012
  }
1007
1013
  selectProfile(mo) {
1014
+ this.autoSyncProfile = false;
1008
1015
  this.selectedProfile = this.toProfileForDevice(mo);
1009
1016
  this.updateProfileItems(this.device, this.selectedProfile);
1010
1017
  }
1018
+ reload() {
1019
+ this.autoSyncProfile = true;
1020
+ this.reload$.next(true);
1021
+ }
1011
1022
  async createOperation() {
1012
1023
  this.operation = await this.deviceProfileService.createProfileOperation(this.device, this.selectedProfile);
1013
1024
  }
@@ -1016,12 +1027,27 @@ class DeviceTabProfileComponent {
1016
1027
  this.softwareItems = this.deviceProfileService.getSoftwareItems(device, profile);
1017
1028
  this.configurationItems = this.deviceProfileService.getConfigurationItems(device, profile);
1018
1029
  }
1030
+ subscribeToPatternChanges() {
1031
+ this.pattern$.pipe(filter(Boolean), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
1032
+ this.autoSyncProfile = false;
1033
+ });
1034
+ }
1035
+ subscribeToDeviceReload() {
1036
+ this.deviceReload$
1037
+ .pipe(debounceTime(100), switchMap(() => from(this.loadDevice())), tap(() => this.updateProfileItems(this.device, this.selectedProfile)), takeUntilDestroyed(this.destroyRef))
1038
+ .subscribe();
1039
+ }
1040
+ async loadDevice() {
1041
+ const device = (await this.inventoryService.detail(this.device.id, { withChildren: false }))
1042
+ .data;
1043
+ this.device = device;
1044
+ }
1019
1045
  subscribeToManagedObjects() {
1020
1046
  this.deviceRealtime
1021
1047
  .onUpdate$(this.device.id)
1022
1048
  .pipe(takeUntilDestroyed(this.destroyRef))
1023
- .subscribe((managedObject) => {
1024
- this.updateProfileItems(managedObject, this.selectedProfile);
1049
+ .subscribe(() => {
1050
+ this.deviceReload$.next();
1025
1051
  });
1026
1052
  this.deviceRealtime
1027
1053
  .onDelete$(this.device.id)
@@ -1054,14 +1080,14 @@ class DeviceTabProfileComponent {
1054
1080
  };
1055
1081
  }
1056
1082
  }
1057
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DeviceTabProfileComponent, deps: [{ token: i2.ManagedObjectRealtimeService }, { token: DeviceProfileService }, { token: i5.ActivatedRoute }, { token: i2.OperationRealtimeService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
1083
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DeviceTabProfileComponent, deps: [{ token: i2.ManagedObjectRealtimeService }, { token: DeviceProfileService }, { token: i5.ActivatedRoute }, { token: i2.OperationRealtimeService }, { token: i2.AlertService }, { token: i1.InventoryService }], target: i0.ɵɵFactoryTarget.Component }); }
1058
1084
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: DeviceTabProfileComponent, isStandalone: true, selector: "c8y-device-tab-profile", providers: [
1059
1085
  ManagedObjectRealtimeService,
1060
1086
  {
1061
1087
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
1062
1088
  useExisting: forwardRef(() => DeviceTabProfileComponent)
1063
1089
  }
1064
- ], ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next(true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reload$.value }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n <div class=\"card--grid grid__col--6-6--md\">\n <!-- AVAILABLE PROFILES -->\n <div class=\"bg-level-0\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Device profile\n </div>\n </div>\n <div class=\"p-16\">\n <form #deviceProfileForm=\"ngForm\">\n <div class=\"input-group\">\n <c8y-typeahead\n class=\"flex-grow\"\n placeholder=\"{{ 'Select device profile' | translate }}\"\n name=\"selectProfile\"\n data-cy=\"device-tab-profile--select-device-profile\"\n [(ngModel)]=\"selectedProfile\"\n (onSearch)=\"pattern$.next($event)\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n (click)=\"selectProfile(profile); pattern$.next('')\"\n >\n <c8y-highlight\n [text]=\"profile.name || '&#45;&#45;'\"\n [pattern]=\"pattern$.value\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Assign device profile' | translate }}\"\n type=\"button\"\n (click)=\"createOperation()\"\n data-cy=\"device-tab-profile--Assign-device-profile-button\"\n [disabled]=\"!selectedProfile?.id\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n >\n <span>{{ 'Assign device profile' | translate }}</span>\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- INSTALL PROFILE OPERATION -->\n <div class=\"bg-level-1\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Currently installed\n </div>\n </div>\n <div class=\"card-block\">\n <c8y-operation-details\n [operation]=\"operation\"\n c8yProductExperience\n inherit\n suppressDataOverriding\n ></c8y-operation-details>\n </div>\n </div>\n </div>\n <div class=\"card--grid__inner-scroll d-col no-align-items\">\n <div class=\"d-contents\">\n <!-- FIRMWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-firmware'\"\n [sectionTitle]=\"'Firmware' | translate\"\n [emptyStateText]=\"'No firmware to display.' | translate\"\n [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"firmwareItems\"\n [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- SOFTWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-tools'\"\n [sectionTitle]=\"'Software' | translate\"\n [emptyStateText]=\"'No software to display.' | translate\"\n [emptyStateDetails]=\"'No software assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"softwareItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.software ||\n selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- CONFIGURATION -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'gears'\"\n [sectionTitle]=\"'Configuration' | translate\"\n [emptyStateText]=\"'No configuration to display' | translate\"\n [emptyStateDetails]=\"'No configuration assigned' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"configurationItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.configuration ||\n selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <!-- fill in the remanining vertical space when empty -->\n <div class=\"card--grid grid__col--6-6--md flex-grow\">\n <div class=\"bg-level-0\"></div>\n <div class=\"bg-level-1\"></div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "title", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: OperationDetailsComponent, selector: "c8y-operation-details", inputs: ["operation"] }, { kind: "component", type: DeviceTabProfileDetailComponent, selector: "c8y-device-tab-profile-detail", inputs: ["sectionTitle", "sectionIcon", "emptyStateText", "emptyStateDetails", "isProfileSelected", "isEmpty", "items", "showTextLabel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
1090
+ ], ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reload$.value }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n <div class=\"card--grid grid__col--6-6--md\">\n <!-- AVAILABLE PROFILES -->\n <div class=\"bg-level-0\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Device profile\n </div>\n </div>\n <div class=\"p-16\">\n <form #deviceProfileForm=\"ngForm\">\n <div class=\"input-group\">\n <c8y-typeahead\n class=\"flex-grow\"\n placeholder=\"{{ 'Select device profile' | translate }}\"\n name=\"selectProfile\"\n data-cy=\"device-tab-profile--select-device-profile\"\n [(ngModel)]=\"selectedProfile\"\n (onSearch)=\"pattern$.next($event)\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n (click)=\"selectProfile(profile); pattern$.next('')\"\n >\n <c8y-highlight\n [text]=\"profile.name || '&#45;&#45;'\"\n [pattern]=\"pattern$.value\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Assign device profile' | translate }}\"\n type=\"button\"\n (click)=\"createOperation()\"\n data-cy=\"device-tab-profile--Assign-device-profile-button\"\n [disabled]=\"!selectedProfile?.id\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n >\n <span>{{ 'Assign device profile' | translate }}</span>\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- INSTALL PROFILE OPERATION -->\n <div class=\"bg-level-1\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Currently installed\n </div>\n </div>\n <div class=\"card-block\">\n <c8y-operation-details\n [operation]=\"operation\"\n c8yProductExperience\n inherit\n suppressDataOverriding\n ></c8y-operation-details>\n </div>\n </div>\n </div>\n <div class=\"card--grid__inner-scroll d-col no-align-items\">\n <div class=\"d-contents\">\n <!-- FIRMWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-firmware'\"\n [sectionTitle]=\"'Firmware' | translate\"\n [emptyStateText]=\"'No firmware to display.' | translate\"\n [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"firmwareItems\"\n [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- SOFTWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-tools'\"\n [sectionTitle]=\"'Software' | translate\"\n [emptyStateText]=\"'No software to display.' | translate\"\n [emptyStateDetails]=\"'No software assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"softwareItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.software ||\n selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- CONFIGURATION -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'gears'\"\n [sectionTitle]=\"'Configuration' | translate\"\n [emptyStateText]=\"'No configuration to display' | translate\"\n [emptyStateDetails]=\"'No configuration assigned' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"configurationItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.configuration ||\n selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <!-- fill in the remanining vertical space when empty -->\n <div class=\"card--grid grid__col--6-6--md flex-grow\">\n <div class=\"bg-level-0\"></div>\n <div class=\"bg-level-1\"></div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "title", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: OperationDetailsComponent, selector: "c8y-operation-details", inputs: ["operation"] }, { kind: "component", type: DeviceTabProfileDetailComponent, selector: "c8y-device-tab-profile-detail", inputs: ["sectionTitle", "sectionIcon", "emptyStateText", "emptyStateDetails", "isProfileSelected", "isEmpty", "items", "showTextLabel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
1065
1091
  }
1066
1092
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DeviceTabProfileComponent, decorators: [{
1067
1093
  type: Component,
@@ -1086,8 +1112,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1086
1112
  OperationDetailsComponent,
1087
1113
  DeviceTabProfileDetailComponent,
1088
1114
  C8yTranslatePipe
1089
- ], template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next(true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reload$.value }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n <div class=\"card--grid grid__col--6-6--md\">\n <!-- AVAILABLE PROFILES -->\n <div class=\"bg-level-0\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Device profile\n </div>\n </div>\n <div class=\"p-16\">\n <form #deviceProfileForm=\"ngForm\">\n <div class=\"input-group\">\n <c8y-typeahead\n class=\"flex-grow\"\n placeholder=\"{{ 'Select device profile' | translate }}\"\n name=\"selectProfile\"\n data-cy=\"device-tab-profile--select-device-profile\"\n [(ngModel)]=\"selectedProfile\"\n (onSearch)=\"pattern$.next($event)\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n (click)=\"selectProfile(profile); pattern$.next('')\"\n >\n <c8y-highlight\n [text]=\"profile.name || '&#45;&#45;'\"\n [pattern]=\"pattern$.value\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Assign device profile' | translate }}\"\n type=\"button\"\n (click)=\"createOperation()\"\n data-cy=\"device-tab-profile--Assign-device-profile-button\"\n [disabled]=\"!selectedProfile?.id\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n >\n <span>{{ 'Assign device profile' | translate }}</span>\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- INSTALL PROFILE OPERATION -->\n <div class=\"bg-level-1\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Currently installed\n </div>\n </div>\n <div class=\"card-block\">\n <c8y-operation-details\n [operation]=\"operation\"\n c8yProductExperience\n inherit\n suppressDataOverriding\n ></c8y-operation-details>\n </div>\n </div>\n </div>\n <div class=\"card--grid__inner-scroll d-col no-align-items\">\n <div class=\"d-contents\">\n <!-- FIRMWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-firmware'\"\n [sectionTitle]=\"'Firmware' | translate\"\n [emptyStateText]=\"'No firmware to display.' | translate\"\n [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"firmwareItems\"\n [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- SOFTWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-tools'\"\n [sectionTitle]=\"'Software' | translate\"\n [emptyStateText]=\"'No software to display.' | translate\"\n [emptyStateDetails]=\"'No software assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"softwareItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.software ||\n selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- CONFIGURATION -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'gears'\"\n [sectionTitle]=\"'Configuration' | translate\"\n [emptyStateText]=\"'No configuration to display' | translate\"\n [emptyStateDetails]=\"'No configuration assigned' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"configurationItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.configuration ||\n selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <!-- fill in the remanining vertical space when empty -->\n <div class=\"card--grid grid__col--6-6--md flex-grow\">\n <div class=\"bg-level-0\"></div>\n <div class=\"bg-level-1\"></div>\n </div>\n </div>\n</div>\n" }]
1090
- }], ctorParameters: () => [{ type: i2.ManagedObjectRealtimeService }, { type: DeviceProfileService }, { type: i5.ActivatedRoute }, { type: i2.OperationRealtimeService }, { type: i2.AlertService }] });
1115
+ ], template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reload$.value }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n <div class=\"card--grid grid__col--6-6--md\">\n <!-- AVAILABLE PROFILES -->\n <div class=\"bg-level-0\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Device profile\n </div>\n </div>\n <div class=\"p-16\">\n <form #deviceProfileForm=\"ngForm\">\n <div class=\"input-group\">\n <c8y-typeahead\n class=\"flex-grow\"\n placeholder=\"{{ 'Select device profile' | translate }}\"\n name=\"selectProfile\"\n data-cy=\"device-tab-profile--select-device-profile\"\n [(ngModel)]=\"selectedProfile\"\n (onSearch)=\"pattern$.next($event)\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n (click)=\"selectProfile(profile); pattern$.next('')\"\n >\n <c8y-highlight\n [text]=\"profile.name || '&#45;&#45;'\"\n [pattern]=\"pattern$.value\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Assign device profile' | translate }}\"\n type=\"button\"\n (click)=\"createOperation()\"\n data-cy=\"device-tab-profile--Assign-device-profile-button\"\n [disabled]=\"!selectedProfile?.id\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n >\n <span>{{ 'Assign device profile' | translate }}</span>\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- INSTALL PROFILE OPERATION -->\n <div class=\"bg-level-1\">\n <div class=\"card-header separator\">\n <div\n class=\"card-title\"\n translate\n >\n Currently installed\n </div>\n </div>\n <div class=\"card-block\">\n <c8y-operation-details\n [operation]=\"operation\"\n c8yProductExperience\n inherit\n suppressDataOverriding\n ></c8y-operation-details>\n </div>\n </div>\n </div>\n <div class=\"card--grid__inner-scroll d-col no-align-items\">\n <div class=\"d-contents\">\n <!-- FIRMWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-firmware'\"\n [sectionTitle]=\"'Firmware' | translate\"\n [emptyStateText]=\"'No firmware to display.' | translate\"\n [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"firmwareItems\"\n [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- SOFTWARE -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'c8y-tools'\"\n [sectionTitle]=\"'Software' | translate\"\n [emptyStateText]=\"'No software to display.' | translate\"\n [emptyStateDetails]=\"'No software assigned.' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"softwareItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.software ||\n selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <div class=\"d-contents\">\n <!-- CONFIGURATION -->\n <c8y-device-tab-profile-detail\n class=\"d-contents\"\n [sectionIcon]=\"'gears'\"\n [sectionTitle]=\"'Configuration' | translate\"\n [emptyStateText]=\"'No configuration to display' | translate\"\n [emptyStateDetails]=\"'No configuration assigned' | translate\"\n [isProfileSelected]=\"!!selectedProfile\"\n [items]=\"configurationItems\"\n [isEmpty]=\"\n !selectedProfile?.c8y_DeviceProfile?.configuration ||\n selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n \"\n ></c8y-device-tab-profile-detail>\n </div>\n <!-- fill in the remanining vertical space when empty -->\n <div class=\"card--grid grid__col--6-6--md flex-grow\">\n <div class=\"bg-level-0\"></div>\n <div class=\"bg-level-1\"></div>\n </div>\n </div>\n</div>\n" }]
1116
+ }], ctorParameters: () => [{ type: i2.ManagedObjectRealtimeService }, { type: DeviceProfileService }, { type: i5.ActivatedRoute }, { type: i2.OperationRealtimeService }, { type: i2.AlertService }, { type: i1.InventoryService }] });
1091
1117
 
1092
1118
  const deviceProfilesRoutes = [
1093
1119
  {