@c8y/ngx-components 1024.10.5 → 1024.13.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 (254) hide show
  1. package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +16 -16
  2. package/fesm2022/c8y-ngx-components-advanced-software-management.mjs +7 -7
  3. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +51 -33
  4. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +25 -25
  6. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-ai.mjs +3 -3
  8. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +40 -40
  9. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +4 -4
  10. package/fesm2022/c8y-ngx-components-alarms.mjs +76 -76
  11. package/fesm2022/c8y-ngx-components-api.mjs +7 -7
  12. package/fesm2022/c8y-ngx-components-app-logs.mjs +10 -10
  13. package/fesm2022/c8y-ngx-components-application-access-list.mjs +12 -12
  14. package/fesm2022/c8y-ngx-components-application-access-user-application-access-user-details-wrapper.mjs +3 -3
  15. package/fesm2022/c8y-ngx-components-application-select.mjs +3 -3
  16. package/fesm2022/c8y-ngx-components-asset-properties.mjs +48 -48
  17. package/fesm2022/{c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs → c8y-ngx-components-asset-property-grid.component-DiyBj-XO.mjs} +13 -13
  18. package/fesm2022/{c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs.map → c8y-ngx-components-asset-property-grid.component-DiyBj-XO.mjs.map} +1 -1
  19. package/fesm2022/c8y-ngx-components-assets-navigator.mjs +32 -32
  20. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +120 -120
  21. package/fesm2022/c8y-ngx-components-binary-file-download.mjs +7 -7
  22. package/fesm2022/c8y-ngx-components-bookmarks.mjs +13 -13
  23. package/fesm2022/c8y-ngx-components-branding-base-branding.mjs +4 -4
  24. package/fesm2022/c8y-ngx-components-branding-dark-theme.mjs +7 -7
  25. package/fesm2022/c8y-ngx-components-branding-extra-css-branding-editor.mjs +7 -7
  26. package/fesm2022/c8y-ngx-components-branding-plain-branding-editor-lazy.mjs +3 -3
  27. package/fesm2022/c8y-ngx-components-branding-plain-branding-editor.mjs +7 -7
  28. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +17 -15
  29. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +6 -6
  31. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +36 -36
  32. package/fesm2022/c8y-ngx-components-branding-shared.mjs +13 -13
  33. package/fesm2022/c8y-ngx-components-child-devices.mjs +13 -13
  34. package/fesm2022/c8y-ngx-components-cockpit-config.mjs +40 -40
  35. package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-BSxOT0SU.mjs → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-QfHyUsqG.mjs} +4 -4
  36. package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-BSxOT0SU.mjs.map → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-QfHyUsqG.mjs.map} +1 -1
  37. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-BSeGaS86.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-DreEjPAV.mjs} +11 -11
  38. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-BSeGaS86.mjs.map → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-DreEjPAV.mjs.map} +1 -1
  39. package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-C9_wOe7Q.mjs → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-vwNRqIEN.mjs} +4 -4
  40. package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-C9_wOe7Q.mjs.map → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-vwNRqIEN.mjs.map} +1 -1
  41. package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-BkWl-4Xt.mjs → c8y-ngx-components-computed-asset-properties-event-count-config.component-BTfPf6IZ.mjs} +4 -4
  42. package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-BkWl-4Xt.mjs.map → c8y-ngx-components-computed-asset-properties-event-count-config.component-BTfPf6IZ.mjs.map} +1 -1
  43. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DXirzI0z.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-B2z2tGM7.mjs} +5 -5
  44. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DXirzI0z.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-B2z2tGM7.mjs.map} +1 -1
  45. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DTOHhXlH.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CwWLXBUt.mjs} +5 -5
  46. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DTOHhXlH.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CwWLXBUt.mjs.map} +1 -1
  47. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
  48. package/fesm2022/c8y-ngx-components-connectivity.mjs +53 -53
  49. package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs +10 -10
  50. package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs +12 -10
  51. package/fesm2022/c8y-ngx-components-context-dashboard-asset-view.mjs.map +1 -1
  52. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +11 -11
  53. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-DVP1ld4m.mjs → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-ly9fklRG.mjs} +4 -4
  54. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-DVP1ld4m.mjs.map → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-ly9fklRG.mjs.map} +1 -1
  55. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-B8yNG85v.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DA9DFUIL.mjs} +10 -10
  56. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-B8yNG85v.mjs.map → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DA9DFUIL.mjs.map} +1 -1
  57. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-BUCVA0RW.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-CiHrXzWC.mjs} +4 -4
  58. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-BUCVA0RW.mjs.map → c8y-ngx-components-context-dashboard-dashboard-version-history.component-CiHrXzWC.mjs.map} +1 -1
  59. package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs +10 -10
  60. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +12 -10
  61. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs +3 -3
  63. package/fesm2022/c8y-ngx-components-context-dashboard-state.mjs +3 -3
  64. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +131 -124
  65. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  66. package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-BZXZ_lDq.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-Nbg_Z47C.mjs} +16 -16
  67. package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-BZXZ_lDq.mjs.map → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-Nbg_Z47C.mjs.map} +1 -1
  68. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +12 -12
  69. package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs +6 -6
  70. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +28 -28
  71. package/fesm2022/c8y-ngx-components-data-broker.mjs +7 -7
  72. package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs +3 -3
  73. package/fesm2022/c8y-ngx-components-data-grid-columns.mjs +3 -3
  74. package/fesm2022/c8y-ngx-components-data-preparation.mjs +7 -7
  75. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +26 -26
  76. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  77. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +13 -13
  78. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +3 -3
  79. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +3 -3
  80. package/fesm2022/c8y-ngx-components-datapoint-library-services.mjs +3 -3
  81. package/fesm2022/c8y-ngx-components-datapoint-library.mjs +4 -4
  82. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +46 -46
  83. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +36 -36
  84. package/fesm2022/c8y-ngx-components-default-subscriptions.mjs +16 -16
  85. package/fesm2022/c8y-ngx-components-device-enrolment-modal.mjs +9 -9
  86. package/fesm2022/c8y-ngx-components-device-enrolment.mjs +6 -6
  87. package/fesm2022/c8y-ngx-components-device-grid.mjs +43 -43
  88. package/fesm2022/c8y-ngx-components-device-list.mjs +22 -22
  89. package/fesm2022/c8y-ngx-components-device-map.mjs +12 -12
  90. package/fesm2022/c8y-ngx-components-device-profile.mjs +34 -34
  91. package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs +3 -3
  92. package/fesm2022/c8y-ngx-components-device-protocols.mjs +16 -16
  93. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +13 -13
  94. package/fesm2022/c8y-ngx-components-device-shell.mjs +34 -34
  95. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  96. package/fesm2022/c8y-ngx-components-diagnostics.mjs +13 -13
  97. package/fesm2022/c8y-ngx-components-echart.mjs +30 -30
  98. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +64 -56
  99. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  100. package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs +7 -7
  101. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +10 -10
  102. package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +7 -7
  103. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +46 -46
  104. package/fesm2022/c8y-ngx-components-ecosystem.mjs +82 -82
  105. package/fesm2022/c8y-ngx-components-editor.mjs +6 -6
  106. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +3 -3
  107. package/fesm2022/c8y-ngx-components-events.mjs +33 -33
  108. package/fesm2022/c8y-ngx-components-exports-list.mjs +6 -6
  109. package/fesm2022/c8y-ngx-components-feature-toggles-list.mjs +6 -6
  110. package/fesm2022/c8y-ngx-components-file-preview.mjs +7 -7
  111. package/fesm2022/c8y-ngx-components-files-repository.mjs +19 -19
  112. package/fesm2022/c8y-ngx-components-global-context.mjs +136 -136
  113. package/fesm2022/c8y-ngx-components-group-breadcrumbs.mjs +6 -6
  114. package/fesm2022/c8y-ngx-components-icon-selector.mjs +51 -45
  115. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  116. package/fesm2022/c8y-ngx-components-interval-picker.mjs +3 -3
  117. package/fesm2022/c8y-ngx-components-location.mjs +28 -28
  118. package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +16 -16
  119. package/fesm2022/c8y-ngx-components-map.mjs +19 -19
  120. package/fesm2022/c8y-ngx-components-messaging-management.mjs +55 -55
  121. package/fesm2022/c8y-ngx-components-operation-picker.mjs +9 -9
  122. package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs +7 -7
  123. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +19 -19
  124. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -7
  125. package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +13 -13
  126. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +13 -13
  127. package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs +7 -7
  128. package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs +7 -7
  129. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +3 -3
  130. package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs +7 -7
  131. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +7 -7
  132. package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +12 -12
  133. package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +13 -13
  134. package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs +7 -7
  135. package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +10 -10
  136. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +14 -14
  137. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  138. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +7 -7
  139. package/fesm2022/c8y-ngx-components-operations-shared.mjs +10 -10
  140. package/fesm2022/c8y-ngx-components-operations-status-filter.mjs +7 -7
  141. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +7 -7
  142. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +13 -13
  143. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +13 -13
  144. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +13 -13
  145. package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs +13 -13
  146. package/fesm2022/c8y-ngx-components-operations.mjs +7 -7
  147. package/fesm2022/c8y-ngx-components-pending-mo-request.mjs +7 -7
  148. package/fesm2022/c8y-ngx-components-platform-configuration.mjs +10 -10
  149. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +38 -38
  150. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +58 -58
  151. package/fesm2022/c8y-ngx-components-register-device.mjs +58 -58
  152. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +9 -9
  153. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +3 -3
  154. package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +3 -3
  155. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +6 -6
  156. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +3 -3
  157. package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +3 -3
  158. package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +3 -3
  159. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +3 -3
  160. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +3 -3
  161. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +6 -6
  162. package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +3 -3
  163. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +6 -6
  164. package/fesm2022/c8y-ngx-components-replace-device.mjs +10 -10
  165. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +21 -19
  166. package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
  167. package/fesm2022/c8y-ngx-components-reports.mjs +19 -19
  168. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +48 -48
  169. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +33 -33
  170. package/fesm2022/c8y-ngx-components-repository-shared.mjs +34 -34
  171. package/fesm2022/c8y-ngx-components-repository-software.mjs +42 -42
  172. package/fesm2022/c8y-ngx-components-repository.mjs +4 -4
  173. package/fesm2022/c8y-ngx-components-search.mjs +19 -19
  174. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +6 -6
  175. package/fesm2022/c8y-ngx-components-sensor-phone.mjs +7 -7
  176. package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +3 -3
  177. package/fesm2022/c8y-ngx-components-services-shared.mjs +5 -5
  178. package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -1
  179. package/fesm2022/c8y-ngx-components-services.mjs +29 -29
  180. package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +16 -16
  181. package/fesm2022/c8y-ngx-components-sms-gateway.mjs +7 -7
  182. package/fesm2022/c8y-ngx-components-static-assets-data.mjs +3 -3
  183. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +9 -9
  184. package/fesm2022/c8y-ngx-components-static-assets.mjs +6 -6
  185. package/fesm2022/c8y-ngx-components-sub-assets.mjs +60 -60
  186. package/fesm2022/c8y-ngx-components-tenants.mjs +40 -40
  187. package/fesm2022/c8y-ngx-components-time-context.mjs +6 -6
  188. package/fesm2022/c8y-ngx-components-tracking.mjs +12 -12
  189. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +3 -3
  190. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +12 -12
  191. package/fesm2022/c8y-ngx-components-translation-editor.mjs +6 -6
  192. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +33 -33
  193. package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +4 -4
  194. package/fesm2022/c8y-ngx-components-upgrade.mjs +64 -47
  195. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  196. package/fesm2022/c8y-ngx-components-user-roles.mjs +10 -10
  197. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs +6 -6
  198. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +3 -3
  199. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs +3 -3
  200. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +6 -6
  201. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs +6 -6
  202. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +19 -19
  203. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +3 -3
  204. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +33 -33
  205. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-legacy-welcome.mjs +3 -3
  206. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs +3 -3
  207. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +8 -8
  208. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  209. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +12 -12
  210. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +21 -21
  211. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs +3 -3
  212. package/fesm2022/c8y-ngx-components-widgets-implementations-device-management-welcome.mjs +10 -10
  213. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +6 -6
  214. package/fesm2022/c8y-ngx-components-widgets-implementations-help-and-service-widget.mjs +3 -3
  215. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +24 -24
  216. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +9 -9
  217. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +18 -18
  218. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +6 -6
  219. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +6 -6
  220. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +9 -9
  221. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +9 -9
  222. package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs +9 -9
  223. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +18 -18
  224. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +21 -21
  225. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
  226. package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs +9 -9
  227. package/fesm2022/c8y-ngx-components.mjs +1442 -1433
  228. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  229. package/locales/de.po +18 -6
  230. package/locales/es.po +18 -6
  231. package/locales/fr.po +18 -6
  232. package/locales/ja_JP.po +18 -6
  233. package/locales/ko.po +18 -6
  234. package/locales/locales.pot +53 -46
  235. package/locales/nl.po +18 -6
  236. package/locales/pl.po +18 -6
  237. package/locales/pt_BR.po +18 -6
  238. package/locales/zh_CN.po +18 -6
  239. package/locales/zh_TW.po +18 -6
  240. package/package.json +1 -1
  241. package/types/c8y-ngx-components-ai-agent-chat.d.ts +10 -2
  242. package/types/c8y-ngx-components-ai-agent-chat.d.ts.map +1 -1
  243. package/types/c8y-ngx-components-branding-shared-data.d.ts +22 -1
  244. package/types/c8y-ngx-components-branding-shared-data.d.ts.map +1 -1
  245. package/types/c8y-ngx-components-context-dashboard-asset-view.d.ts.map +1 -1
  246. package/types/c8y-ngx-components-context-dashboard-device-view.d.ts.map +1 -1
  247. package/types/c8y-ngx-components-context-dashboard.d.ts +4 -3
  248. package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
  249. package/types/c8y-ngx-components-ecosystem-application-plugins.d.ts.map +1 -1
  250. package/types/c8y-ngx-components-icon-selector.d.ts +8 -2
  251. package/types/c8y-ngx-components-icon-selector.d.ts.map +1 -1
  252. package/types/c8y-ngx-components-report-dashboard.d.ts.map +1 -1
  253. package/types/c8y-ngx-components.d.ts +21 -7
  254. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -39,10 +39,10 @@ class DeviceProvisionedCertificatesService {
39
39
  }
40
40
  return data.userName;
41
41
  }
42
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesService, deps: [{ token: i1.UserService }, { token: i1.FetchClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
43
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesService }); }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesService, deps: [{ token: i1.UserService }, { token: i1.FetchClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
43
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesService }); }
44
44
  }
45
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesService, decorators: [{
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesService, decorators: [{
46
46
  type: Injectable
47
47
  }], ctorParameters: () => [{ type: i1.UserService }, { type: i1.FetchClient }] });
48
48
 
@@ -63,10 +63,10 @@ class DeviceProvisionedCertificatesGuard {
63
63
  return false;
64
64
  }
65
65
  }
66
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesGuard, deps: [{ token: DeviceProvisionedCertificatesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
67
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesGuard }); }
66
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesGuard, deps: [{ token: DeviceProvisionedCertificatesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
67
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesGuard }); }
68
68
  }
69
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesGuard, decorators: [{
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesGuard, decorators: [{
70
70
  type: Injectable
71
71
  }], ctorParameters: () => [{ type: DeviceProvisionedCertificatesService }] });
72
72
 
@@ -207,10 +207,10 @@ class DeviceTabProvisionedCertificatesComponent {
207
207
  cancel: gettext('Cancel')
208
208
  });
209
209
  }
210
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceTabProvisionedCertificatesComponent, deps: [{ token: i1$1.AlertService }, { token: i1$1.ModalService }, { token: DeviceProvisionedCertificatesService }, { token: i1.CrlService }, { token: i4.ActivatedRoute }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
211
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DeviceTabProvisionedCertificatesComponent, isStandalone: true, selector: "device-tab-serials-component", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: ["dataGrid"], descendants: true }], 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': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-data-grid\n [title]=\"tableTitle | translate\"\n #dataGrid\n [columns]=\"columns\"\n [rows]=\"rows$ | async\"\n [pagination]=\"pagination\"\n [actionControls]=\"actionControls\"\n [bulkActionControls]=\"bulkActionControls\"\n [displayOptions]=\"displayOptions\"\n [hideReload]=\"true\"\n [selectable]=\"true\"\n>\n @if ((rows$ | async)?.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No provisioned certificates to display.' | translate\"\n ></c8y-ui-empty-state>\n }\n\n <c8y-column name=\"serialNumber\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"text-truncate\"\n title=\"{{ context.property.header | translate }}: {{ context.value }}\"\n >\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"notBefore\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"text-truncate\"\n title=\"{{ context.property.header | translate }}: {{ context.value | c8yDate }}\"\n >\n @if (context.value) {\n <span>\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n <span>{{ context.value | c8yDate }}</span>\n </span>\n }\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"notAfter\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let expirationHighlight = getExpirationHighlight(context.item);\n <span\n [title]=\"\n (context.property.header | translate) +\n ': ' +\n (context.value | c8yDate) +\n (expirationHighlight?.tooltipText\n ? ' - ' + (expirationHighlight?.tooltipText | translate)\n : '')\n \"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n @if (expirationHighlight?.expired) {\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n } @else {\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n }\n <ng-template #expirationDateTpl>\n @if (expirationHighlight?.icon) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n ></i>\n }\n <span>{{ context.value | c8yDate }}</span>\n </ng-template>\n </span>\n </ng-container>\n </c8y-column>\n</c8y-data-grid>\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: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "directive", type: CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
210
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceTabProvisionedCertificatesComponent, deps: [{ token: i1$1.AlertService }, { token: i1$1.ModalService }, { token: DeviceProvisionedCertificatesService }, { token: i1.CrlService }, { token: i4.ActivatedRoute }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
211
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: DeviceTabProvisionedCertificatesComponent, isStandalone: true, selector: "device-tab-serials-component", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: ["dataGrid"], descendants: true }], 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': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-data-grid\n [title]=\"tableTitle | translate\"\n #dataGrid\n [columns]=\"columns\"\n [rows]=\"rows$ | async\"\n [pagination]=\"pagination\"\n [actionControls]=\"actionControls\"\n [bulkActionControls]=\"bulkActionControls\"\n [displayOptions]=\"displayOptions\"\n [hideReload]=\"true\"\n [selectable]=\"true\"\n>\n @if ((rows$ | async)?.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No provisioned certificates to display.' | translate\"\n ></c8y-ui-empty-state>\n }\n\n <c8y-column name=\"serialNumber\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"text-truncate\"\n title=\"{{ context.property.header | translate }}: {{ context.value }}\"\n >\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"notBefore\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"text-truncate\"\n title=\"{{ context.property.header | translate }}: {{ context.value | c8yDate }}\"\n >\n @if (context.value) {\n <span>\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n <span>{{ context.value | c8yDate }}</span>\n </span>\n }\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"notAfter\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let expirationHighlight = getExpirationHighlight(context.item);\n <span\n [title]=\"\n (context.property.header | translate) +\n ': ' +\n (context.value | c8yDate) +\n (expirationHighlight?.tooltipText\n ? ' - ' + (expirationHighlight?.tooltipText | translate)\n : '')\n \"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n @if (expirationHighlight?.expired) {\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n } @else {\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n }\n <ng-template #expirationDateTpl>\n @if (expirationHighlight?.icon) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n ></i>\n }\n <span>{{ context.value | c8yDate }}</span>\n </ng-template>\n </span>\n </ng-container>\n </c8y-column>\n</c8y-data-grid>\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: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "directive", type: CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
212
212
  }
213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceTabProvisionedCertificatesComponent, decorators: [{
213
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceTabProvisionedCertificatesComponent, decorators: [{
214
214
  type: Component,
215
215
  args: [{ selector: 'device-tab-serials-component', imports: [
216
216
  ActionBarItemComponent,
@@ -231,14 +231,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
231
231
  }] } });
232
232
 
233
233
  class DeviceProvisionedCertificatesModule {
234
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
235
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesModule, imports: [CoreModule,
234
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
235
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesModule, imports: [CoreModule,
236
236
  TooltipModule,
237
237
  ReactiveFormsModule,
238
238
  ButtonsModule,
239
239
  PopoverModule,
240
240
  DeviceTabProvisionedCertificatesComponent] }); }
241
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesModule, providers: [
241
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesModule, providers: [
242
242
  hookRoute([
243
243
  {
244
244
  context: ViewContext.Device,
@@ -258,7 +258,7 @@ class DeviceProvisionedCertificatesModule {
258
258
  PopoverModule,
259
259
  DeviceTabProvisionedCertificatesComponent] }); }
260
260
  }
261
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceProvisionedCertificatesModule, decorators: [{
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceProvisionedCertificatesModule, decorators: [{
262
262
  type: NgModule,
263
263
  args: [{
264
264
  exports: [],
@@ -12,17 +12,17 @@ import { of, BehaviorSubject, pipe, Subject } from 'rxjs';
12
12
  import { map, startWith, takeUntil, filter } from 'rxjs/operators';
13
13
  import * as i6 from '@angular/forms';
14
14
  import { FormsModule } from '@angular/forms';
15
- import { NgFor, NgIf, AsyncPipe, CommonModule } from '@angular/common';
15
+ import { AsyncPipe, NgFor, NgIf, CommonModule } from '@angular/common';
16
16
  import { OperationsTimelineComponent, OperationsTimelineModule } from '@c8y/ngx-components/operations/operations-timeline';
17
17
 
18
18
  class CommandTemplates extends UpgradeComponent {
19
19
  constructor(elementRef, injector) {
20
20
  super('c8yCommandTemplates', elementRef, injector);
21
21
  }
22
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplates, deps: [{ token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
23
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: CommandTemplates, isStandalone: true, selector: "c8y-command-templates-directive", outputs: { close: "close", dismiss: "dismiss" }, usesInheritance: true, ngImport: i0 }); }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplates, deps: [{ token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
23
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.19", type: CommandTemplates, isStandalone: true, selector: "c8y-command-templates-directive", outputs: { close: "close", dismiss: "dismiss" }, usesInheritance: true, ngImport: i0 }); }
24
24
  }
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplates, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplates, decorators: [{
26
26
  type: Directive,
27
27
  args: [{ selector: 'c8y-command-templates-directive' }]
28
28
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Injector }], propDecorators: { close: [{
@@ -40,8 +40,8 @@ class CommandTemplatesComponent {
40
40
  this.modalRef = modalRef;
41
41
  this.onTemplateSelected = new EventEmitter();
42
42
  }
43
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplatesComponent, deps: [{ token: i1.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
44
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: CommandTemplatesComponent, isStandalone: true, selector: "c8y-command-templates", providers: [
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplatesComponent, deps: [{ token: i1.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
44
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: CommandTemplatesComponent, isStandalone: true, selector: "c8y-command-templates", providers: [
45
45
  {
46
46
  deps: ['$injector'],
47
47
  provide: '$scope',
@@ -52,7 +52,7 @@ class CommandTemplatesComponent {
52
52
  (dismiss)="modalRef.hide()"
53
53
  ></c8y-command-templates-directive>`, isInline: true, dependencies: [{ kind: "directive", type: CommandTemplates, selector: "c8y-command-templates-directive", outputs: ["close", "dismiss"] }] }); }
54
54
  }
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplatesComponent, decorators: [{
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplatesComponent, decorators: [{
56
56
  type: Component,
57
57
  args: [{
58
58
  selector: 'c8y-command-templates',
@@ -72,11 +72,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
72
72
  }], ctorParameters: () => [{ type: i1.BsModalRef }] });
73
73
 
74
74
  class CommandTemplatesModule {
75
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplatesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
76
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplatesModule, imports: [CommandTemplates, CommandTemplatesComponent], exports: [CommandTemplatesComponent] }); }
77
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplatesModule }); }
75
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplatesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
76
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplatesModule, imports: [CommandTemplates, CommandTemplatesComponent], exports: [CommandTemplatesComponent] }); }
77
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplatesModule }); }
78
78
  }
79
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommandTemplatesModule, decorators: [{
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CommandTemplatesModule, decorators: [{
80
80
  type: NgModule,
81
81
  args: [{
82
82
  imports: [CommandTemplates, CommandTemplatesComponent],
@@ -93,10 +93,10 @@ class DeviceShellGuard {
93
93
  const supportedOperations = (device && device.c8y_SupportedOperations) || [];
94
94
  return supportedOperations.indexOf(this.operation) >= 0;
95
95
  }
96
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
97
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellGuard }); }
96
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
97
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellGuard }); }
98
98
  }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellGuard, decorators: [{
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellGuard, decorators: [{
100
100
  type: Injectable
101
101
  }] });
102
102
 
@@ -130,7 +130,7 @@ class DeviceShellService {
130
130
  createCommandOperation(deviceId, command, deliveryType) {
131
131
  const operation = {
132
132
  deviceId,
133
- description: gettext('Execute shell command') + (command.name ? `: ${command.name}` : ''),
133
+ description: command.text ?? 'Execute shell command',
134
134
  deliveryType: deliveryType === CommandDeliveryType.SMS ? CommandDeliveryType.SMS : undefined,
135
135
  c8y_Command: {
136
136
  text: command.text
@@ -194,19 +194,19 @@ class DeviceShellService {
194
194
  getExtendedTemplates(templates, syntax, deviceType) {
195
195
  return (templates || []).map(t => ({ ...t, syntax, deviceType }));
196
196
  }
197
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellService, deps: [{ token: i2.OptionsService }, { token: i2$1.OperationService }, { token: i2$1.InventoryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
198
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellService }); }
197
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellService, deps: [{ token: i2.OptionsService }, { token: i2$1.OperationService }, { token: i2$1.InventoryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
198
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellService }); }
199
199
  }
200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellService, decorators: [{
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellService, decorators: [{
201
201
  type: Injectable
202
202
  }], ctorParameters: () => [{ type: i2.OptionsService }, { type: i2$1.OperationService }, { type: i2$1.InventoryService }] });
203
203
 
204
204
  class DeviceShellSharedModule {
205
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellSharedModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
206
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellSharedModule }); }
207
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellSharedModule, providers: [DeviceShellService] }); }
205
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellSharedModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
206
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellSharedModule }); }
207
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellSharedModule, providers: [DeviceShellService] }); }
208
208
  }
209
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellSharedModule, decorators: [{
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellSharedModule, decorators: [{
210
210
  type: NgModule,
211
211
  args: [{
212
212
  providers: [DeviceShellService]
@@ -291,10 +291,10 @@ class DeviceShellComponent {
291
291
  this.destroyed$.next();
292
292
  this.destroyed$.complete();
293
293
  }
294
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellComponent, deps: [{ token: DeviceShellService }, { token: i2.OperationRealtimeService }, { token: i2.ManagedObjectRealtimeService }, { token: i2$1.OperationService }, { token: i4.ActivatedRoute }, { token: i1.BsModalService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
295
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: DeviceShellComponent, isStandalone: true, selector: "c8y-device-shell", providers: [OperationRealtimeService, ManagedObjectRealtimeService], ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"operationRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-grid grid__col--6-6--md\">\n <div class=\"inner-scroll d-flex d-col bg-level-0\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Command' | translate }}\n </div>\n </div>\n\n <div class=\"card-block d-flex d-col flex-grow large-padding\">\n <div class=\"d-flex p-b-16\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"getPredefinedCommand()\"\n [title]=\"'Display a list of predefined commands' | translate\"\n data-cy=\"shell--predefined-commands\"\n >\n {{ 'Predefined commands' | translate }}\n </button>\n\n <div class=\"m-l-auto\">\n <device-status [mo]=\"device$ | async\"></device-status>\n </div>\n </div>\n <textarea\n [attr.aria-label]=\"'Commands' | translate\"\n class=\"form-control inner-scroll flex-grow bg-level-2 text-monospace\"\n [(ngModel)]=\"command.text\"\n data-cy=\"shell-component--commands\"\n (ngModelChange)=\"$event || resetSupportedDeliveryTypes()\"\n placeholder=\"{{ 'Add commands or use predefined commands above.' | translate }}\"\n ></textarea>\n </div>\n\n <div class=\"card-footer large-padding separator\">\n <ng-container *ngFor=\"let deliveryType of deliveryTypes\">\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n *ngIf=\"deliveryType.isSupportedByCommand\"\n [disabled]=\"!command?.text || (sendingCommand$ | async)\"\n (click)=\"execute(deliveryType.name)\"\n >\n <span\n [title]=\"\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n \"\n >\n {{\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n }}\n </span>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Operations' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <c8y-operations-timeline\n [operations]=\"operations\"\n [sourceId]=\"device.id\"\n [filterPipe]=\"filterPipe\"\n [bodyTemplate]=\"timelineItemBody\"\n [footerTemplates]=\"[timelineItemFooter]\"\n [propertiesToHide]=\"['c8y_Command']\"\n ></c8y-operations-timeline>\n <ng-template #timelineItemBody let-operation>\n <small>{{ operation.c8y_Command?.text || operation.description }}</small>\n </ng-template>\n <ng-template #timelineItemFooter let-operation>\n <div *ngIf=\"operation.c8y_Command?.text\">\n <div class=\"legend form-block\" translate>Command</div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.text}}</code></pre>\n </div>\n <div *ngIf=\"operation.c8y_Command?.result\">\n <div class=\"legend form-block\" translate>Response</div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.result}}</code></pre>\n </div>\n </ng-template>\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: "component", type: RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: DeviceStatusComponent, selector: "device-status, c8y-device-status", inputs: ["mo", "size"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: OperationsTimelineComponent, selector: "c8y-operations-timeline", inputs: ["operations", "sourceId", "filterPipe", "loadMoreMode", "bodyTemplate", "footerTemplates", "propertiesToHide"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
294
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellComponent, deps: [{ token: DeviceShellService }, { token: i2.OperationRealtimeService }, { token: i2.ManagedObjectRealtimeService }, { token: i2$1.OperationService }, { token: i4.ActivatedRoute }, { token: i1.BsModalService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
295
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: DeviceShellComponent, isStandalone: true, selector: "c8y-device-shell", providers: [OperationRealtimeService, ManagedObjectRealtimeService], ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"operationRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-grid grid__col--6-6--md\">\n <div class=\"inner-scroll d-flex d-col bg-level-0\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Command' | translate }}\n </div>\n </div>\n\n <div class=\"card-block d-flex d-col flex-grow large-padding\">\n <div class=\"d-flex p-b-16\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Display a list of predefined commands' | translate\"\n type=\"button\"\n (click)=\"getPredefinedCommand()\"\n data-cy=\"shell--predefined-commands\"\n >\n {{ 'Predefined commands' | translate }}\n </button>\n\n <div class=\"m-l-auto\">\n <device-status [mo]=\"device$ | async\"></device-status>\n </div>\n </div>\n <textarea\n class=\"form-control inner-scroll flex-grow bg-level-2 text-monospace\"\n [attr.aria-label]=\"'Commands' | translate\"\n placeholder=\"{{ 'Add commands or use predefined commands above.' | translate }}\"\n [(ngModel)]=\"command.text\"\n data-cy=\"shell-component--commands\"\n (ngModelChange)=\"$event || resetSupportedDeliveryTypes()\"\n ></textarea>\n </div>\n\n <div class=\"card-footer large-padding separator\">\n @for (deliveryType of deliveryTypes; track deliveryType.name) {\n @if (deliveryType.isSupportedByCommand) {\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!command?.text || (sendingCommand$ | async)\"\n (click)=\"execute(deliveryType.name)\"\n >\n <span\n [title]=\"\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n \"\n >\n {{\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n }}\n </span>\n </button>\n }\n }\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Operations' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <c8y-operations-timeline\n [operations]=\"operations\"\n [sourceId]=\"device.id\"\n [filterPipe]=\"filterPipe\"\n [bodyTemplate]=\"timelineItemBody\"\n [footerTemplates]=\"[timelineItemFooter]\"\n [propertiesToHide]=\"['c8y_Command']\"\n ></c8y-operations-timeline>\n <ng-template\n #timelineItemBody\n let-operation\n >\n <small>{{ operation.description || operation.c8y_Command?.text }}</small>\n </ng-template>\n <ng-template\n #timelineItemFooter\n let-operation\n >\n @if (operation.c8y_Command?.text) {\n <div>\n <div\n class=\"legend form-block\"\n translate\n >\n Command\n </div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.text}}</code></pre>\n </div>\n }\n @if (operation.c8y_Command?.result) {\n <div>\n <div\n class=\"legend form-block\"\n translate\n >\n Response\n </div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.result}}</code></pre>\n </div>\n }\n </ng-template>\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: "component", type: RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: DeviceStatusComponent, selector: "device-status, c8y-device-status", inputs: ["mo", "size"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: OperationsTimelineComponent, selector: "c8y-operations-timeline", inputs: ["operations", "sourceId", "filterPipe", "loadMoreMode", "bodyTemplate", "footerTemplates", "propertiesToHide"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
296
296
  }
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellComponent, decorators: [{
297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellComponent, decorators: [{
298
298
  type: Component,
299
299
  args: [{ selector: 'c8y-device-shell', providers: [OperationRealtimeService, ManagedObjectRealtimeService], imports: [
300
300
  ActionBarItemComponent,
@@ -307,25 +307,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
307
307
  C8yTranslateDirective,
308
308
  AsyncPipe,
309
309
  C8yTranslatePipe
310
- ], template: "<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"operationRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-grid grid__col--6-6--md\">\n <div class=\"inner-scroll d-flex d-col bg-level-0\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Command' | translate }}\n </div>\n </div>\n\n <div class=\"card-block d-flex d-col flex-grow large-padding\">\n <div class=\"d-flex p-b-16\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"getPredefinedCommand()\"\n [title]=\"'Display a list of predefined commands' | translate\"\n data-cy=\"shell--predefined-commands\"\n >\n {{ 'Predefined commands' | translate }}\n </button>\n\n <div class=\"m-l-auto\">\n <device-status [mo]=\"device$ | async\"></device-status>\n </div>\n </div>\n <textarea\n [attr.aria-label]=\"'Commands' | translate\"\n class=\"form-control inner-scroll flex-grow bg-level-2 text-monospace\"\n [(ngModel)]=\"command.text\"\n data-cy=\"shell-component--commands\"\n (ngModelChange)=\"$event || resetSupportedDeliveryTypes()\"\n placeholder=\"{{ 'Add commands or use predefined commands above.' | translate }}\"\n ></textarea>\n </div>\n\n <div class=\"card-footer large-padding separator\">\n <ng-container *ngFor=\"let deliveryType of deliveryTypes\">\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n *ngIf=\"deliveryType.isSupportedByCommand\"\n [disabled]=\"!command?.text || (sendingCommand$ | async)\"\n (click)=\"execute(deliveryType.name)\"\n >\n <span\n [title]=\"\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n \"\n >\n {{\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n }}\n </span>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Operations' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <c8y-operations-timeline\n [operations]=\"operations\"\n [sourceId]=\"device.id\"\n [filterPipe]=\"filterPipe\"\n [bodyTemplate]=\"timelineItemBody\"\n [footerTemplates]=\"[timelineItemFooter]\"\n [propertiesToHide]=\"['c8y_Command']\"\n ></c8y-operations-timeline>\n <ng-template #timelineItemBody let-operation>\n <small>{{ operation.c8y_Command?.text || operation.description }}</small>\n </ng-template>\n <ng-template #timelineItemFooter let-operation>\n <div *ngIf=\"operation.c8y_Command?.text\">\n <div class=\"legend form-block\" translate>Command</div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.text}}</code></pre>\n </div>\n <div *ngIf=\"operation.c8y_Command?.result\">\n <div class=\"legend form-block\" translate>Response</div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.result}}</code></pre>\n </div>\n </ng-template>\n </div>\n </div>\n</div>\n" }]
310
+ ], template: "<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"operationRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-grid grid__col--6-6--md\">\n <div class=\"inner-scroll d-flex d-col bg-level-0\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Command' | translate }}\n </div>\n </div>\n\n <div class=\"card-block d-flex d-col flex-grow large-padding\">\n <div class=\"d-flex p-b-16\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Display a list of predefined commands' | translate\"\n type=\"button\"\n (click)=\"getPredefinedCommand()\"\n data-cy=\"shell--predefined-commands\"\n >\n {{ 'Predefined commands' | translate }}\n </button>\n\n <div class=\"m-l-auto\">\n <device-status [mo]=\"device$ | async\"></device-status>\n </div>\n </div>\n <textarea\n class=\"form-control inner-scroll flex-grow bg-level-2 text-monospace\"\n [attr.aria-label]=\"'Commands' | translate\"\n placeholder=\"{{ 'Add commands or use predefined commands above.' | translate }}\"\n [(ngModel)]=\"command.text\"\n data-cy=\"shell-component--commands\"\n (ngModelChange)=\"$event || resetSupportedDeliveryTypes()\"\n ></textarea>\n </div>\n\n <div class=\"card-footer large-padding separator\">\n @for (deliveryType of deliveryTypes; track deliveryType.name) {\n @if (deliveryType.isSupportedByCommand) {\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!command?.text || (sendingCommand$ | async)\"\n (click)=\"execute(deliveryType.name)\"\n >\n <span\n [title]=\"\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n \"\n >\n {{\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n }}\n </span>\n </button>\n }\n }\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Operations' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <c8y-operations-timeline\n [operations]=\"operations\"\n [sourceId]=\"device.id\"\n [filterPipe]=\"filterPipe\"\n [bodyTemplate]=\"timelineItemBody\"\n [footerTemplates]=\"[timelineItemFooter]\"\n [propertiesToHide]=\"['c8y_Command']\"\n ></c8y-operations-timeline>\n <ng-template\n #timelineItemBody\n let-operation\n >\n <small>{{ operation.description || operation.c8y_Command?.text }}</small>\n </ng-template>\n <ng-template\n #timelineItemFooter\n let-operation\n >\n @if (operation.c8y_Command?.text) {\n <div>\n <div\n class=\"legend form-block\"\n translate\n >\n Command\n </div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.text}}</code></pre>\n </div>\n }\n @if (operation.c8y_Command?.result) {\n <div>\n <div\n class=\"legend form-block\"\n translate\n >\n Response\n </div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.result}}</code></pre>\n </div>\n }\n </ng-template>\n </div>\n </div>\n</div>\n" }]
311
311
  }], ctorParameters: () => [{ type: DeviceShellService }, { type: i2.OperationRealtimeService }, { type: i2.ManagedObjectRealtimeService }, { type: i2$1.OperationService }, { type: i4.ActivatedRoute }, { type: i1.BsModalService }, { type: i2.AlertService }] });
312
312
 
313
313
  class ShellModule {
314
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ShellModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
315
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: ShellModule, imports: [CommonModule,
314
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ShellModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
315
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.19", ngImport: i0, type: ShellModule, imports: [CommonModule,
316
316
  CoreModule,
317
317
  OperationsTimelineModule,
318
318
  CommandTemplatesModule,
319
319
  DeviceShellSharedModule,
320
320
  DeviceShellComponent], exports: [DeviceShellComponent] }); }
321
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ShellModule, imports: [CommonModule,
321
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ShellModule, imports: [CommonModule,
322
322
  CoreModule,
323
323
  OperationsTimelineModule,
324
324
  CommandTemplatesModule,
325
325
  DeviceShellSharedModule,
326
326
  DeviceShellComponent] }); }
327
327
  }
328
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ShellModule, decorators: [{
328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ShellModule, decorators: [{
329
329
  type: NgModule,
330
330
  args: [{
331
331
  imports: [
@@ -349,11 +349,11 @@ const DEVICE_SHELL_ROUTE = {
349
349
  canActivate: [DeviceShellGuard]
350
350
  };
351
351
  class DeviceShellModule {
352
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
353
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellModule, imports: [ShellModule] }); }
354
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellModule, providers: [DeviceShellGuard, hookRoute(DEVICE_SHELL_ROUTE)], imports: [ShellModule] }); }
352
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
353
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellModule, imports: [ShellModule] }); }
354
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellModule, providers: [DeviceShellGuard, hookRoute(DEVICE_SHELL_ROUTE)], imports: [ShellModule] }); }
355
355
  }
356
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DeviceShellModule, decorators: [{
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DeviceShellModule, decorators: [{
357
357
  type: NgModule,
358
358
  args: [{
359
359
  imports: [ShellModule],
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-device-shell.mjs","sources":["../../device-shell/command-templates/command-templates.directive.ts","../../device-shell/command-templates/command-templates.component.ts","../../device-shell/command-templates/command-templates.module.ts","../../device-shell/device-shell.guard.ts","../../device-shell/shared/device-shell.model.ts","../../device-shell/shared/device-shell.service.ts","../../device-shell/shared/device-shell-shared.module.ts","../../device-shell/shell/shell.component.ts","../../device-shell/shell/shell.component.html","../../device-shell/shell/shell.module.ts","../../device-shell/device-shell.module.ts","../../device-shell/c8y-ngx-components-device-shell.ts"],"sourcesContent":["import { Directive, ElementRef, EventEmitter, Injector, Output } from '@angular/core';\nimport { UpgradeComponent } from '@angular/upgrade/static';\n\n@Directive({ selector: 'c8y-command-templates-directive' })\nexport class CommandTemplates extends UpgradeComponent {\n @Output()\n close: EventEmitter<void>;\n\n @Output()\n dismiss: EventEmitter<void>;\n\n constructor(elementRef: ElementRef, injector: Injector) {\n super('c8yCommandTemplates', elementRef, injector);\n }\n}\n","import { Component, EventEmitter, Injector } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { CommandTemplates } from './command-templates.directive';\n\n/* https://stackoverflow.com/a/65290658 */\nexport function rootScopeCommandTemplateFactory($injector: Injector) {\n return $injector.get('$rootScope').$new();\n}\n\n@Component({\n selector: 'c8y-command-templates',\n template: `<c8y-command-templates-directive\n (close)=\"modalRef.hide(); onTemplateSelected.next($event)\"\n (dismiss)=\"modalRef.hide()\"\n ></c8y-command-templates-directive>`,\n providers: [\n {\n deps: ['$injector'],\n provide: '$scope',\n useFactory: rootScopeCommandTemplateFactory\n }\n ],\n imports: [CommandTemplates]\n})\nexport class CommandTemplatesComponent {\n onTemplateSelected: EventEmitter<object> = new EventEmitter();\n\n constructor(public modalRef: BsModalRef) {}\n}\n","import { NgModule } from '@angular/core';\nimport { CommandTemplatesComponent } from './command-templates.component';\nimport { CommandTemplates } from './command-templates.directive';\n\n@NgModule({\n imports: [CommandTemplates, CommandTemplatesComponent],\n exports: [CommandTemplatesComponent]\n})\nexport class CommandTemplatesModule {}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\n\n@Injectable()\nexport class DeviceShellGuard {\n private readonly operation = 'c8y_Command';\n\n canActivate(route: ActivatedRouteSnapshot) {\n const device = route.data.contextData || route.parent.data.contextData;\n const supportedOperations = (device && device.c8y_SupportedOperations) || [];\n return supportedOperations.indexOf(this.operation) >= 0;\n }\n}\n","export enum CommandDeliveryType {\n DEFAULT = 'Default',\n SMS = 'SMS'\n}\n\nexport interface DeliveryType {\n name: string;\n default?: boolean;\n}\n\nexport interface Command {\n id: string;\n name: string;\n text: string;\n deliveryTypes: string[];\n command: string;\n category: string;\n}\n\nexport interface DeviceShellTemplate {\n name: string;\n text: string;\n category?: string;\n syntax?: string;\n deviceType?: string;\n}\n","import { Injectable } from '@angular/core';\nimport {\n IManagedObject,\n InventoryService,\n IOperation,\n IResult,\n OperationService\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { OptionsService } from '@c8y/ngx-components';\nimport {\n Command,\n CommandDeliveryType,\n DeliveryType,\n DeviceShellTemplate\n} from './device-shell.model';\n\n@Injectable()\nexport class DeviceShellService {\n private readonly MO_TYPE = 'c8y_DeviceShellTemplate';\n constructor(\n private optionsService: OptionsService,\n private operationService: OperationService,\n private inventoryService: InventoryService\n ) {}\n\n getDeliveryTypes(): DeliveryType[] {\n return [\n {\n name: gettext(CommandDeliveryType.DEFAULT),\n default: true\n },\n {\n name: gettext(CommandDeliveryType.SMS)\n }\n ];\n }\n\n async canSendCommandsViaSMS(): Promise<boolean> {\n return !!(await this.optionsService.getSystemOption('messaging', 'provider', false));\n }\n\n createCommandOperation(\n deviceId: string,\n command: Command,\n deliveryType: CommandDeliveryType\n ): Promise<IResult<IOperation>> {\n const operation: IOperation = {\n deviceId,\n description: gettext('Execute shell command') + (command.name ? `: ${command.name}` : ''),\n deliveryType: deliveryType === CommandDeliveryType.SMS ? CommandDeliveryType.SMS : undefined,\n c8y_Command: {\n text: command.text\n }\n };\n return this.operationService.create(operation);\n }\n\n async getCommandTemplatesForDeviceType(deviceTypes: string[]): Promise<DeviceShellTemplate[]> {\n const staticTemplates = await this.getStaticCommandTemplates(deviceTypes);\n const dynamicTemplates = await this.getDynamicCommandTemplates(deviceTypes);\n return [...staticTemplates, ...dynamicTemplates];\n }\n\n private async getStaticCommandTemplates(deviceTypes: string[]): Promise<DeviceShellTemplate[]> {\n const templates: DeviceShellTemplate[] = [];\n\n deviceTypes.forEach(deviceType => {\n const inMemory = this.getCommandTemplatesForDeviceTypeInMemory(deviceType);\n if (inMemory) {\n templates.push(...this.extractCommandTemplatesFromData(deviceType, inMemory));\n }\n });\n\n return templates;\n }\n\n private getCommandTemplatesForDeviceTypeInMemory(deviceType: string): any[] | undefined {\n const raw = localStorage.getItem('devicecommands');\n if (!raw) {\n return undefined;\n }\n\n try {\n const store = JSON.parse(raw);\n return store?.[deviceType];\n } catch {\n return undefined;\n }\n }\n\n private async getDynamicCommandTemplates(deviceTypes: string[]): Promise<any[]> {\n const query = {\n __filter: {\n type: this.MO_TYPE,\n deviceType: { __in: deviceTypes }\n },\n __orderby: [{ creationTime: -1 }]\n };\n\n const resultList = await this.inventoryService.listQuery(query, { pageSize: 1000 });\n const results: IManagedObject[] = resultList.data;\n\n return results.map(r => ({\n ...r,\n deviceType: Array.isArray(r.deviceType) ? r.deviceType[0] : r.deviceType\n }));\n }\n\n private extractCommandTemplatesFromData(deviceType: string, data: any): DeviceShellTemplate[] {\n let templates: DeviceShellTemplate[];\n\n if (Array.isArray(data)) {\n templates = data.flatMap(d => this.getExtendedTemplates(d.templates, d.syntax, deviceType));\n } else {\n templates = this.getExtendedTemplates(data.templates, data.syntax, deviceType);\n }\n\n return templates;\n }\n\n private getExtendedTemplates(\n templates: any[],\n syntax?: string,\n deviceType?: string\n ): DeviceShellTemplate[] {\n return (templates || []).map(t => ({ ...t, syntax, deviceType }));\n }\n}\n","import { NgModule } from '@angular/core';\nimport { DeviceShellService } from './device-shell.service';\n\n@NgModule({\n providers: [DeviceShellService]\n})\nexport class DeviceShellSharedModule {}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, IOperation, IResultList, OperationService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ManagedObjectRealtimeService,\n OperationRealtimeService,\n ActionBarItemComponent,\n RealtimeButtonComponent,\n DeviceStatusComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { includes, isEmpty } from 'lodash-es';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, Observable, of, pipe, Subject } from 'rxjs';\nimport { filter, map, startWith, takeUntil } from 'rxjs/operators';\nimport { CommandTemplatesComponent } from '../command-templates';\nimport { Command, CommandDeliveryType, DeliveryType, DeviceShellService } from '../shared';\nimport { FormsModule } from '@angular/forms';\nimport { NgFor, NgIf, AsyncPipe } from '@angular/common';\nimport { OperationsTimelineComponent } from '@c8y/ngx-components/operations/operations-timeline';\n\n@Component({\n selector: 'c8y-device-shell',\n templateUrl: 'shell.component.html',\n providers: [OperationRealtimeService, ManagedObjectRealtimeService],\n imports: [\n ActionBarItemComponent,\n RealtimeButtonComponent,\n DeviceStatusComponent,\n FormsModule,\n NgFor,\n NgIf,\n OperationsTimelineComponent,\n C8yTranslateDirective,\n AsyncPipe,\n C8yTranslatePipe\n ]\n})\nexport class DeviceShellComponent implements OnInit, OnDestroy {\n device: IManagedObject = this.route.snapshot.parent.data.contextData;\n device$: Observable<IManagedObject> = of({} as any);\n deliveryTypes: Array<DeliveryType & { isSupportedByCommand?: boolean }> = (\n this.service.getDeliveryTypes() || []\n ).map(deliveryType => ({ ...deliveryType, isSupportedByCommand: true }));\n command: Command = {} as Command;\n smsEnabled = false;\n sendingCommand$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n operations: IResultList<IOperation>;\n filterPipe = pipe(\n map((operations: IOperation[]) =>\n (operations || []).filter((operation: IOperation) => !!operation.c8y_Command)\n )\n );\n\n executeViaLabel = gettext('Execute via ({{deliveryType}})');\n\n private destroyed$: Subject<void> = new Subject();\n\n constructor(\n public service: DeviceShellService,\n public operationRealtime: OperationRealtimeService,\n private moRealtime: ManagedObjectRealtimeService,\n private operationService: OperationService,\n private route: ActivatedRoute,\n private modalService: BsModalService,\n private alertService: AlertService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.smsEnabled = await this.service.canSendCommandsViaSMS();\n\n this.device$ = this.moRealtime.onUpdate$(this.device.id).pipe(startWith(this.device));\n\n this.operations = await this.operationService.list({\n deviceId: this.device.id,\n fragmentType: 'c8y_Command',\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date().toISOString(),\n pageSize: 50,\n withTotalPages: true,\n revert: true\n });\n\n this.operationRealtime\n .onCreate$(this.device.id)\n .pipe(takeUntil(this.destroyed$))\n .subscribe(() => this.alertService.success(gettext('Command sent.')));\n\n this.operationRealtime\n .onUpdate$(this.device.id)\n .pipe(\n filter(op => op.failureReason !== 'Operation cancelled by user.'), // avoid duplicate alerts\n takeUntil(this.destroyed$)\n )\n .subscribe(() => this.alertService.success(gettext('Command status updated.')));\n }\n\n getPredefinedCommand() {\n const modal: BsModalRef<CommandTemplatesComponent> = this.modalService.show(\n CommandTemplatesComponent,\n {\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title'\n }\n );\n modal.content.onTemplateSelected.pipe(takeUntil(this.destroyed$)).subscribe(result => {\n this.command = { ...(result as any).commandTemplate } as Command;\n this.deliveryTypes = this.deliveryTypes.map(deliveryType => ({\n ...deliveryType,\n isSupportedByCommand:\n isEmpty(this.command.deliveryTypes) ||\n includes(this.command.deliveryTypes, deliveryType.name)\n }));\n });\n }\n\n resetSupportedDeliveryTypes(): void {\n this.deliveryTypes = (this.service.getDeliveryTypes() || []).map(deliveryType => ({\n ...deliveryType,\n isSupportedByCommand: true\n }));\n }\n\n async execute(commandDeliveryType): Promise<void> {\n const useSMS = commandDeliveryType === CommandDeliveryType.SMS;\n if (useSMS && !this.smsEnabled) {\n this.alertService.warning(gettext('SMS transport is not configured.'));\n return;\n }\n this.sendingCommand$.next(true);\n\n await this.service.createCommandOperation(this.device.id, this.command, commandDeliveryType);\n\n this.command.text = '';\n this.command.name = '';\n this.resetSupportedDeliveryTypes();\n this.sendingCommand$.next(false);\n }\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"operationRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-grid grid__col--6-6--md\">\n <div class=\"inner-scroll d-flex d-col bg-level-0\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Command' | translate }}\n </div>\n </div>\n\n <div class=\"card-block d-flex d-col flex-grow large-padding\">\n <div class=\"d-flex p-b-16\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"getPredefinedCommand()\"\n [title]=\"'Display a list of predefined commands' | translate\"\n data-cy=\"shell--predefined-commands\"\n >\n {{ 'Predefined commands' | translate }}\n </button>\n\n <div class=\"m-l-auto\">\n <device-status [mo]=\"device$ | async\"></device-status>\n </div>\n </div>\n <textarea\n [attr.aria-label]=\"'Commands' | translate\"\n class=\"form-control inner-scroll flex-grow bg-level-2 text-monospace\"\n [(ngModel)]=\"command.text\"\n data-cy=\"shell-component--commands\"\n (ngModelChange)=\"$event || resetSupportedDeliveryTypes()\"\n placeholder=\"{{ 'Add commands or use predefined commands above.' | translate }}\"\n ></textarea>\n </div>\n\n <div class=\"card-footer large-padding separator\">\n <ng-container *ngFor=\"let deliveryType of deliveryTypes\">\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n *ngIf=\"deliveryType.isSupportedByCommand\"\n [disabled]=\"!command?.text || (sendingCommand$ | async)\"\n (click)=\"execute(deliveryType.name)\"\n >\n <span\n [title]=\"\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n \"\n >\n {{\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n }}\n </span>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Operations' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <c8y-operations-timeline\n [operations]=\"operations\"\n [sourceId]=\"device.id\"\n [filterPipe]=\"filterPipe\"\n [bodyTemplate]=\"timelineItemBody\"\n [footerTemplates]=\"[timelineItemFooter]\"\n [propertiesToHide]=\"['c8y_Command']\"\n ></c8y-operations-timeline>\n <ng-template #timelineItemBody let-operation>\n <small>{{ operation.c8y_Command?.text || operation.description }}</small>\n </ng-template>\n <ng-template #timelineItemFooter let-operation>\n <div *ngIf=\"operation.c8y_Command?.text\">\n <div class=\"legend form-block\" translate>Command</div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.text}}</code></pre>\n </div>\n <div *ngIf=\"operation.c8y_Command?.result\">\n <div class=\"legend form-block\" translate>Response</div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.result}}</code></pre>\n </div>\n </ng-template>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { OperationsTimelineModule } from '@c8y/ngx-components/operations/operations-timeline';\nimport { CommandTemplatesModule } from '../command-templates';\nimport { DeviceShellSharedModule } from '../shared';\nimport { DeviceShellComponent } from './shell.component';\n\n@NgModule({\n imports: [\n CommonModule,\n CoreModule,\n OperationsTimelineModule,\n CommandTemplatesModule,\n DeviceShellSharedModule,\n DeviceShellComponent\n ],\n exports: [DeviceShellComponent]\n})\nexport class ShellModule {}\n","import { NgModule } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { hookRoute, Route, ViewContext } from '@c8y/ngx-components';\nimport { DeviceShellGuard } from './device-shell.guard';\nimport { DeviceShellComponent, ShellModule } from './shell';\n\nconst DEVICE_SHELL_ROUTE: Route = {\n path: 'shell',\n context: ViewContext.Device,\n component: DeviceShellComponent,\n label: gettext('Shell'),\n icon: 'terminal',\n canActivate: [DeviceShellGuard]\n};\n\n@NgModule({\n imports: [ShellModule],\n providers: [DeviceShellGuard, hookRoute(DEVICE_SHELL_ROUTE)]\n})\nexport class DeviceShellModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i1.DeviceShellService","i3","i5"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-device-shell.mjs","sources":["../../device-shell/command-templates/command-templates.directive.ts","../../device-shell/command-templates/command-templates.component.ts","../../device-shell/command-templates/command-templates.module.ts","../../device-shell/device-shell.guard.ts","../../device-shell/shared/device-shell.model.ts","../../device-shell/shared/device-shell.service.ts","../../device-shell/shared/device-shell-shared.module.ts","../../device-shell/shell/shell.component.ts","../../device-shell/shell/shell.component.html","../../device-shell/shell/shell.module.ts","../../device-shell/device-shell.module.ts","../../device-shell/c8y-ngx-components-device-shell.ts"],"sourcesContent":["import { Directive, ElementRef, EventEmitter, Injector, Output } from '@angular/core';\nimport { UpgradeComponent } from '@angular/upgrade/static';\n\n@Directive({ selector: 'c8y-command-templates-directive' })\nexport class CommandTemplates extends UpgradeComponent {\n @Output()\n close: EventEmitter<void>;\n\n @Output()\n dismiss: EventEmitter<void>;\n\n constructor(elementRef: ElementRef, injector: Injector) {\n super('c8yCommandTemplates', elementRef, injector);\n }\n}\n","import { Component, EventEmitter, Injector } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { CommandTemplates } from './command-templates.directive';\n\n/* https://stackoverflow.com/a/65290658 */\nexport function rootScopeCommandTemplateFactory($injector: Injector) {\n return $injector.get('$rootScope').$new();\n}\n\n@Component({\n selector: 'c8y-command-templates',\n template: `<c8y-command-templates-directive\n (close)=\"modalRef.hide(); onTemplateSelected.next($event)\"\n (dismiss)=\"modalRef.hide()\"\n ></c8y-command-templates-directive>`,\n providers: [\n {\n deps: ['$injector'],\n provide: '$scope',\n useFactory: rootScopeCommandTemplateFactory\n }\n ],\n imports: [CommandTemplates]\n})\nexport class CommandTemplatesComponent {\n onTemplateSelected: EventEmitter<object> = new EventEmitter();\n\n constructor(public modalRef: BsModalRef) {}\n}\n","import { NgModule } from '@angular/core';\nimport { CommandTemplatesComponent } from './command-templates.component';\nimport { CommandTemplates } from './command-templates.directive';\n\n@NgModule({\n imports: [CommandTemplates, CommandTemplatesComponent],\n exports: [CommandTemplatesComponent]\n})\nexport class CommandTemplatesModule {}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\n\n@Injectable()\nexport class DeviceShellGuard {\n private readonly operation = 'c8y_Command';\n\n canActivate(route: ActivatedRouteSnapshot) {\n const device = route.data.contextData || route.parent.data.contextData;\n const supportedOperations = (device && device.c8y_SupportedOperations) || [];\n return supportedOperations.indexOf(this.operation) >= 0;\n }\n}\n","export enum CommandDeliveryType {\n DEFAULT = 'Default',\n SMS = 'SMS'\n}\n\nexport interface DeliveryType {\n name: string;\n default?: boolean;\n}\n\nexport interface Command {\n id: string;\n name: string;\n text: string;\n deliveryTypes: string[];\n command: string;\n category: string;\n}\n\nexport interface DeviceShellTemplate {\n name: string;\n text: string;\n category?: string;\n syntax?: string;\n deviceType?: string;\n}\n","import { Injectable } from '@angular/core';\nimport {\n IManagedObject,\n InventoryService,\n IOperation,\n IResult,\n OperationService\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { OptionsService } from '@c8y/ngx-components';\nimport {\n Command,\n CommandDeliveryType,\n DeliveryType,\n DeviceShellTemplate\n} from './device-shell.model';\n\n@Injectable()\nexport class DeviceShellService {\n private readonly MO_TYPE = 'c8y_DeviceShellTemplate';\n constructor(\n private optionsService: OptionsService,\n private operationService: OperationService,\n private inventoryService: InventoryService\n ) {}\n\n getDeliveryTypes(): DeliveryType[] {\n return [\n {\n name: gettext(CommandDeliveryType.DEFAULT),\n default: true\n },\n {\n name: gettext(CommandDeliveryType.SMS)\n }\n ];\n }\n\n async canSendCommandsViaSMS(): Promise<boolean> {\n return !!(await this.optionsService.getSystemOption('messaging', 'provider', false));\n }\n\n createCommandOperation(\n deviceId: string,\n command: Command,\n deliveryType: CommandDeliveryType\n ): Promise<IResult<IOperation>> {\n const operation: IOperation = {\n deviceId,\n description: command.text ?? 'Execute shell command',\n deliveryType: deliveryType === CommandDeliveryType.SMS ? CommandDeliveryType.SMS : undefined,\n c8y_Command: {\n text: command.text\n }\n };\n return this.operationService.create(operation);\n }\n\n async getCommandTemplatesForDeviceType(deviceTypes: string[]): Promise<DeviceShellTemplate[]> {\n const staticTemplates = await this.getStaticCommandTemplates(deviceTypes);\n const dynamicTemplates = await this.getDynamicCommandTemplates(deviceTypes);\n return [...staticTemplates, ...dynamicTemplates];\n }\n\n private async getStaticCommandTemplates(deviceTypes: string[]): Promise<DeviceShellTemplate[]> {\n const templates: DeviceShellTemplate[] = [];\n\n deviceTypes.forEach(deviceType => {\n const inMemory = this.getCommandTemplatesForDeviceTypeInMemory(deviceType);\n if (inMemory) {\n templates.push(...this.extractCommandTemplatesFromData(deviceType, inMemory));\n }\n });\n\n return templates;\n }\n\n private getCommandTemplatesForDeviceTypeInMemory(deviceType: string): any[] | undefined {\n const raw = localStorage.getItem('devicecommands');\n if (!raw) {\n return undefined;\n }\n\n try {\n const store = JSON.parse(raw);\n return store?.[deviceType];\n } catch {\n return undefined;\n }\n }\n\n private async getDynamicCommandTemplates(deviceTypes: string[]): Promise<any[]> {\n const query = {\n __filter: {\n type: this.MO_TYPE,\n deviceType: { __in: deviceTypes }\n },\n __orderby: [{ creationTime: -1 }]\n };\n\n const resultList = await this.inventoryService.listQuery(query, { pageSize: 1000 });\n const results: IManagedObject[] = resultList.data;\n\n return results.map(r => ({\n ...r,\n deviceType: Array.isArray(r.deviceType) ? r.deviceType[0] : r.deviceType\n }));\n }\n\n private extractCommandTemplatesFromData(deviceType: string, data: any): DeviceShellTemplate[] {\n let templates: DeviceShellTemplate[];\n\n if (Array.isArray(data)) {\n templates = data.flatMap(d => this.getExtendedTemplates(d.templates, d.syntax, deviceType));\n } else {\n templates = this.getExtendedTemplates(data.templates, data.syntax, deviceType);\n }\n\n return templates;\n }\n\n private getExtendedTemplates(\n templates: any[],\n syntax?: string,\n deviceType?: string\n ): DeviceShellTemplate[] {\n return (templates || []).map(t => ({ ...t, syntax, deviceType }));\n }\n}\n","import { NgModule } from '@angular/core';\nimport { DeviceShellService } from './device-shell.service';\n\n@NgModule({\n providers: [DeviceShellService]\n})\nexport class DeviceShellSharedModule {}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, IOperation, IResultList, OperationService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n ManagedObjectRealtimeService,\n OperationRealtimeService,\n ActionBarItemComponent,\n RealtimeButtonComponent,\n DeviceStatusComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { includes, isEmpty } from 'lodash-es';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, Observable, of, pipe, Subject } from 'rxjs';\nimport { filter, map, startWith, takeUntil } from 'rxjs/operators';\nimport { CommandTemplatesComponent } from '../command-templates';\nimport { Command, CommandDeliveryType, DeliveryType, DeviceShellService } from '../shared';\nimport { FormsModule } from '@angular/forms';\nimport { NgFor, NgIf, AsyncPipe } from '@angular/common';\nimport { OperationsTimelineComponent } from '@c8y/ngx-components/operations/operations-timeline';\n\n@Component({\n selector: 'c8y-device-shell',\n templateUrl: 'shell.component.html',\n providers: [OperationRealtimeService, ManagedObjectRealtimeService],\n imports: [\n ActionBarItemComponent,\n RealtimeButtonComponent,\n DeviceStatusComponent,\n FormsModule,\n NgFor,\n NgIf,\n OperationsTimelineComponent,\n C8yTranslateDirective,\n AsyncPipe,\n C8yTranslatePipe\n ]\n})\nexport class DeviceShellComponent implements OnInit, OnDestroy {\n device: IManagedObject = this.route.snapshot.parent.data.contextData;\n device$: Observable<IManagedObject> = of({} as any);\n deliveryTypes: Array<DeliveryType & { isSupportedByCommand?: boolean }> = (\n this.service.getDeliveryTypes() || []\n ).map(deliveryType => ({ ...deliveryType, isSupportedByCommand: true }));\n command: Command = {} as Command;\n smsEnabled = false;\n sendingCommand$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n operations: IResultList<IOperation>;\n filterPipe = pipe(\n map((operations: IOperation[]) =>\n (operations || []).filter((operation: IOperation) => !!operation.c8y_Command)\n )\n );\n\n executeViaLabel = gettext('Execute via ({{deliveryType}})');\n\n private destroyed$: Subject<void> = new Subject();\n\n constructor(\n public service: DeviceShellService,\n public operationRealtime: OperationRealtimeService,\n private moRealtime: ManagedObjectRealtimeService,\n private operationService: OperationService,\n private route: ActivatedRoute,\n private modalService: BsModalService,\n private alertService: AlertService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.smsEnabled = await this.service.canSendCommandsViaSMS();\n\n this.device$ = this.moRealtime.onUpdate$(this.device.id).pipe(startWith(this.device));\n\n this.operations = await this.operationService.list({\n deviceId: this.device.id,\n fragmentType: 'c8y_Command',\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date().toISOString(),\n pageSize: 50,\n withTotalPages: true,\n revert: true\n });\n\n this.operationRealtime\n .onCreate$(this.device.id)\n .pipe(takeUntil(this.destroyed$))\n .subscribe(() => this.alertService.success(gettext('Command sent.')));\n\n this.operationRealtime\n .onUpdate$(this.device.id)\n .pipe(\n filter(op => op.failureReason !== 'Operation cancelled by user.'), // avoid duplicate alerts\n takeUntil(this.destroyed$)\n )\n .subscribe(() => this.alertService.success(gettext('Command status updated.')));\n }\n\n getPredefinedCommand() {\n const modal: BsModalRef<CommandTemplatesComponent> = this.modalService.show(\n CommandTemplatesComponent,\n {\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title'\n }\n );\n modal.content.onTemplateSelected.pipe(takeUntil(this.destroyed$)).subscribe(result => {\n this.command = { ...(result as any).commandTemplate } as Command;\n this.deliveryTypes = this.deliveryTypes.map(deliveryType => ({\n ...deliveryType,\n isSupportedByCommand:\n isEmpty(this.command.deliveryTypes) ||\n includes(this.command.deliveryTypes, deliveryType.name)\n }));\n });\n }\n\n resetSupportedDeliveryTypes(): void {\n this.deliveryTypes = (this.service.getDeliveryTypes() || []).map(deliveryType => ({\n ...deliveryType,\n isSupportedByCommand: true\n }));\n }\n\n async execute(commandDeliveryType): Promise<void> {\n const useSMS = commandDeliveryType === CommandDeliveryType.SMS;\n if (useSMS && !this.smsEnabled) {\n this.alertService.warning(gettext('SMS transport is not configured.'));\n return;\n }\n this.sendingCommand$.next(true);\n\n await this.service.createCommandOperation(this.device.id, this.command, commandDeliveryType);\n\n this.command.text = '';\n this.command.name = '';\n this.resetSupportedDeliveryTypes();\n this.sendingCommand$.next(false);\n }\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"operationRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-grid grid__col--6-6--md\">\n <div class=\"inner-scroll d-flex d-col bg-level-0\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Command' | translate }}\n </div>\n </div>\n\n <div class=\"card-block d-flex d-col flex-grow large-padding\">\n <div class=\"d-flex p-b-16\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Display a list of predefined commands' | translate\"\n type=\"button\"\n (click)=\"getPredefinedCommand()\"\n data-cy=\"shell--predefined-commands\"\n >\n {{ 'Predefined commands' | translate }}\n </button>\n\n <div class=\"m-l-auto\">\n <device-status [mo]=\"device$ | async\"></device-status>\n </div>\n </div>\n <textarea\n class=\"form-control inner-scroll flex-grow bg-level-2 text-monospace\"\n [attr.aria-label]=\"'Commands' | translate\"\n placeholder=\"{{ 'Add commands or use predefined commands above.' | translate }}\"\n [(ngModel)]=\"command.text\"\n data-cy=\"shell-component--commands\"\n (ngModelChange)=\"$event || resetSupportedDeliveryTypes()\"\n ></textarea>\n </div>\n\n <div class=\"card-footer large-padding separator\">\n @for (deliveryType of deliveryTypes; track deliveryType.name) {\n @if (deliveryType.isSupportedByCommand) {\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!command?.text || (sendingCommand$ | async)\"\n (click)=\"execute(deliveryType.name)\"\n >\n <span\n [title]=\"\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n \"\n >\n {{\n deliveryType.default\n ? ('Execute' | translate)\n : (executeViaLabel | translate: { deliveryType: deliveryType.name })\n }}\n </span>\n </button>\n }\n }\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"card-title\">\n {{ 'Operations' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <c8y-operations-timeline\n [operations]=\"operations\"\n [sourceId]=\"device.id\"\n [filterPipe]=\"filterPipe\"\n [bodyTemplate]=\"timelineItemBody\"\n [footerTemplates]=\"[timelineItemFooter]\"\n [propertiesToHide]=\"['c8y_Command']\"\n ></c8y-operations-timeline>\n <ng-template\n #timelineItemBody\n let-operation\n >\n <small>{{ operation.description || operation.c8y_Command?.text }}</small>\n </ng-template>\n <ng-template\n #timelineItemFooter\n let-operation\n >\n @if (operation.c8y_Command?.text) {\n <div>\n <div\n class=\"legend form-block\"\n translate\n >\n Command\n </div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.text}}</code></pre>\n </div>\n }\n @if (operation.c8y_Command?.result) {\n <div>\n <div\n class=\"legend form-block\"\n translate\n >\n Response\n </div>\n <!-- Keep this in a single line since `pre-text` will preserve all whitespaces in the `pre` tag.-->\n <pre class=\"p-8 text-pre\"><code>{{operation.c8y_Command.result}}</code></pre>\n </div>\n }\n </ng-template>\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { OperationsTimelineModule } from '@c8y/ngx-components/operations/operations-timeline';\nimport { CommandTemplatesModule } from '../command-templates';\nimport { DeviceShellSharedModule } from '../shared';\nimport { DeviceShellComponent } from './shell.component';\n\n@NgModule({\n imports: [\n CommonModule,\n CoreModule,\n OperationsTimelineModule,\n CommandTemplatesModule,\n DeviceShellSharedModule,\n DeviceShellComponent\n ],\n exports: [DeviceShellComponent]\n})\nexport class ShellModule {}\n","import { NgModule } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { hookRoute, Route, ViewContext } from '@c8y/ngx-components';\nimport { DeviceShellGuard } from './device-shell.guard';\nimport { DeviceShellComponent, ShellModule } from './shell';\n\nconst DEVICE_SHELL_ROUTE: Route = {\n path: 'shell',\n context: ViewContext.Device,\n component: DeviceShellComponent,\n label: gettext('Shell'),\n icon: 'terminal',\n canActivate: [DeviceShellGuard]\n};\n\n@NgModule({\n imports: [ShellModule],\n providers: [DeviceShellGuard, hookRoute(DEVICE_SHELL_ROUTE)]\n})\nexport class DeviceShellModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i1.DeviceShellService","i3","i5"],"mappings":"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"}