@c8y/ngx-components 1023.70.0 → 1023.75.1

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 (169) hide show
  1. package/asset-properties/index.d.ts +19 -1
  2. package/asset-properties/index.d.ts.map +1 -1
  3. package/cockpit-config/index.d.ts +4 -3
  4. package/cockpit-config/index.d.ts.map +1 -1
  5. package/context-dashboard/index.d.ts +202 -4
  6. package/context-dashboard/index.d.ts.map +1 -1
  7. package/datapoints-export-selector/index.d.ts +8 -1
  8. package/datapoints-export-selector/index.d.ts.map +1 -1
  9. package/device-profile/index.d.ts +8 -1
  10. package/device-profile/index.d.ts.map +1 -1
  11. package/events/cockpit/index.d.ts +6 -0
  12. package/events/cockpit/index.d.ts.map +1 -0
  13. package/events/devicemanagement/index.d.ts +6 -0
  14. package/events/devicemanagement/index.d.ts.map +1 -0
  15. package/events/events-timeline/index.d.ts +11 -10
  16. package/events/events-timeline/index.d.ts.map +1 -1
  17. package/events/index.d.ts +363 -5
  18. package/events/index.d.ts.map +1 -1
  19. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +1 -1
  20. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-alarms.mjs +1 -1
  22. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
  24. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +1 -1
  26. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  27. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +1 -1
  28. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
  29. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -2
  30. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-cockpit-config.mjs +8 -11
  32. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  33. package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-CPLDClTp.mjs → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-DX9Rgjgl.mjs} +2 -2
  34. package/fesm2022/{c8y-ngx-components-computed-asset-properties-alarm-count-config.component-CPLDClTp.mjs.map → c8y-ngx-components-computed-asset-properties-alarm-count-config.component-DX9Rgjgl.mjs.map} +1 -1
  35. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-9be_iMQg.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CRpLJ5H7.mjs} +8 -8
  36. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-9be_iMQg.mjs.map → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CRpLJ5H7.mjs.map} +1 -1
  37. package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-B2em01_W.mjs → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-2rDsrxcs.mjs} +2 -2
  38. package/fesm2022/{c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-B2em01_W.mjs.map → c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-2rDsrxcs.mjs.map} +1 -1
  39. package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-CQuGa1RI.mjs → c8y-ngx-components-computed-asset-properties-event-count-config.component-BJNoqWZf.mjs} +2 -2
  40. package/fesm2022/{c8y-ngx-components-computed-asset-properties-event-count-config.component-CQuGa1RI.mjs.map → c8y-ngx-components-computed-asset-properties-event-count-config.component-BJNoqWZf.mjs.map} +1 -1
  41. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-CkmurxJv.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DYac6foX.mjs} +3 -3
  42. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-CkmurxJv.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-DYac6foX.mjs.map} +1 -1
  43. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CTK9zNUh.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-3yTe6lIr.mjs} +3 -3
  44. package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-CTK9zNUh.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-3yTe6lIr.mjs.map} +1 -1
  45. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
  46. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-DsCDppJx.mjs → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C7yXSDYC.mjs} +3 -3
  47. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-DsCDppJx.mjs.map → c8y-ngx-components-context-dashboard-dashboard-appearance-settings.component-C7yXSDYC.mjs.map} +1 -1
  48. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RdLW5nde.mjs → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-w8N16Z3t.mjs} +4 -4
  49. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-general-settings.component-RdLW5nde.mjs.map → c8y-ngx-components-context-dashboard-dashboard-general-settings.component-w8N16Z3t.mjs.map} +1 -1
  50. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +561 -21
  51. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  52. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +2 -2
  53. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  54. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +1 -1
  55. package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +1 -1
  57. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +41 -8
  59. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  60. package/fesm2022/c8y-ngx-components-device-profile.mjs +38 -12
  61. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-device-shell.mjs +1 -1
  63. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs +1 -1
  65. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +1 -1
  67. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  68. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
  69. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  70. package/fesm2022/c8y-ngx-components-events-cockpit.mjs +54 -0
  71. package/fesm2022/c8y-ngx-components-events-cockpit.mjs.map +1 -0
  72. package/fesm2022/c8y-ngx-components-events-devicemanagement.mjs +79 -0
  73. package/fesm2022/c8y-ngx-components-events-devicemanagement.mjs.map +1 -0
  74. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +30 -20
  75. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
  76. package/fesm2022/c8y-ngx-components-events.mjs +1080 -4
  77. package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
  78. package/fesm2022/c8y-ngx-components-file-preview.mjs +48 -41
  79. package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
  80. package/fesm2022/c8y-ngx-components-files-repository.mjs +1 -1
  81. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  82. package/fesm2022/c8y-ngx-components-global-context.mjs +68 -34
  83. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  84. package/fesm2022/c8y-ngx-components-interval-picker.mjs +3 -3
  85. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  86. package/fesm2022/c8y-ngx-components-location.mjs +1 -1
  87. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  88. package/fesm2022/c8y-ngx-components-operation-picker.mjs +1 -1
  89. package/fesm2022/c8y-ngx-components-operation-picker.mjs.map +1 -1
  90. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +1 -1
  91. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  92. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +5 -2
  93. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
  94. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +1 -1
  95. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  96. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +1 -1
  97. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  98. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +5 -5
  99. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  100. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +2 -2
  101. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  102. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +1 -1
  103. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
  104. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +1 -1
  105. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  106. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +1 -1
  107. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -1
  108. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +1 -1
  109. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
  110. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +1 -1
  111. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  112. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
  113. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  114. package/fesm2022/c8y-ngx-components-time-context.mjs +1 -1
  115. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  116. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +1 -1
  117. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  118. package/fesm2022/c8y-ngx-components-widgets-definitions-event-list.mjs +39 -1
  119. package/fesm2022/c8y-ngx-components-widgets-definitions-event-list.mjs.map +1 -1
  120. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +76 -4
  121. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
  122. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +1 -1
  123. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  124. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +1 -1
  125. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  126. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +236 -0
  127. package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs.map +1 -0
  128. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +271 -31
  129. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  130. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +1 -1
  131. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
  132. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +1 -1
  133. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  134. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +1 -1
  135. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  136. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +1 -1
  137. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  138. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +1 -1
  139. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  140. package/fesm2022/c8y-ngx-components.mjs +257 -31
  141. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  142. package/file-preview/index.d.ts +7 -6
  143. package/file-preview/index.d.ts.map +1 -1
  144. package/global-context/index.d.ts +3 -0
  145. package/global-context/index.d.ts.map +1 -1
  146. package/index.d.ts +108 -12
  147. package/index.d.ts.map +1 -1
  148. package/locales/de.po +205 -38
  149. package/locales/es.po +204 -37
  150. package/locales/fr.po +204 -37
  151. package/locales/ja_JP.po +204 -38
  152. package/locales/ko.po +205 -38
  153. package/locales/locales.pot +117 -3
  154. package/locales/nl.po +205 -38
  155. package/locales/pl.po +205 -38
  156. package/locales/pt_BR.po +204 -37
  157. package/locales/zh_CN.po +205 -38
  158. package/locales/zh_TW.po +205 -38
  159. package/operations/operations-timeline/index.d.ts +3 -2
  160. package/operations/operations-timeline/index.d.ts.map +1 -1
  161. package/package.json +1 -1
  162. package/widgets/definitions/event-list/index.d.ts +44 -1
  163. package/widgets/definitions/event-list/index.d.ts.map +1 -1
  164. package/widgets/implementations/alarms/index.d.ts +2 -0
  165. package/widgets/implementations/alarms/index.d.ts.map +1 -1
  166. package/widgets/implementations/events/index.d.ts +89 -0
  167. package/widgets/implementations/events/index.d.ts.map +1 -0
  168. package/widgets/implementations/html-widget/index.d.ts +69 -9
  169. package/widgets/implementations/html-widget/index.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-events.mjs","sources":["../../events/events.model.ts","../../events/events.service.ts","../../events/c8y-ngx-components-events.ts"],"sourcesContent":["import { gettext } from '@c8y/ngx-components/gettext';\n\nexport const EVENT_RESERVED_KEYS = [\n 'creationTime',\n 'id',\n 'self',\n 'source',\n 'text',\n 'time',\n 'type',\n 'c8y_IsBinary'\n];\n\nexport const EVENT_STANDARD_KEYS = {\n type: gettext('Type'),\n text: gettext('Text')\n};\n","import { Injectable } from '@angular/core';\nimport { IEvent } from '@c8y/client';\nimport { difference, has, includes, keys, pickBy, without } from 'lodash-es';\nimport {\n EVENT_RESERVED_KEYS as RESERVED_KEYS,\n EVENT_STANDARD_KEYS as STANDARD_KEYS\n} from './events.model';\n\n@Injectable({ providedIn: 'root' })\nexport class EventsService {\n getStandardKeys(event: IEvent) {\n return pickBy(STANDARD_KEYS, (_, key) => has(event, key));\n }\n\n getNonStandardKeys(event: IEvent, excluding: string[] = []) {\n return without(\n difference(this.getKeys(event), keys(this.getStandardKeys(event))),\n ...excluding\n );\n }\n\n private getKeys(managedObject) {\n return Object.keys({ ...managedObject }).filter(key => !includes(RESERVED_KEYS, key));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["STANDARD_KEYS","RESERVED_KEYS"],"mappings":";;;;;AAEO,MAAM,mBAAmB,GAAG;IACjC,cAAc;IACd,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN;;AAGK,MAAM,mBAAmB,GAAG;AACjC,IAAA,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;AACrB,IAAA,IAAI,EAAE,OAAO,CAAC,MAAM;;;MCNT,aAAa,CAAA;AACxB,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,OAAO,MAAM,CAACA,mBAAa,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D;AAEA,IAAA,kBAAkB,CAAC,KAAa,EAAE,SAAA,GAAsB,EAAE,EAAA;QACxD,OAAO,OAAO,CACZ,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAClE,GAAG,SAAS,CACb;IACH;AAEQ,IAAA,OAAO,CAAC,aAAa,EAAA;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAACC,mBAAa,EAAE,GAAG,CAAC,CAAC;IACvF;+GAdW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA,CAAA;;4FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACRlC;;AAEG;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-events.mjs","sources":["../../events/events.model.ts","../../events/events.service.ts","../../events/event-details.component.ts","../../events/event-details.component.html","../../events/event-icon.pipe.ts","../../events/event-is-image.pipe.ts","../../events/events-view.service.ts","../../events/event-router-link.pipe.ts","../../events/events-date-filter.component.ts","../../events/events-date-filter.component.html","../../events/events-interval-refresh.component.ts","../../events/events-interval-refresh.component.html","../../events/events-list.component.ts","../../events/events-list.component.html","../../events/events-type-filter.component.ts","../../events/events-type-filter.component.html","../../events/events.component.ts","../../events/events.component.html","../../events/c8y-ngx-components-events.ts"],"sourcesContent":["import { QueryParamsHandling } from '@angular/router';\nimport { DateTimeContext } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlarmFilterInterval,\n INTERVALS,\n INTERVAL_TITLES\n} from '@c8y/ngx-components/interval-picker';\n\nexport interface EventsFilter {\n source?: string | number;\n type?: string;\n dateFrom?: Date;\n dateTo?: Date;\n pageSize?: number;\n withSourceChildren?: boolean;\n}\n\nexport const EVENT_RESERVED_KEYS = [\n 'creationTime',\n 'id',\n 'lastUpdated',\n 'self',\n 'source',\n 'text',\n 'time',\n 'type',\n 'c8y_IsBinary'\n];\n\nexport const EVENT_STANDARD_KEYS = {\n type: gettext('Type'),\n text: gettext('Text'),\n lastUpdated: gettext('Last updated')\n};\n\nexport const EVENTS_PATH = 'events';\n\n/**\n * Extended interval titles with an additional title for the case when no date is selected.\n */\nexport const INTERVAL_TITLES_EXTENDED: Record<AlarmFilterInterval['id'], string> = {\n ...INTERVAL_TITLES,\n none: gettext('No date filter')\n};\n\nexport const INTERVALS_EXTENDED: AlarmFilterInterval[] = [\n {\n id: 'none',\n title: gettext('No date filter')\n },\n ...INTERVALS\n];\n\nexport type WidgetTimeContextStateExtended = {\n date: DateTimeContext;\n interval: AlarmFilterInterval['id'];\n};\n\nexport type EventListFormFilters = {\n selectedDates?: DateTimeContext;\n interval?: AlarmFilterInterval['id'];\n};\n\n/**\n * Represents the navigation options for the events list component.\n */\nexport type EventNavigationOptions = {\n /**\n * Defines if the event should navigate to a detail view when clicked.\n */\n allowNavigationToEventsView: boolean;\n /**\n * Defines if the component should try to determine the context to navigate\n * to the correct event detail view or not. If set to true, the component will\n * not try to determine the context and will always navigate to the all events view.\n */\n alwaysNavigateToAllEvents: boolean;\n /**\n * Determines how query parameters should be handled during navigation.\n *\n * - `\"merge\"` : Merge new parameters with current parameters.\n * - `\"preserve\"` : Preserve current parameters.\n * - `\"\"` : Replace current parameters with new parameters. This is the default behavior.\n */\n queryParamsHandling: QueryParamsHandling;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { IEvent, IEventBinary } from '@c8y/client';\nimport { FilesService, GenericFileIconPipe } from '@c8y/ngx-components';\nimport { difference, has, includes, keys, pickBy, without } from 'lodash-es';\nimport {\n EVENT_RESERVED_KEYS as RESERVED_KEYS,\n EVENT_STANDARD_KEYS as STANDARD_KEYS\n} from './events.model';\n\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'];\n\n@Injectable({ providedIn: 'root' })\nexport class EventsService {\n private filesService = inject(FilesService);\n private fileIconPipe = new GenericFileIconPipe(this.filesService);\n\n resolveFileIcon(fileName: string): string {\n const extension = this.filesService.getFileExtension(fileName);\n if (!extension) {\n return 'file-o';\n }\n const genericType = this.fileIconPipe.getGenericType({ name: fileName } as File);\n return this.fileIconPipe.getIcon(genericType);\n }\n\n getStandardKeys(event: IEvent) {\n return pickBy(STANDARD_KEYS, (_, key) => has(event, key));\n }\n\n getNonStandardKeys(event: IEvent, excluding: string[] = []) {\n return without(\n difference(this.getKeys(event), keys(this.getStandardKeys(event))),\n ...excluding\n );\n }\n\n isImageBinary(binaryInfo: IEventBinary): boolean {\n if (!binaryInfo?.name) {\n return false;\n }\n const extension = this.filesService.getFileExtension(binaryInfo.name);\n return extension ? IMAGE_EXTENSIONS.includes(extension) : false;\n }\n\n getCustomFragments(event: IEvent): Record<string, unknown> | null {\n const nonStandardKeys = this.getNonStandardKeys(event);\n if (nonStandardKeys.length === 0) {\n return null;\n }\n\n const fragments: Record<string, unknown> = {};\n for (const key of nonStandardKeys) {\n fragments[key] = event[key];\n }\n return fragments;\n }\n\n arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += 8192) {\n chunks.push(String.fromCharCode(...bytes.subarray(i, i + 8192)));\n }\n return btoa(chunks.join(''));\n }\n\n private getKeys(managedObject: IEvent) {\n return Object.keys({ ...managedObject }).filter(key => !includes(RESERVED_KEYS, key));\n }\n}\n","import { JsonPipe, KeyValuePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n OnInit,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport {\n EventBinaryService,\n EventService,\n IEvent,\n IEventBinary,\n IManagedObject,\n InventoryService\n} from '@c8y/client';\nimport {\n AlertService,\n AssetLinkPipe,\n C8yTranslatePipe,\n ColorService,\n DatePipe,\n HumanizePipe,\n IconDirective,\n IconPanelComponent,\n LoadingComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { saveAs } from 'file-saver';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { EventsService } from './events.service';\n\ntype CustomFragment = Record<string, unknown> | null;\n\n@Component({\n selector: 'c8y-event-details',\n templateUrl: './event-details.component.html',\n imports: [\n AssetLinkPipe,\n C8yTranslatePipe,\n DatePipe,\n HumanizePipe,\n IconDirective,\n IconPanelComponent,\n JsonPipe,\n KeyValuePipe,\n LoadingComponent,\n PopoverDirective,\n RouterLink\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EventDetailsComponent implements OnInit {\n readonly CREATION_TIME_HELP_TEXT = gettext(\n \"Time in which the event was created on the server. The time shown corresponds to the server's time.\"\n );\n readonly EVENT_ICON = 'online1';\n readonly TIME_HELP_TEXT = gettext(\n 'Time in which the event was created on the device. Device time can be different from server time.'\n );\n\n binaryPreviewLoading = signal(false);\n binaryPreviewUrl = signal<string | null>(null);\n binaryPreviewFailed = signal(false);\n customFragments = signal<CustomFragment>(null);\n isDownloading = signal(false);\n isLoading = signal(true);\n selectedEvent = signal<IEvent | null>(null);\n selectedEventSource = signal<IManagedObject | null>(null);\n typeColor = signal<string>('');\n\n binaryInfo = computed<IEventBinary | null>(() => this.selectedEvent()?.['c8y_IsBinary'] ?? null);\n hasBinary = computed(() => !!this.binaryInfo());\n canDownload = computed(() => this.binaryInfo()?.length !== undefined);\n binaryIcon = computed(() => {\n const info = this.binaryInfo();\n if (!info?.name) {\n return 'file-o';\n }\n return this.eventsService.resolveFileIcon(info.name);\n });\n\n private activatedRoute = inject(ActivatedRoute);\n private alertService = inject(AlertService);\n private colorService = inject(ColorService);\n private destroyRef = inject(DestroyRef);\n private eventBinaryService = inject(EventBinaryService);\n private eventService = inject(EventService);\n private eventsService = inject(EventsService);\n private inventoryService = inject(InventoryService);\n\n ngOnInit(): void {\n this.activatedRoute.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n if (params['id']) {\n void this.loadEventDetails(params['id']);\n }\n });\n }\n\n isComplexValue(value: unknown): boolean {\n return typeof value === 'object' && value !== null;\n }\n\n async downloadBinary(): Promise<void> {\n const event = this.selectedEvent();\n const binaryInfo = this.binaryInfo();\n if (!event || !binaryInfo) {\n return;\n }\n\n try {\n this.isDownloading.set(true);\n const response = await this.eventBinaryService.download(event);\n const arrayBuffer = await response.arrayBuffer();\n const contentType = response.headers.get('Content-Type') || 'application/octet-stream';\n const blob = new Blob([arrayBuffer], { type: contentType });\n saveAs(blob, binaryInfo.name || 'attachment');\n } catch (error: unknown) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isDownloading.set(false);\n }\n }\n\n private async loadEventDetails(eventId: string): Promise<void> {\n try {\n this.isLoading.set(true);\n this.binaryPreviewUrl.set(null);\n this.binaryPreviewFailed.set(false);\n\n const { data: event } = await this.eventService.detail(eventId);\n this.selectedEvent.set(event);\n\n const [source, color] = await Promise.all([\n this.loadEventSource(event.source?.id),\n this.colorService.generateColor(event.type)\n ]);\n\n this.selectedEventSource.set(source);\n this.typeColor.set(color);\n this.customFragments.set(this.eventsService.getCustomFragments(event));\n\n if (event['c8y_IsBinary'] && this.eventsService.isImageBinary(event['c8y_IsBinary'])) {\n void this.loadBinaryPreview(event);\n }\n } catch (error: unknown) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async loadEventSource(sourceId: string | number): Promise<IManagedObject | null> {\n if (!sourceId) {\n return null;\n }\n try {\n const { data } = await this.inventoryService.detail(sourceId);\n return data;\n } catch {\n return null;\n }\n }\n\n private async loadBinaryPreview(event: IEvent): Promise<void> {\n try {\n this.binaryPreviewLoading.set(true);\n const response = await this.eventBinaryService.download(event);\n const arrayBuffer = await response.arrayBuffer();\n const contentType = response.headers.get('Content-Type') || 'image/png';\n const base64 = this.eventsService.arrayBufferToBase64(arrayBuffer);\n this.binaryPreviewUrl.set(`data:${contentType};base64,${base64}`);\n } catch {\n this.binaryPreviewFailed.set(true);\n } finally {\n this.binaryPreviewLoading.set(false);\n }\n }\n}\n","@if (isLoading()) {\n <c8y-loading />\n} @else if (selectedEvent(); as event) {\n <!-- Header with event text -->\n <div\n class=\"card-header p-24 m-b-16 bg-component separator-bottom sticky-top\"\n style=\"margin: 0 -24px\"\n >\n <h4\n class=\"m-0\"\n data-cy=\"c8y-event-details-title\"\n >\n {{ event.text | translate }}\n </h4>\n </div>\n\n <c8y-icon-panel [sections]=\"[]\">\n <!-- Source section -->\n <div\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-event-details--source-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n @if (selectedEventSource(); as source) {\n <button\n class=\"btn-link p-0 m-r-8 text-left text-truncate\"\n [title]=\"source.name || event.source?.id\"\n type=\"button\"\n [routerLink]=\"source | assetLink\"\n >\n <i c8yIcon=\"exchange\"></i>\n {{ source.name || event.source?.id }}\n </button>\n } @else {\n <span class=\"text-muted\">{{ event.source?.id }}</span>\n }\n </p>\n </div>\n </div>\n </div>\n\n <!-- Type section -->\n <div\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-event-details--type-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [style.background-color]=\"typeColor()\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"EVENT_ICON\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n [title]=\"event.type\"\n >\n <code>{{ event.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <!-- Time, Server creation time, and Last updated -->\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n data-cy=\"c8y-event-details--calendar-icon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <!-- Device time -->\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-event-details--time-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Time' | translate }}</p>\n <p class=\"small\">\n {{ event.time | c8yDate: 'medium' }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"TIME_HELP_TEXT | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <!-- Server creation time -->\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-event-details--creation-time-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">\n {{ 'Server creation time' | translate }}\n </p>\n <p class=\"small\">\n {{ event.creationTime | c8yDate: 'medium' }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"CREATION_TIME_HELP_TEXT | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <!-- Last updated -->\n @if (event['lastUpdated']) {\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-event-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">\n {{ 'Last updated' | translate }}\n </p>\n <p class=\"small\">\n {{ event['lastUpdated'] | c8yDate: 'medium' }}\n </p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Custom fragments section -->\n @if (customFragments(); as fragments) {\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n data-cy=\"c8y-event-details--custom-fragments-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"event-details-custom-data\"\n >\n <ul class=\"list-unstyled small m-b-0\">\n @for (item of fragments | keyvalue; track item.key) {\n <li\n class=\"p-t-4 p-b-4 separator-bottom\"\n data-cy=\"event-details-custom-data-item\"\n >\n <label class=\"small m-b-4 text-label-small d-block\">\n {{ item.key | humanize }}\n </label>\n @if (isComplexValue(item.value)) {\n <pre class=\"m-b-0\"><code>{{ item.value | json }}</code></pre>\n } @else {\n <span>{{ item.value }}</span>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n </div>\n }\n\n <!-- Attachment section -->\n @if (hasBinary()) {\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n data-cy=\"c8y-event-details--attachment-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n [c8yIcon]=\"binaryIcon()\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 flex-grow\">\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Attachment' | translate }}</p>\n\n <!-- Image preview -->\n @if (binaryPreviewLoading()) {\n <div class=\"m-b-16\">\n <c8y-loading></c8y-loading>\n </div>\n } @else if (binaryPreviewUrl(); as previewUrl) {\n @let imgAltText = 'Attachment preview' | translate;\n <div class=\"m-b-16\">\n <img\n class=\"max-width-100\"\n [src]=\"previewUrl\"\n [alt]=\"binaryInfo()?.name || imgAltText\"\n data-cy=\"c8y-event-details--attachment-preview\"\n />\n </div>\n } @else if (binaryPreviewFailed()) {\n <p\n class=\"text-muted small m-b-8\"\n translate\n >\n Preview unavailable.\n </p>\n }\n\n <!-- Download button -->\n @if (canDownload()) {\n <button\n class=\"btn btn-primary btn-xs\"\n [title]=\"'Download' | translate\"\n [attr.aria-busy]=\"isDownloading()\"\n type=\"button\"\n [disabled]=\"isDownloading()\"\n (click)=\"downloadBinary()\"\n data-cy=\"c8y-event-details--download-btn\"\n >\n <i [c8yIcon]=\"isDownloading() ? 'spinner' : 'download'\"></i>\n <span>{{ 'Download' | translate }}</span>\n </button>\n }\n </div>\n </div>\n </div>\n }\n </c8y-icon-panel>\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { IEvent, IEventBinary } from '@c8y/client';\nimport { EventsService } from './events.service';\n\nconst DEFAULT_EVENT_ICON = 'online1';\n\n@Pipe({\n name: 'eventIcon',\n standalone: true\n})\nexport class EventIconPipe implements PipeTransform {\n private eventsService = inject(EventsService);\n\n transform(event: IEvent): string {\n const binaryInfo: IEventBinary | undefined = event['c8y_IsBinary'];\n return binaryInfo?.name\n ? this.eventsService.resolveFileIcon(binaryInfo.name)\n : DEFAULT_EVENT_ICON;\n }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { IEvent } from '@c8y/client';\nimport { EventsService } from './events.service';\n\n@Pipe({\n name: 'eventIsImage',\n standalone: true\n})\nexport class EventIsImagePipe implements PipeTransform {\n private eventsService = inject(EventsService);\n\n transform(event: IEvent): boolean {\n return this.eventsService.isImageBinary(event['c8y_IsBinary']);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { EventService, IEvent, IResultList } from '@c8y/client';\nimport { ContextData, DateTimeContext, ViewContext } from '@c8y/ngx-components';\nimport { DateTimeContextPickerService, TimeInterval } from '@c8y/ngx-components/global-context';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { Subject } from 'rxjs';\nimport { EVENTS_PATH, EventsFilter } from './events.model';\n\nexport interface BuildEventsFilterParams {\n source?: string | number | null;\n type?: string | null;\n dateRange?: DateTimeContext | null;\n dateTimeContext?: { dateFrom?: Date | string | null; dateTo?: Date | string | null } | null;\n withSourceChildren?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EventsViewService {\n readonly DEFAULT_PAGE_SIZE = 50;\n readonly DEFAULT_REFRESH_INTERVAL = 30_000;\n\n reloadEventsList$ = new Subject<void>();\n\n constructor(\n private eventService: EventService,\n private dateTimeContextPickerService: DateTimeContextPickerService\n ) {}\n\n /**\n * Emits a subject to trigger events list reload.\n */\n updateEventsList(): void {\n this.reloadEventsList$.next();\n }\n\n /**\n * Retrieves a list of events with optional filters.\n */\n async retrieveEvents(filter?: EventsFilter): Promise<IResultList<IEvent>> {\n const queryFilter: Record<string, unknown> = {\n pageSize: filter?.pageSize ?? this.DEFAULT_PAGE_SIZE,\n withTotalPages: true\n };\n\n if (filter?.source) {\n queryFilter['source'] = filter.source;\n queryFilter['withSourceChildren'] = filter.withSourceChildren ?? true;\n }\n\n if (filter?.type) {\n queryFilter['type'] = filter.type;\n }\n\n if (filter?.dateFrom) {\n queryFilter['dateFrom'] = filter.dateFrom.toISOString();\n }\n\n if (filter?.dateTo) {\n queryFilter['dateTo'] = filter.dateTo.toISOString();\n }\n\n return this.eventService.list(queryFilter);\n }\n\n /**\n * Returns the correct link based on the provided context data.\n */\n getRouterLink(contextData?: ContextData, event?: IEvent): string {\n let detailUrl = `/${EVENTS_PATH}`;\n if (event) {\n detailUrl = `/${EVENTS_PATH}/${event.id}`;\n }\n if (!contextData) {\n return detailUrl;\n }\n\n switch (contextData.context) {\n case ViewContext.Device:\n return `/device/${contextData.contextData.id}${detailUrl}`;\n case ViewContext.Group:\n return `/group/${contextData.contextData.id}${detailUrl}`;\n default:\n return detailUrl;\n }\n }\n\n /**\n * Returns the correct from and to dates based on the selected interval\n * @param intervalId the selected interval. E.g. 'none', 'hours', 'custom' ...\n * @returns The calculated date context based on the selected interval.\n */\n buildEventsFilter(params: BuildEventsFilterParams): EventsFilter {\n const dateFrom = params.dateTimeContext?.dateFrom ?? params.dateRange?.[0];\n const dateTo = params.dateTimeContext?.dateTo ?? params.dateRange?.[1];\n return {\n ...(params.source && {\n source: params.source,\n withSourceChildren: params.withSourceChildren ?? true\n }),\n ...(params.type && { type: params.type }),\n ...(dateFrom && { dateFrom: new Date(dateFrom) }),\n ...(dateTo && { dateTo: new Date(dateTo) })\n };\n }\n\n getDateTimeContextByInterval(intervalId: AlarmFilterInterval['id']): DateTimeContext {\n return this.dateTimeContextPickerService.getDateTimeContextByInterval(\n intervalId as TimeInterval\n );\n }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport { ContextRouteService } from '@c8y/ngx-components';\nimport { EventsViewService } from './events-view.service';\n\n@Pipe({\n name: 'eventRouterLink',\n standalone: true\n})\nexport class EventRouterLinkPipe implements PipeTransform {\n private activatedRoute = inject(ActivatedRoute);\n private contextRouteService = inject(ContextRouteService);\n private eventsViewService = inject(EventsViewService);\n\n transform(event: IEvent, alwaysNavigateToAllEvents = false): string {\n if (alwaysNavigateToAllEvents) {\n return this.eventsViewService.getRouterLink(null, event);\n }\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n return this.eventsViewService.getRouterLink(contextData, event);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n input,\n OnInit,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n DateTimePickerComponent,\n FormGroupComponent,\n IconDirective,\n MessageDirective,\n MessagesComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlarmFilterInterval, IntervalPickerComponent } from '@c8y/ngx-components/interval-picker';\nimport {\n BsDropdownDirective,\n BsDropdownMenuDirective,\n BsDropdownToggleDirective\n} from 'ngx-bootstrap/dropdown';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { take } from 'rxjs';\nimport { EventsViewService } from './events-view.service';\nimport {\n EventListFormFilters,\n INTERVAL_TITLES_EXTENDED,\n INTERVALS_EXTENDED,\n WidgetTimeContextStateExtended\n} from './events.model';\n\n@Component({\n selector: 'c8y-events-date-filter',\n templateUrl: './events-date-filter.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n BsDropdownDirective,\n BsDropdownToggleDirective,\n TooltipDirective,\n IconDirective,\n BsDropdownMenuDirective,\n IntervalPickerComponent,\n FormGroupComponent,\n C8yTranslateDirective,\n DateTimePickerComponent,\n MessagesComponent,\n MessageDirective,\n C8yTranslatePipe,\n DatePipe\n ]\n})\nexport class EventsDateFilterComponent implements OnInit {\n readonly INTERVALS = INTERVALS_EXTENDED;\n readonly INTERVAL_TITLES = INTERVAL_TITLES_EXTENDED;\n readonly DATE_FORMAT = 'short';\n\n readonly defaultInterval = input<AlarmFilterInterval['id']>('none');\n readonly updateQueryParams = input(true);\n date = signal<[string, string] | undefined>(undefined);\n noFilterLabel = gettext('No date filter');\n\n dateFilterChange = output<EventListFormFilters>();\n dropdown = viewChild(BsDropdownDirective);\n\n private activatedRoute = inject(ActivatedRoute);\n private destroyRef = inject(DestroyRef);\n private eventsViewService = inject(EventsViewService);\n private formBuilder = inject(FormBuilder);\n private router = inject(Router);\n\n form: ReturnType<EventsDateFilterComponent['createForm']>;\n\n ngOnInit() {\n const context = this.getDefaultContext();\n this.form = this.createForm(context);\n this.date.set([\n this.form.value.currentDateContextFromDate,\n this.form.value.currentDateContextToDate\n ]);\n this.activatedRoute.queryParams\n .pipe(take(1), takeUntilDestroyed(this.destroyRef))\n .subscribe(params => {\n if (!params.interval) {\n return;\n }\n if (params.interval !== 'custom') {\n this.updateDateTime(params.interval);\n } else {\n this.form.patchValue({\n currentDateContextInterval: params.interval,\n temporaryUserSelectedFromDate: params.dateFrom,\n temporaryUserSelectedToDate: params.dateTo\n });\n this.date.set([params.dateFrom, params.dateTo]);\n }\n });\n\n this.subscribeToIntervalChange();\n }\n\n applyDateFilter(): void {\n const interval = this.form.value.currentDateContextInterval;\n const isNoDateFilter = interval === 'none';\n\n const combinedFormEvent: EventListFormFilters = {\n interval,\n selectedDates: isNoDateFilter\n ? undefined\n : [\n new Date(this.form.value.temporaryUserSelectedFromDate),\n new Date(this.form.value.temporaryUserSelectedToDate)\n ]\n };\n\n // needed for custom interval\n this.date.set([\n this.form.value.temporaryUserSelectedFromDate,\n this.form.value.temporaryUserSelectedToDate\n ]);\n\n this.router.navigate([], {\n relativeTo: this.activatedRoute,\n queryParams: {\n interval,\n dateFrom: isNoDateFilter ? null : combinedFormEvent.selectedDates[0].toISOString(),\n dateTo: isNoDateFilter ? null : combinedFormEvent.selectedDates[1].toISOString()\n },\n queryParamsHandling: 'merge'\n });\n this.dateFilterChange.emit(combinedFormEvent);\n }\n\n private updateDateTime(interval: AlarmFilterInterval['id']): void {\n const date = this.eventsViewService.getDateTimeContextByInterval(interval);\n const dropdown = this.dropdown();\n if (dropdown) {\n dropdown.isOpen = false;\n }\n this.date.set(date.map(d => d.toISOString()) as [string, string]);\n this.form.patchValue(\n {\n temporaryUserSelectedFromDate: date[0].toISOString(),\n temporaryUserSelectedToDate: date[1].toISOString(),\n currentDateContextInterval: interval\n },\n { emitEvent: false }\n );\n this.applyDateFilter();\n }\n\n private getDefaultContext() {\n return {\n date: this.eventsViewService.getDateTimeContextByInterval(this.defaultInterval()),\n interval: this.defaultInterval()\n };\n }\n\n private subscribeToIntervalChange(): void {\n this.form.controls.currentDateContextInterval.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(interval => {\n if (interval === 'custom') {\n this.form.patchValue(\n {\n temporaryUserSelectedFromDate:\n this.form.controls.temporaryUserSelectedFromDate.value === new Date(0).toISOString()\n ? this.form.controls.currentDateContextToDate.value\n : this.form.controls.temporaryUserSelectedFromDate.value,\n currentDateContextInterval: interval\n },\n { emitEvent: false }\n );\n return;\n }\n this.updateDateTime(interval);\n });\n }\n\n private createForm(context: WidgetTimeContextStateExtended) {\n return this.formBuilder.group({\n temporaryUserSelectedFromDate: context.date[0].toISOString(),\n temporaryUserSelectedToDate: context.date[1].toISOString(),\n currentDateContextFromDate: context.date[0].toISOString(),\n currentDateContextToDate: context.date[1].toISOString(),\n currentDateContextInterval: context.interval || 'custom'\n });\n }\n}\n","<form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n>\n <div\n class=\"dropdown flex-grow\"\n #dropDirection=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{\n (form.value.currentDateContextInterval === 'none'\n ? noFilterLabel\n : (date()?.[0] | c8yDate: DATE_FORMAT) + ' — ' + (date()?.[1] | c8yDate: DATE_FORMAT)\n ) | translate\n }}\"\n tooltip=\"{{\n (form.value.currentDateContextInterval === 'none'\n ? noFilterLabel\n : (date()?.[0] | c8yDate: DATE_FORMAT) + ' — ' + (date()?.[1] | c8yDate: DATE_FORMAT)\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"events-date-filter--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{\n INTERVAL_TITLES[form.controls.currentDateContextInterval.value ?? 'none'] | translate\n }}\n </span>\n @if (form.controls.currentDateContextInterval.value !== 'none') {\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"events-date-filter--selected-time-range\"\n >\n {{ date()?.[0] | c8yDate: DATE_FORMAT }} — {{ date()?.[1] | c8yDate: DATE_FORMAT }}\n </span>\n }\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n [INTERVALS]=\"INTERVALS\"\n ></c8y-interval-picker>\n\n @if (form.controls.currentDateContextInterval.value === 'custom') {\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n class=\"m-b-8\"\n [class.has-error]=\"form.controls.temporaryUserSelectedFromDate.errors\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n [class.has-error]=\"form.controls.temporaryUserSelectedFromDate.errors\"\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate ?? ''\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors ?? {}\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n class=\"m-b-8\"\n [class.has-error]=\"form.controls.temporaryUserSelectedToDate.errors\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n [class.has-error]=\"form.controls.temporaryUserSelectedToDate.errors\"\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate ?? ''\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors ?? {}\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n data-cy=\"events-date-filter--apply-button\"\n (click)=\"applyDateFilter(); dropDirection.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n translate\n >\n Apply\n </button>\n </div>\n }\n </ul>\n </div>\n</form>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n inject,\n input,\n output,\n untracked,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { C8yTranslatePipe, CountdownIntervalComponent, IconDirective } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n selector: 'c8y-events-interval-refresh',\n templateUrl: './events-interval-refresh.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n TooltipDirective,\n CountdownIntervalComponent,\n IconDirective,\n C8yTranslatePipe\n ]\n})\nexport class EventsIntervalRefreshComponent implements AfterViewInit {\n readonly DEFAULT_INTERVAL_VALUES = [5_000, 10_000, 15_000, 30_000, 60_000];\n readonly DEFAULT_INTERVAL_VALUE = 30_000;\n readonly DISABLE_AUTO_REFRESH = gettext('Disable auto refresh');\n readonly ENABLE_AUTO_REFRESH = gettext('Enable auto refresh');\n readonly SECONDS_UNTIL_REFRESH = gettext('{{ seconds }} s');\n\n isLoading = input(false);\n isDisabled = input(false);\n isIntervalToggleEnabled = input(true);\n\n onCountdownEnded = output<void>();\n\n countdownIntervalComponent = viewChild(CountdownIntervalComponent);\n\n private fb = inject(FormBuilder);\n toggleIntervalForm = this.initForm();\n\n private destroyRef = inject(DestroyRef);\n private doesUserCheckedIntervalToggle = false;\n\n constructor() {\n effect(() => {\n const externalValue = this.isIntervalToggleEnabled();\n const intervalEnabledControl = this.toggleIntervalForm.get('intervalEnabled');\n\n const shouldUpdate =\n !intervalEnabledControl.dirty || (this.doesUserCheckedIntervalToggle && externalValue);\n\n if (shouldUpdate && intervalEnabledControl.value !== externalValue) {\n intervalEnabledControl.setValue(externalValue);\n }\n });\n\n effect(() => {\n const loading = this.isLoading();\n untracked(() => {\n if (loading) {\n this.countdownIntervalComponent()?.stop();\n } else {\n this.countdownIntervalComponent()?.reset();\n }\n });\n });\n }\n\n get isToggleEnabled(): boolean {\n return !this.isDisabled() && this.toggleIntervalForm.get('intervalEnabled').value;\n }\n\n ngAfterViewInit(): void {\n this.onIntervalToggleChange();\n this.listenToRefreshIntervalChange();\n }\n\n resetCountdown(): void {\n this.countdownIntervalComponent()?.reset();\n }\n\n trackUserClickOnIntervalToggle(target: EventTarget): void {\n this.doesUserCheckedIntervalToggle = (target as HTMLInputElement).checked;\n }\n\n getTooltip(): string {\n return this.isDisabled()\n ? gettext('Disabled')\n : this.isToggleEnabled\n ? this.DISABLE_AUTO_REFRESH\n : this.ENABLE_AUTO_REFRESH;\n }\n\n private startCountdown(): void {\n this.countdownIntervalComponent()?.start();\n }\n\n private onIntervalToggleChange(): void {\n this.toggleIntervalForm\n .get('intervalEnabled')\n .valueChanges.pipe(takeUntilDestroyed(this.destroyRef), filter(Boolean))\n .subscribe(() => setTimeout(() => this.startCountdown()));\n }\n\n private initForm() {\n return this.fb.group({\n intervalEnabled: true,\n refreshInterval: this.DEFAULT_INTERVAL_VALUE\n });\n }\n\n private listenToRefreshIntervalChange(): void {\n this.toggleIntervalForm\n .get('refreshInterval')\n .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.resetCountdown());\n }\n}\n","<form\n class=\"d-flex a-i-center fit-w fit-h\"\n [formGroup]=\"toggleIntervalForm\"\n>\n <label class=\"m-b-0 m-r-8 text-normal text-muted flex-no-shrink\">\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled()\"\n [attr.aria-label]=\"getTooltip() | translate\"\n [tooltip]=\"getTooltip() | translate\"\n placement=\"bottom\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n data-cy=\"c8y-events-interval-refresh--toggle-countdown\"\n >\n <input\n type=\"checkbox\"\n data-cy=\"c8y-events-interval-toggle\"\n formControlName=\"intervalEnabled\"\n (click)=\"trackUserClickOnIntervalToggle($event.target)\"\n />\n @if (isToggleEnabled) {\n <c8y-countdown-interval\n [countdownInterval]=\"toggleIntervalForm.value.refreshInterval ?? DEFAULT_INTERVAL_VALUE\"\n (countdownEnded)=\"onCountdownEnded.emit()\"\n />\n } @else {\n <i\n c8yIcon=\"pause\"\n data-cy=\"c8y-events-interval-refresh--pause\"\n ></i>\n }\n </label>\n @if (!isDisabled()) {\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [attr.aria-label]=\"'Refresh interval in seconds' | translate\"\n [tooltip]=\"'Refresh interval in seconds' | translate\"\n placement=\"bottom\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [container]=\"'body'\"\n formControlName=\"refreshInterval\"\n data-cy=\"c8y-events-interval-refresh--selector\"\n >\n @for (refreshInterval of DEFAULT_INTERVAL_VALUES; track refreshInterval) {\n <option\n [disabled]=\"isDisabled()\"\n [ngValue]=\"refreshInterval\"\n [attr.data-cy]=\"'c8y-interval-' + refreshInterval\"\n >\n {{ SECONDS_UNTIL_REFRESH | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n }\n </select>\n <span></span>\n </div>\n }\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n style=\"border-left: 0\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"isDisabled() || isLoading()\"\n (click)=\"onCountdownEnded.emit()\"\n data-cy=\"c8y-events-interval-refresh--btn\"\n >\n <i\n [class.icon-spin]=\"isLoading()\"\n c8yIcon=\"refresh\"\n ></i>\n </button>\n </div>\n </div>\n</form>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n RouterLink,\n RouterLinkActive\n} from '@angular/router';\nimport {\n EventBinaryService,\n IEvent,\n IEventBinary,\n IFetchResponse,\n IManagedObjectBinary,\n IResultList\n} from '@c8y/client';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n ForOfDirective,\n IconDirective,\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemComponent,\n ListItemIconComponent,\n ListItemTimelineComponent,\n LoadMoreMode,\n SplitViewAlertsComponent,\n SplitViewHeaderActionsComponent,\n SplitViewListComponent\n} from '@c8y/ngx-components';\nimport { FilePreviewModule } from '@c8y/ngx-components/file-preview';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { fromEvent, timer } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';\nimport { EventIconPipe } from './event-icon.pipe';\nimport { EventIsImagePipe } from './event-is-image.pipe';\nimport { EventRouterLinkPipe } from './event-router-link.pipe';\nimport { EventNavigationOptions } from './events.model';\n\n@Component({\n selector: 'c8y-events-list',\n templateUrl: './events-list.component.html',\n imports: [\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n EventIconPipe,\n EventIsImagePipe,\n EventRouterLinkPipe,\n ForOfDirective,\n IconDirective,\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemComponent,\n ListItemIconComponent,\n ListItemTimelineComponent,\n RouterLink,\n RouterLinkActive,\n FilePreviewModule,\n SplitViewAlertsComponent,\n SplitViewHeaderActionsComponent,\n SplitViewListComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EventsListComponent implements AfterViewInit {\n readonly EMPTY_STATE_TITLE = gettext('No events to display.');\n readonly LIST_TITLE = gettext('Events list');\n\n /**\n * The paginated result list of events to display.\n */\n events = input<IResultList<IEvent>>();\n\n /**\n * Whether the events are currently being fetched.\n */\n isLoading = input(false);\n\n /**\n * Controls the \"load more\" button behavior at the bottom of the list.\n */\n loadMoreMode = input<LoadMoreMode>('hidden');\n\n /**\n * Whether to show a file preview button for image events.\n */\n showPreview = input(false);\n\n /**\n * Defines options for how the events list should navigate when a user clicks on an event.\n */\n navigationOptions = input<EventNavigationOptions>({\n allowNavigationToEventsView: true,\n alwaysNavigateToAllEvents: false,\n queryParamsHandling: 'merge'\n });\n\n /**\n * Emits `true` when the list is scrolled past the threshold, `false` when scrolled back.\n * Used to hide the countdown interval refresh control.\n */\n onScrollingStateChange = output<boolean>();\n\n /**\n * Emits `true` when a file preview is opened, `false` when closed.\n */\n onPreviewStateChange = output<boolean>();\n\n /**\n * Emits the event that was clicked by the user.\n */\n onSelectedEvent = output<IEvent>();\n\n activeEvent = signal<IEvent | null>(null);\n activeChildParamId = signal<string | null>(null);\n pendingActiveCheck = signal(true);\n showEmptyState = computed(\n () => !!this.events() && !this.events()?.data?.length && !this.isLoading()\n );\n showFilterWarning = computed(\n () =>\n !this.pendingActiveCheck() &&\n !!this.activeChildParamId() &&\n this.activeEvent()?.id !== this.activeChildParamId()\n );\n\n svListComponent = viewChild<SplitViewListComponent>('scrollWrapper');\n\n private isPreviewOpen = signal(false);\n\n /** Scroll threshold in pixels after which the countdown interval is hidden. */\n private readonly HIDE_INTERVAL_COUNTDOWN_SCROLL = 50;\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly bsModalService = inject(BsModalService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly eventBinaryService = inject(EventBinaryService);\n private readonly router = inject(Router);\n\n constructor() {\n this.setupActiveChildParamTracking();\n this.setupPreviewModalCloseListener();\n\n effect(() => {\n this.events();\n untracked(() => {\n this.activeEvent.set(null);\n this.pendingActiveCheck.set(true);\n if (this.activeChildParamId()) {\n // Wait for routerLinkActive to confirm the match via activeRouteChanged.\n // Fallback clears pending state so warning can show if event is not in the list.\n timer(500)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.pendingActiveCheck.set(false));\n } else {\n this.pendingActiveCheck.set(false);\n }\n });\n });\n }\n\n ngAfterViewInit(): void {\n this.setupScrollListener();\n }\n\n onEventClick(event: IEvent): void {\n this.onSelectedEvent.emit(event);\n }\n\n activeRouteChanged(isActive: boolean, scrollAnchor: ListItemComponent, event: IEvent): void {\n if (isActive) {\n scrollAnchor.element.nativeElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest'\n });\n this.activeEvent.set(event);\n this.pendingActiveCheck.set(false);\n }\n }\n\n onPreviewClick(mouseEvent: MouseEvent): void {\n mouseEvent.stopPropagation();\n this.isPreviewOpen.set(true);\n this.onPreviewStateChange.emit(true);\n }\n\n toBinaryMo(event: IEvent): IManagedObjectBinary {\n const binaryInfo: IEventBinary = event['c8y_IsBinary'];\n return {\n id: `${event.id}`,\n name: binaryInfo?.name ?? event.text,\n contentType: binaryInfo?.type ?? 'application/octet-stream',\n type: binaryInfo?.type ?? 'application/octet-stream',\n length: 0,\n c8y_IsBinary: {}\n };\n }\n\n getEventDownloadFn(event: IEvent): () => Promise<IFetchResponse> {\n return () => this.eventBinaryService.download(event);\n }\n\n private setupPreviewModalCloseListener(): void {\n this.bsModalService.onHidden\n .pipe(\n filter(() => this.isPreviewOpen()),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.isPreviewOpen.set(false);\n this.onPreviewStateChange.emit(false);\n });\n }\n\n private setupActiveChildParamTracking(): void {\n this.router.events\n .pipe(\n filter(e => e instanceof NavigationEnd && this.activatedRoute.children.length > 0),\n switchMap(() => this.activatedRoute.children[0].params),\n map(params => params['id']),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(id => this.activeChildParamId.set(id ?? null));\n }\n\n private setupScrollListener(): void {\n const scrollElement = this.svListComponent()?.innerScrollDiv?.nativeElement;\n if (scrollElement) {\n fromEvent(scrollElement, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(300))\n .subscribe((scrollEvent: Event) => {\n if (!(scrollEvent.target instanceof HTMLElement)) {\n return;\n }\n const isScrolledPastThreshold = this.shouldCountdownIntervalBeHidden(scrollEvent.target);\n this.onScrollingStateChange.emit(isScrolledPastThreshold);\n });\n }\n }\n\n private shouldCountdownIntervalBeHidden(target: HTMLElement): boolean {\n return target.scrollTop > this.HIDE_INTERVAL_COUNTDOWN_SCROLL;\n }\n}\n","<c8y-sv-list\n [emptyStateIcon]=\"'online1'\"\n [title]=\"LIST_TITLE | translate\"\n [emptyStateTitle]=\"EMPTY_STATE_TITLE | translate\"\n #scrollWrapper\n [loading]=\"isLoading()\"\n [showEmptyState]=\"showEmptyState()\"\n [docsUrl]=\"\n '/docs/device-management-application/monitoring-and-controlling-devices/#to-view-events'\n \"\n data-cy=\"c8y-events-list\"\n>\n <c8y-sv-header-actions>\n <ng-content />\n </c8y-sv-header-actions>\n\n <c8y-sv-alerts>\n @if (showFilterWarning()) {\n <div\n class=\"alert alert-warning m-b-0\"\n role=\"alert\"\n translate\n >\n The selected event is not currently in the list, change your filter.\n </div>\n }\n </c8y-sv-alerts>\n\n <c8y-list-group class=\"c8y-list--timeline d-block p-r-16 p-t-16\">\n @let navOpts = navigationOptions();\n <c8y-li-timeline\n class=\"pointer c8y-list--timeline__item\"\n role=\"button\"\n data-cy=\"c8y-events-list--timeline-item\"\n *c8yFor=\"let event of events()!; loadMore: loadMoreMode()\"\n [routerLink]=\"\n navOpts.allowNavigationToEventsView\n ? (event | eventRouterLink: navOpts.alwaysNavigateToAllEvents)\n : null\n \"\n [queryParamsHandling]=\"navOpts.queryParamsHandling\"\n routerLinkActive=\"active\"\n (isActiveChange)=\"activeRouteChanged($event, liScrollAnchor, event)\"\n (click)=\"onEventClick(event)\"\n >\n <!-- Date column -->\n <span data-cy=\"c8y-events-list--event-date\">\n {{ event.time | c8yDate: 'mediumDate' }}\n {{ event.time | c8yDate: 'mediumTime' }}\n </span>\n\n <c8y-li\n style=\"scroll-margin-top: 56px\"\n #liScrollAnchor\n >\n <c8y-li-icon class=\"a-s-start\">\n <i [c8yIcon]=\"event | eventIcon\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"a-s-stretch\">\n <div class=\"d-flex a-i-start fit-h\">\n <div class=\"min-width-0 flex-grow\">\n <!-- Event column (text) -->\n <p\n class=\"text-truncate-wrap p-b-4\"\n data-cy=\"c8y-events-list--event-text\"\n >\n {{ event.text | translate }}\n </p>\n\n <!-- Source column -->\n <p\n class=\"small text-muted text-truncate\"\n [title]=\"event.source?.name\"\n data-cy=\"c8y-events-list--event-source\"\n >\n <i [c8yIcon]=\"'exchange'\"></i>\n {{ event.source?.name }}\n </p>\n </div>\n @if (showPreview() && (event | eventIsImage)) {\n <c8y-file-preview\n data-cy=\"c8y-events-list--image-preview\"\n (click)=\"onPreviewClick($event)\"\n [mo]=\"toBinaryMo(event)\"\n [downloadFn]=\"getEventDownloadFn(event)\"\n >\n <button\n class=\"btn btn-default btn-icon btn-xs\"\n [title]=\"'Preview' | translate\"\n type=\"button\"\n customButton\n data-cy=\"c8y-events-list--preview-btn\"\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n }\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</c8y-sv-list>\n","import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n QueryList,\n ViewChildren,\n computed,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IEvent, IResultList } from '@c8y/client';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n ColorService,\n EmptyStateComponent,\n IconDirective,\n ListGroupComponent,\n ListItemComponent\n} from '@c8y/ngx-components';\nimport { AlarmEventSelectorService, EventDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport {\n BsDropdownDirective,\n BsDropdownMenuDirective,\n BsDropdownToggleDirective\n} from 'ngx-bootstrap/dropdown';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { map } from 'rxjs/operators';\n\n@Component({\n selector: 'c8y-events-type-filter',\n templateUrl: './events-type-filter.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n BsDropdownDirective,\n BsDropdownToggleDirective,\n BsDropdownMenuDirective,\n CdkTrapFocus,\n IconDirective,\n ListGroupComponent,\n ListItemComponent,\n FormsModule,\n TooltipDirective,\n EmptyStateComponent,\n C8yTranslateDirective,\n C8yTranslatePipe\n ]\n})\nexport class EventsTypeFilterComponent implements OnInit {\n @ViewChildren('optionItem', { read: ElementRef }) optionItems!: QueryList<ElementRef>;\n\n /** The latest page of events used to derive available filter types. */\n events = input<IResultList<IEvent>>();\n\n /** Emits the selected {@link EventDetails} when the active filter changes, or `null` when cleared. */\n onFilterChanged = output<EventDetails | null>();\n\n possibleFilters = signal<EventDetails[]>([]);\n activeFilter = signal<EventDetails | null>(null);\n customEventTypeInput = signal('');\n isCustomEventTypeInputInvalid = computed(() => !this.customEventTypeInput().trim());\n\n readonly queryParamName = 'eventTypeFilter';\n /**\n * localStorage key storing user-added custom event types.\n * Schema: `EventDetails[]` serialised as JSON (only entries where `__target === null`).\n */\n readonly STORAGE_ACCESS_KEY = 'customEventTypes';\n\n private activatedRoute = inject(ActivatedRoute);\n private alarmEventSelectorService = inject(AlarmEventSelectorService);\n private colorService = inject(ColorService);\n private destroyRef = inject(DestroyRef);\n private router = inject(Router);\n private currentQueryParam = '';\n\n constructor() {\n effect(() => {\n const eventsResult = this.events();\n if (eventsResult) {\n untracked(() => {\n if (!this.activeFilter()) {\n this.setPossibleFilters()\n .then(() => this.applyFilterChange())\n // eslint-disable-next-line no-console\n .catch(err => console.error('[EventsTypeFilter] Failed to load filters', err));\n }\n });\n }\n });\n }\n\n ngOnInit(): void {\n this.setQueryParameterObservable();\n }\n\n setQueryParameterObservable(): void {\n this.activatedRoute.queryParams\n .pipe(\n map(params => {\n const events: EventDetails[] = this.possibleFilters();\n const possibleFilters = this.setActiveEventFiltersFromQueryParameter(\n events,\n params[this.queryParamName]\n );\n return possibleFilters;\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((possibleFilters: EventDetails[]) => {\n this.possibleFilters.set(possibleFilters);\n this.applyFilterChange();\n });\n }\n\n selectEventType(eventType: EventDetails): void {\n this.possibleFilters.update(filters =>\n filters.map(f => ({ ...f, __active: f.filters.type === eventType.filters.type }))\n );\n }\n\n /** Selects an event type, applies the filter, and closes the dropdown in one action. */\n selectAndClose(eventType: EventDetails, dropdown: BsDropdownDirective): void {\n this.selectEventType(eventType);\n this.applyFilterChange();\n dropdown.hide();\n }\n\n deselect(): void {\n this.possibleFilters.update(filters => filters.map(f => ({ ...f, __active: false })));\n this.applyFilterChange();\n }\n\n applyFilterChange(): void {\n const active = this.possibleFilters().find((eventFilter: EventDetails) => eventFilter.__active);\n const newQueryParam = active?.filters.type ?? '';\n const hasChanged = newQueryParam !== this.currentQueryParam;\n if (hasChanged) {\n this.activeFilter.set(active ?? null);\n this.onFilterChanged.emit(this.activeFilter());\n this.router.navigate([], {\n queryParams: {\n [this.queryParamName]: newQueryParam || null\n },\n queryParamsHandling: 'merge'\n });\n this.currentQueryParam = newQueryParam;\n }\n }\n\n restoreActiveFilter(): void {\n const activeType = this.activeFilter()?.filters.type;\n this.possibleFilters.update(filters =>\n filters.map(f => ({ ...f, __active: f.filters.type === activeType }))\n );\n }\n\n removeCustomEvent(eventDetails: EventDetails): void {\n const wasActive = eventDetails.filters.type === this.activeFilter()?.filters.type;\n this.possibleFilters.update(filters =>\n filters.filter(f => f.filters.type !== eventDetails.filters.type)\n );\n this.storeCustomEventTypes();\n if (wasActive) {\n this.applyFilterChange();\n }\n }\n\n navigateOption(event: KeyboardEvent, step: 1 | -1): void {\n event.preventDefault();\n const items = this.optionItems.toArray();\n const focused = document.activeElement;\n const currentIndex = items.findIndex(item => item.nativeElement === focused);\n const nextIndex = (currentIndex + step + items.length) % items.length;\n items[nextIndex]?.nativeElement.focus();\n }\n\n confirmWithEnter(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n this.addCustomEventType();\n }\n }\n\n async addCustomEventType(): Promise<void> {\n const inputValue = this.customEventTypeInput().trim();\n if (!inputValue) {\n return;\n }\n let color: string;\n try {\n color = await this.colorService.generateColor(inputValue);\n } catch {\n color = '#000000';\n }\n const newFilter: EventDetails = {\n label: inputValue,\n color,\n filters: { type: inputValue },\n timelineType: 'EVENT',\n __active: true,\n __target: null\n };\n this.possibleFilters.update(filters => [\n newFilter,\n ...filters.map(f => ({ ...f, __active: false }))\n ]);\n this.customEventTypeInput.set('');\n this.storeCustomEventTypes();\n this.applyFilterChange();\n }\n\n private storeCustomEventTypes(): void {\n try {\n const customTypes = this.possibleFilters().filter((filter: EventDetails) => !filter.__target);\n window.localStorage.setItem(this.STORAGE_ACCESS_KEY, JSON.stringify(customTypes));\n } catch {\n // localStorage may be unavailable or quota exceeded — skip persistence silently\n }\n }\n\n private getCustomEventTypeFromStorage(): EventDetails[] {\n try {\n const types = window.localStorage.getItem(this.STORAGE_ACCESS_KEY);\n return types ? JSON.parse(types) : [];\n } catch {\n return [];\n }\n }\n\n private async setPossibleFilters(): Promise<void> {\n const queryParameters = this.activatedRoute.snapshot.queryParamMap.get(this.queryParamName);\n const eventsData = this.events()?.data ?? [];\n const eventTypesFromCurrentlyShownEvents =\n await this.alarmEventSelectorService.getUniqueEventsOnly(eventsData);\n const customEventTypesFromLocalStorage = this.getCustomEventTypeFromStorage();\n const selectableEventTypes = this.setActiveEventFiltersFromQueryParameter(\n [...customEventTypesFromLocalStorage, ...eventTypesFromCurrentlyShownEvents],\n queryParameters\n );\n this.possibleFilters.set(selectableEventTypes);\n }\n\n private setActiveEventFiltersFromQueryParameter(\n eventFilters: EventDetails[],\n filterTypeQuery = ''\n ): EventDetails[] {\n const selectedType = filterTypeQuery ?? '';\n return eventFilters.map((event: EventDetails) => ({\n ...event,\n __active: event.filters.type === selectedType\n }));\n }\n}\n","<div class=\"d-flex a-i-center\">\n <div\n class=\"dropdown\"\n title=\"{{ 'Filter by event types' | translate }}\"\n dropdown\n [insideClick]=\"true\"\n #filtersDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"filtersDropdown.isOpen\"\n (onHidden)=\"restoreActiveFilter()\"\n >\n <div class=\"input-group fit-w\">\n @let active = activeFilter();\n <div\n class=\"form-control d-flex a-i-center inner-scroll\"\n role=\"status\"\n >\n @if (active) {\n <span\n class=\"text-truncate\"\n style=\"max-width: 150px !important\"\n [title]=\"active.filters.type\"\n >\n {{ active.filters.type }}\n </span>\n } @else {\n <span class=\"text-nowrap\">\n {{ 'All event types' | translate }}\n </span>\n }\n </div>\n @if (active) {\n <div class=\"input-group-btn text-center\">\n <button\n class=\"btn-default btn\"\n [title]=\"'Clear filter' | translate\"\n [attr.aria-label]=\"'Clear filter' | translate\"\n (click)=\"deselect()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <div class=\"input-group-btn input-group-btn--last\">\n <button\n class=\"btn-default m-l-0 btn btn--caret\"\n [attr.aria-label]=\"'Event types' | translate\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"filtersDropdown.isOpen\"\n [attr.aria-controls]=\"'event-types-listbox'\"\n data-cy=\"c8y-event-type-filter\"\n dropdownToggle\n >\n <i\n class=\"caret\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n <div\n class=\"dropdown-menu dropdown-menu-action-bar\"\n *dropdownMenu\n >\n <div\n class=\"p-16 bg-level-2\"\n style=\"min-width: 250px\"\n >\n <div>\n <p class=\"icon-flex\">\n <i\n class=\"text-info m-r-4\"\n [c8yIcon]=\"'info-circle'\"\n aria-hidden=\"true\"\n ></i>\n <strong translate>The list may be incomplete</strong>\n </p>\n <p class=\"text-12\">\n <span translate>\n Recent events are displayed below, but older ones may not be shown.\n </span>\n <span translate>Optionally, you can add a custom event type.</span>\n </p>\n </div>\n </div>\n <div class=\"input-group p-16 separator-bottom\">\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Custom event type' | translate\"\n type=\"text\"\n [placeholder]=\"'Custom event type' | translate\"\n [ngModel]=\"customEventTypeInput()\"\n (ngModelChange)=\"customEventTypeInput.set($event)\"\n (keydown)=\"confirmWithEnter($event)\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn-dot text-primary\"\n [attr.aria-label]=\"'Add custom event' | translate\"\n [tooltip]=\"'Add' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n [disabled]=\"isCustomEventTypeInputInvalid()\"\n (click)=\"addCustomEventType()\"\n >\n <i\n c8yIcon=\"plus-circle\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n <c8y-list-group\n [attr.aria-label]=\"'Event types' | translate\"\n id=\"event-types-listbox\"\n role=\"listbox\"\n >\n @for (eventType of possibleFilters(); track eventType.filters.type) {\n <c8y-li\n class=\"pointer p-0\"\n tabindex=\"0\"\n [attr.aria-selected]=\"eventType.__active\"\n role=\"option\"\n [active]=\"eventType.__active\"\n #optionItem\n (keydown.arrowdown)=\"navigateOption($event, 1)\"\n (keydown.arrowup)=\"navigateOption($event, -1)\"\n (keydown.enter)=\"selectAndClose(eventType, filtersDropdown)\"\n (click)=\"selectAndClose(eventType, filtersDropdown)\"\n >\n <div class=\"d-flex gap-8 a-i-center flex-grow p-t-4 p-b-4\">\n <span\n class=\"circle-icon-wrapper\"\n [style.background-color]=\"eventType.color\"\n >\n <i\n class=\"stroked-icon\"\n [c8yIcon]=\"'online1'\"\n aria-hidden=\"true\"\n ></i>\n </span>\n <span\n class=\"text-truncate text-12 flex-grow\"\n [title]=\"eventType.label\"\n [attr.aria-label]=\"eventType.label\"\n >\n {{ eventType.label }}\n </span>\n @if (eventType.__target === null) {\n <button\n class=\"btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n [tooltip]=\"'Remove' | translate\"\n placement=\"top\"\n [delay]=\"500\"\n (click)=\"removeCustomEvent(eventType); $event.stopPropagation()\"\n >\n <i\n c8yIcon=\"minus-circle\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n </c8y-li>\n }\n @if (possibleFilters().length === 0) {\n <c8y-li aria-live=\"polite\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n icon=\"online1\"\n [title]=\"'No events found' | translate\"\n [subtitle]=\"\n 'There are no events to filter. You can still add a custom event type.' | translate\n \"\n [horizontal]=\"true\"\n />\n </c8y-li>\n }\n </c8y-list-group>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n OnInit,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterOutlet } from '@angular/router';\nimport { IEvent, IResultList } from '@c8y/client';\nimport {\n ActionBarItemComponent,\n AlertService,\n C8yTranslatePipe,\n ContextRouteService,\n DateTimeContext,\n HelpComponent,\n SplitViewComponent,\n SplitViewDetailsComponent,\n TitleComponent,\n ViewContext\n} from '@c8y/ngx-components';\nimport { EventDetails } from '@c8y/ngx-components/alarm-event-selector';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlarmFilterInterval } from '@c8y/ngx-components/interval-picker';\nimport { debounceTime } from 'rxjs/operators';\nimport { EventsDateFilterComponent } from './events-date-filter.component';\nimport { EventsIntervalRefreshComponent } from './events-interval-refresh.component';\nimport { EventsListComponent } from './events-list.component';\nimport { EventsTypeFilterComponent } from './events-type-filter.component';\nimport { EventsViewService } from './events-view.service';\nimport { EventListFormFilters } from './events.model';\n\n@Component({\n selector: 'c8y-events',\n templateUrl: './events.component.html',\n imports: [\n C8yTranslatePipe,\n TitleComponent,\n HelpComponent,\n ActionBarItemComponent,\n SplitViewComponent,\n SplitViewDetailsComponent,\n EventsListComponent,\n EventsDateFilterComponent,\n EventsIntervalRefreshComponent,\n EventsTypeFilterComponent,\n RouterOutlet\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EventsComponent implements OnInit {\n readonly TITLE = gettext('Events');\n\n events = signal<IResultList<IEvent> | null>(null);\n isLoading = signal(false);\n shouldShowIntervalToggle = signal(true);\n\n contextSourceId: string | number | null = null;\n isListScrolled = signal(false);\n typeFilter: EventDetails | null = null;\n\n private dateFilter: DateTimeContext | null = null;\n private dateInterval: AlarmFilterInterval['id'] | null = null;\n\n private activatedRoute = inject(ActivatedRoute);\n private alertService = inject(AlertService);\n private contextRouteService = inject(ContextRouteService);\n private destroyRef = inject(DestroyRef);\n private eventsViewService = inject(EventsViewService);\n\n constructor() {\n this.initializeContextSourceId();\n }\n\n ngOnInit(): void {\n this.setupEventListReload();\n\n // Pause interval if already in detail view\n const isInDetailView = !!this.activatedRoute.children[0]?.snapshot.params['id'];\n if (isInDetailView) {\n this.changeInterval(false);\n }\n\n // Initial load\n this.eventsViewService.updateEventsList();\n }\n\n refresh(): void {\n this.eventsViewService.updateEventsList();\n }\n\n changeInterval(value = true): void {\n this.shouldShowIntervalToggle.set(value);\n }\n\n onScrollingStateChange(isScrolling: boolean): void {\n this.isListScrolled.set(isScrolling);\n this.changeInterval(!isScrolling);\n }\n\n onPreviewStateChange(isOpen: boolean): void {\n if (isOpen || !this.isListScrolled()) {\n this.changeInterval(!isOpen);\n }\n }\n\n onEventSelected(): void {\n this.changeInterval(false);\n }\n\n applyTypeFilter(filter: EventDetails | null): void {\n this.typeFilter = filter;\n this.refresh();\n }\n\n applyDateFilter(filter: EventListFormFilters): void {\n this.dateInterval = filter.interval ?? null;\n this.dateFilter = filter.selectedDates ?? null;\n this.refresh();\n }\n\n private setupEventListReload(): void {\n this.eventsViewService.reloadEventsList$\n .pipe(debounceTime(100), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.loadEvents());\n }\n\n private async loadEvents(): Promise<void> {\n try {\n this.isLoading.set(true);\n\n const filter = this.eventsViewService.buildEventsFilter({\n source: this.contextSourceId,\n type: this.typeFilter?.filters.type ?? null,\n dateRange: this.resolveCurrentDateRange()\n });\n\n const events: IResultList<IEvent> = await this.eventsViewService.retrieveEvents(filter);\n this.events.set(events);\n } catch (error: unknown) {\n this.alertService.addServerFailure(error);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private resolveCurrentDateRange(): DateTimeContext | null {\n if (!this.dateInterval || this.dateInterval === 'none') {\n return null;\n }\n if (this.dateInterval === 'custom') {\n return this.dateFilter;\n }\n return this.eventsViewService.getDateTimeContextByInterval(this.dateInterval);\n }\n\n private initializeContextSourceId(): void {\n const routeContext = this.contextRouteService.getContextData(this.activatedRoute);\n if (!routeContext) {\n return;\n }\n\n const { context, contextData } = routeContext;\n if ([ViewContext.Device, ViewContext.Group].includes(context)) {\n this.contextSourceId = contextData?.id;\n }\n }\n}\n","<c8y-title>{{ TITLE | translate }}</c8y-title>\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#troubleshooting-devices\"\n></c8y-help>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-events-type-filter\n [events]=\"events()\"\n (onFilterChanged)=\"applyTypeFilter($event)\"\n />\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-events-date-filter (dateFilterChange)=\"applyDateFilter($event)\" />\n</c8y-action-bar-item>\n\n<c8y-sv [resizableConfig]=\"{ trackId: 'events-split-view', collapsible: false }\">\n <c8y-events-list\n [events]=\"events()\"\n [isLoading]=\"isLoading()\"\n (onScrollingStateChange)=\"onScrollingStateChange($event)\"\n (onPreviewStateChange)=\"onPreviewStateChange($event)\"\n (onSelectedEvent)=\"onEventSelected()\"\n >\n <c8y-events-interval-refresh\n [isLoading]=\"isLoading()\"\n [isIntervalToggleEnabled]=\"shouldShowIntervalToggle()\"\n (onCountdownEnded)=\"refresh()\"\n />\n </c8y-events-list>\n\n <c8y-sv-details\n emptyStateIcon=\"online1\"\n [emptyStateTitle]=\"'No event selected' | translate\"\n [emptyStateSubtitle]=\"'Select an event from the list to view its details.' | translate\"\n >\n <router-outlet />\n </c8y-sv-details>\n</c8y-sv>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["STANDARD_KEYS","RESERVED_KEYS","i1"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Input, Inject, Component, EventEmitter, NgModule } from '@angular/core';
2
+ import { InjectionToken, input, computed, Inject, Component, EventEmitter, NgModule } from '@angular/core';
3
3
  import * as i3 from '@c8y/ngx-components';
4
4
  import { IconDirective, ModalComponent, LoadingComponent, C8yTranslatePipe, BytesPipe, CoreModule, CommonModule } from '@c8y/ngx-components';
5
5
  import * as i1 from 'ngx-bootstrap/modal';
@@ -7,7 +7,6 @@ import * as i2 from '@angular/platform-browser';
7
7
  import { takeUntil, first } from 'rxjs/operators';
8
8
  import { Subject } from 'rxjs';
9
9
  import { gettext } from '@c8y/ngx-components/gettext';
10
- import { NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';
11
10
 
12
11
  const PRODUCT_EXPERIENCE_FILE_PREVIEW = {
13
12
  EVENTS: {
@@ -42,10 +41,6 @@ const DOWNLOAD_EMITTER = new InjectionToken('downloadEmitter');
42
41
  *
43
42
  */
44
43
  class FilePreviewComponent {
45
- set _mo(mo) {
46
- this.mo = mo;
47
- this.setContentType();
48
- }
49
44
  constructor(downloadEmitter, modalRef, modalService, sanitizer, filesService, alertService, gainsightService) {
50
45
  this.downloadEmitter = downloadEmitter;
51
46
  this.modalRef = modalRef;
@@ -54,11 +49,19 @@ class FilePreviewComponent {
54
49
  this.filesService = filesService;
55
50
  this.alertService = alertService;
56
51
  this.gainsightService = gainsightService;
57
- this.contentType = 'unsupported';
52
+ this.mo = input.required(...(ngDevMode ? [{ debugName: "mo" }] : []));
53
+ this.downloadFn = input(...(ngDevMode ? [undefined, { debugName: "downloadFn" }] : []));
54
+ this.contentType = computed(() => this.resolveContentType(this.mo()), ...(ngDevMode ? [{ debugName: "contentType" }] : []));
55
+ this.progress = {
56
+ totalBytes: 0,
57
+ bufferedBytes: 0,
58
+ percentage: 0,
59
+ bytesPerSecond: 0
60
+ };
58
61
  this.BUFFERING_STATUS_TEXT = gettext('{{speed}}/s - {{bufferedBytes}} of {{totalBytes}} buffered ({{percentage}}%)');
59
62
  this.destroy$ = new Subject();
60
63
  downloadEmitter.pipe(takeUntil(this.destroy$)).subscribe(id => {
61
- if (this.dataUrl && this.mo.id !== id) {
64
+ if (this.dataUrl && this.mo().id !== id) {
62
65
  this.removeDownloadedFile();
63
66
  }
64
67
  });
@@ -81,9 +84,13 @@ class FilePreviewComponent {
81
84
  if (this.dataUrl) {
82
85
  return;
83
86
  }
84
- this.downloadEmitter.emit(this.mo.id);
87
+ this.downloadEmitter.emit(this.mo().id);
88
+ if (this.downloadFn()) {
89
+ await this.fetchWithDownloadFn();
90
+ return;
91
+ }
85
92
  const subscription = this.filesService
86
- .fetchFileWithProgress$(this.mo)
93
+ .fetchFileWithProgress$(this.mo())
87
94
  .pipe(takeUntil(this.destroy$))
88
95
  .subscribe(progress => {
89
96
  this.progress = progress;
@@ -99,59 +106,59 @@ class FilePreviewComponent {
99
106
  subscription.unsubscribe();
100
107
  });
101
108
  }
109
+ async fetchWithDownloadFn() {
110
+ try {
111
+ const fn = this.downloadFn();
112
+ if (!fn) {
113
+ return;
114
+ }
115
+ const response = await fn();
116
+ const blob = await response.blob();
117
+ this.dataUrl = URL.createObjectURL(blob);
118
+ this.safeDataUrl = this.sanitizer.bypassSecurityTrustUrl(this.dataUrl);
119
+ }
120
+ catch (e) {
121
+ this.modalRef.hide();
122
+ this.alertService.addServerFailure(e);
123
+ }
124
+ }
102
125
  removeDownloadedFile() {
103
126
  URL.revokeObjectURL(this.dataUrl);
104
127
  delete this.dataUrl;
105
128
  delete this.safeDataUrl;
106
129
  }
107
- setContentType() {
108
- if (!this.mo || !this.mo.hasOwnProperty('c8y_IsBinary')) {
130
+ resolveContentType(mo) {
131
+ if (!mo || !mo.hasOwnProperty('c8y_IsBinary')) {
109
132
  // eslint-disable-next-line no-console
110
133
  console.warn('Provided Managed object is not binary');
111
- this.contentType = 'unsupported';
112
- return;
134
+ return 'unsupported';
113
135
  }
114
- if (this.mo.contentType.startsWith('image/')) {
115
- this.contentType = 'image';
136
+ if (mo.contentType.startsWith('image/')) {
137
+ return 'image';
116
138
  }
117
- else if (this.mo.contentType.startsWith('video/')) {
118
- this.contentType = 'video';
139
+ else if (mo.contentType.startsWith('video/')) {
140
+ return 'video';
119
141
  }
120
- else if (this.mo.contentType.startsWith('text/')) {
142
+ else if (mo.contentType.startsWith('text/')) {
121
143
  // @TODO: Implement in future
122
- this.contentType = 'unsupported';
144
+ return 'unsupported';
123
145
  }
124
- else if (this.mo.contentType.startsWith('application/json')) {
146
+ else if (mo.contentType.startsWith('application/json')) {
125
147
  // @TODO: Implement in future
126
- this.contentType = 'unsupported';
127
- }
128
- else {
129
- this.contentType = 'unsupported';
148
+ return 'unsupported';
130
149
  }
150
+ return 'unsupported';
131
151
  }
132
152
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilePreviewComponent, deps: [{ token: DOWNLOAD_EMITTER }, { token: i1.BsModalRef }, { token: i1.BsModalService }, { token: i2.DomSanitizer }, { token: i3.FilesService }, { token: i3.AlertService }, { token: i3.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
133
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: FilePreviewComponent, isStandalone: true, selector: "c8y-file-preview", inputs: { _mo: ["mo", "_mo"] }, ngImport: i0, template: "<div\n class=\"d-inline-block\"\n *ngIf=\"contentType !== 'unsupported'\"\n (click)=\"openModal(modalTemplate)\"\n>\n <div #customButtonRef>\n <ng-content select=\"[customButton]\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"!customButtonRef.children.length\">\n <button [title]=\"'Preview file' | translate\" type=\"button\" class=\"btn btn-default btn-icon\">\n <i c8yIcon=\"search\"></i>\n </button>\n </ng-container>\n</div>\n\n<ng-template #modalTemplate>\n <c8y-modal\n [title]=\"mo.name\"\n [customFooter]=\"false\"\n (onClose)=\"modalRef.hide()\"\n (onDismiss)=\"modalRef.hide()\"\n [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n class=\"text-break-word\"\n >\n <div class=\"text-center d-block\" *ngIf=\"!dataUrl\">\n <c8y-loading layout=\"application\" [progress]=\"progress.percentage\"></c8y-loading>\n {{\n BUFFERING_STATUS_TEXT\n | translate\n : {\n totalBytes: progress.totalBytes | bytes,\n bufferedBytes: progress.bufferedBytes | bytes,\n percentage: progress.percentage,\n speed: progress.bytesPerSecond | bytes\n }\n }}\n </div>\n\n <ng-container *ngIf=\"dataUrl\" [ngSwitch]=\"contentType\" id=\"modal-body\">\n <ng-container *ngSwitchCase=\"'image'\">\n <img class=\"fit-w\" alt=\"safeDataUrl\" [src]=\"safeDataUrl\" />\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'video'\">\n <video controls autoplay class=\"fit-w\">\n <source [src]=\"safeDataUrl\" />\n {{ 'Your browser does not support the video tag.' | translate }}\n </video>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <!-- @TODO: Implement text viewer-->\n text\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'json'\">\n <!-- @TODO: Implement json viewer-->\n json\n </ng-container>\n\n <ng-container *ngSwitchDefault></ng-container>\n </ng-container>\n </c8y-modal>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BytesPipe, name: "bytes" }] }); }
153
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FilePreviewComponent, isStandalone: true, selector: "c8y-file-preview", inputs: { mo: { classPropertyName: "mo", publicName: "mo", isSignal: true, isRequired: true, transformFunction: null }, downloadFn: { classPropertyName: "downloadFn", publicName: "downloadFn", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (contentType() !== 'unsupported') {\n <div\n class=\"d-inline-block\"\n (click)=\"openModal(modalTemplate)\"\n >\n <div #customButtonRef>\n <ng-content select=\"[customButton]\"></ng-content>\n </div>\n\n @if (!customButtonRef.children.length) {\n <button\n class=\"btn btn-default btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"search\"></i>\n </button>\n }\n </div>\n}\n\n<ng-template #modalTemplate>\n <c8y-modal\n class=\"text-break-word\"\n [title]=\"mo().name\"\n [customFooter]=\"false\"\n (onClose)=\"modalRef.hide()\"\n (onDismiss)=\"modalRef.hide()\"\n [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n >\n @if (!dataUrl) {\n <div class=\"text-center d-block\">\n <c8y-loading\n layout=\"application\"\n [progress]=\"progress.percentage\"\n ></c8y-loading>\n {{\n BUFFERING_STATUS_TEXT\n | translate\n : {\n totalBytes: progress.totalBytes | bytes,\n bufferedBytes: progress.bufferedBytes | bytes,\n percentage: progress.percentage,\n speed: progress.bytesPerSecond | bytes\n }\n }}\n </div>\n }\n\n @if (dataUrl) {\n <div id=\"modal-body\">\n @switch (contentType()) {\n @case ('image') {\n <img\n class=\"fit-w\"\n alt=\"safeDataUrl\"\n [src]=\"safeDataUrl\"\n />\n }\n @case ('video') {\n <video\n class=\"fit-w\"\n controls\n autoplay\n >\n <source [src]=\"safeDataUrl\" />\n {{ 'Your browser does not support the video tag.' | translate }}\n </video>\n }\n @case ('text') {\n <!-- @TODO: Implement text viewer-->\n text\n }\n @case ('json') {\n <!-- @TODO: Implement json viewer-->\n json\n }\n }\n </div>\n }\n </c8y-modal>\n</ng-template>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BytesPipe, name: "bytes" }] }); }
134
154
  }
135
155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilePreviewComponent, decorators: [{
136
156
  type: Component,
137
- args: [{ selector: 'c8y-file-preview', imports: [
138
- NgIf,
139
- IconDirective,
140
- ModalComponent,
141
- LoadingComponent,
142
- NgSwitch,
143
- NgSwitchCase,
144
- NgSwitchDefault,
145
- C8yTranslatePipe,
146
- BytesPipe
147
- ], template: "<div\n class=\"d-inline-block\"\n *ngIf=\"contentType !== 'unsupported'\"\n (click)=\"openModal(modalTemplate)\"\n>\n <div #customButtonRef>\n <ng-content select=\"[customButton]\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"!customButtonRef.children.length\">\n <button [title]=\"'Preview file' | translate\" type=\"button\" class=\"btn btn-default btn-icon\">\n <i c8yIcon=\"search\"></i>\n </button>\n </ng-container>\n</div>\n\n<ng-template #modalTemplate>\n <c8y-modal\n [title]=\"mo.name\"\n [customFooter]=\"false\"\n (onClose)=\"modalRef.hide()\"\n (onDismiss)=\"modalRef.hide()\"\n [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n class=\"text-break-word\"\n >\n <div class=\"text-center d-block\" *ngIf=\"!dataUrl\">\n <c8y-loading layout=\"application\" [progress]=\"progress.percentage\"></c8y-loading>\n {{\n BUFFERING_STATUS_TEXT\n | translate\n : {\n totalBytes: progress.totalBytes | bytes,\n bufferedBytes: progress.bufferedBytes | bytes,\n percentage: progress.percentage,\n speed: progress.bytesPerSecond | bytes\n }\n }}\n </div>\n\n <ng-container *ngIf=\"dataUrl\" [ngSwitch]=\"contentType\" id=\"modal-body\">\n <ng-container *ngSwitchCase=\"'image'\">\n <img class=\"fit-w\" alt=\"safeDataUrl\" [src]=\"safeDataUrl\" />\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'video'\">\n <video controls autoplay class=\"fit-w\">\n <source [src]=\"safeDataUrl\" />\n {{ 'Your browser does not support the video tag.' | translate }}\n </video>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <!-- @TODO: Implement text viewer-->\n text\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'json'\">\n <!-- @TODO: Implement json viewer-->\n json\n </ng-container>\n\n <ng-container *ngSwitchDefault></ng-container>\n </ng-container>\n </c8y-modal>\n</ng-template>\n" }]
157
+ args: [{ selector: 'c8y-file-preview', imports: [IconDirective, ModalComponent, LoadingComponent, C8yTranslatePipe, BytesPipe], template: "@if (contentType() !== 'unsupported') {\n <div\n class=\"d-inline-block\"\n (click)=\"openModal(modalTemplate)\"\n >\n <div #customButtonRef>\n <ng-content select=\"[customButton]\"></ng-content>\n </div>\n\n @if (!customButtonRef.children.length) {\n <button\n class=\"btn btn-default btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"search\"></i>\n </button>\n }\n </div>\n}\n\n<ng-template #modalTemplate>\n <c8y-modal\n class=\"text-break-word\"\n [title]=\"mo().name\"\n [customFooter]=\"false\"\n (onClose)=\"modalRef.hide()\"\n (onDismiss)=\"modalRef.hide()\"\n [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n >\n @if (!dataUrl) {\n <div class=\"text-center d-block\">\n <c8y-loading\n layout=\"application\"\n [progress]=\"progress.percentage\"\n ></c8y-loading>\n {{\n BUFFERING_STATUS_TEXT\n | translate\n : {\n totalBytes: progress.totalBytes | bytes,\n bufferedBytes: progress.bufferedBytes | bytes,\n percentage: progress.percentage,\n speed: progress.bytesPerSecond | bytes\n }\n }}\n </div>\n }\n\n @if (dataUrl) {\n <div id=\"modal-body\">\n @switch (contentType()) {\n @case ('image') {\n <img\n class=\"fit-w\"\n alt=\"safeDataUrl\"\n [src]=\"safeDataUrl\"\n />\n }\n @case ('video') {\n <video\n class=\"fit-w\"\n controls\n autoplay\n >\n <source [src]=\"safeDataUrl\" />\n {{ 'Your browser does not support the video tag.' | translate }}\n </video>\n }\n @case ('text') {\n <!-- @TODO: Implement text viewer-->\n text\n }\n @case ('json') {\n <!-- @TODO: Implement json viewer-->\n json\n }\n }\n </div>\n }\n </c8y-modal>\n</ng-template>\n" }]
148
158
  }], ctorParameters: () => [{ type: i0.EventEmitter, decorators: [{
149
159
  type: Inject,
150
160
  args: [DOWNLOAD_EMITTER]
151
- }] }, { type: i1.BsModalRef }, { type: i1.BsModalService }, { type: i2.DomSanitizer }, { type: i3.FilesService }, { type: i3.AlertService }, { type: i3.GainsightService }], propDecorators: { _mo: [{
152
- type: Input,
153
- args: ['mo']
154
- }] } });
161
+ }] }, { type: i1.BsModalRef }, { type: i1.BsModalService }, { type: i2.DomSanitizer }, { type: i3.FilesService }, { type: i3.AlertService }, { type: i3.GainsightService }], propDecorators: { mo: [{ type: i0.Input, args: [{ isSignal: true, alias: "mo", required: true }] }], downloadFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "downloadFn", required: false }] }] } });
155
162
 
156
163
  const downloadEmitter = new EventEmitter();
157
164
  class FilePreviewModule {
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-file-preview.mjs","sources":["../../file-preview/file-preview-product-experience.constants.ts","../../file-preview/download-emitter.token.ts","../../file-preview/file-preview.component.ts","../../file-preview/file-preview.component.html","../../file-preview/file-preview.module.ts","../../file-preview/c8y-ngx-components-file-preview.ts"],"sourcesContent":["export const PRODUCT_EXPERIENCE_FILE_PREVIEW = {\n EVENTS: {\n FILE_PREVIEW: 'filePreview'\n },\n COMPONENTS: {\n FILE_PREVIEW_COMPONENT: 'file-preview'\n },\n ACTIONS: {\n OPEN_PREVIEW: 'openPreview'\n }\n} as const;\n","import { EventEmitter, InjectionToken } from '@angular/core';\n\n/**\n * Provides InjectionToken used in FilePreviewModule. This token is used to inject EventEmitter instance, that is\n * shared among all instances of FilePreviewComponent. These components communicate between each other using this\n * emitter, which enables them to clear downloaded files from memory, if other instance of FilePreviewComponent\n * started downloading different file. Value emitted by this EventEmitter is ID of downloaded file.\n */\nexport const DOWNLOAD_EMITTER = new InjectionToken<EventEmitter<string>>('downloadEmitter');\n","import { Component, EventEmitter, Inject, Input, OnDestroy, TemplateRef } from '@angular/core';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { IManagedObjectBinary } from '@c8y/client';\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n FilesService,\n IFetchWithProgress,\n GainsightService,\n IconDirective,\n ModalComponent,\n LoadingComponent,\n C8yTranslatePipe,\n BytesPipe\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_FILE_PREVIEW } from './file-preview-product-experience.constants';\nimport { DOWNLOAD_EMITTER } from './download-emitter.token';\nimport { NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\n\n/**\n * A component which shows a button that opens a modal with the preview of a binary managed object.\n * This component requires CSP 'blob:' rule for img-src and media-src to be set.\n *\n * ```html\n * <c8y-file-preview [mo]=\"managedObject\">\n * <button customButton>Preview</button>\n * </c8y-file-preview>\n * ```\n * If no custom button provided, the component will use the default search icon button instead.\n *\n */\n@Component({\n selector: 'c8y-file-preview',\n templateUrl: './file-preview.component.html',\n imports: [\n NgIf,\n IconDirective,\n ModalComponent,\n LoadingComponent,\n NgSwitch,\n NgSwitchCase,\n NgSwitchDefault,\n C8yTranslatePipe,\n BytesPipe\n ]\n})\nexport class FilePreviewComponent implements OnDestroy {\n @Input('mo')\n set _mo(mo: IManagedObjectBinary) {\n this.mo = mo;\n this.setContentType();\n }\n mo: IManagedObjectBinary;\n\n contentType: 'image' | 'video' | 'text' | 'json' | 'unsupported' = 'unsupported';\n progress: IFetchWithProgress;\n\n dataUrl: string;\n safeDataUrl: SafeUrl;\n BUFFERING_STATUS_TEXT = gettext(\n '{{speed}}/s - {{bufferedBytes}} of {{totalBytes}} buffered ({{percentage}}%)'\n );\n\n private destroy$: Subject<any> = new Subject();\n\n constructor(\n @Inject(DOWNLOAD_EMITTER) private downloadEmitter: EventEmitter<string>,\n public modalRef: BsModalRef,\n private modalService: BsModalService,\n private sanitizer: DomSanitizer,\n private filesService: FilesService,\n private alertService: AlertService,\n private gainsightService: GainsightService\n ) {\n downloadEmitter.pipe(takeUntil(this.destroy$)).subscribe(id => {\n if (this.dataUrl && this.mo.id !== id) {\n this.removeDownloadedFile();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.removeDownloadedFile();\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n async openModal(template: TemplateRef<any>) {\n this.modalRef = this.modalService.show(template, {\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n });\n\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_FILE_PREVIEW.EVENTS.FILE_PREVIEW, {\n component: PRODUCT_EXPERIENCE_FILE_PREVIEW.COMPONENTS.FILE_PREVIEW_COMPONENT,\n action: PRODUCT_EXPERIENCE_FILE_PREVIEW.ACTIONS.OPEN_PREVIEW\n });\n\n if (this.dataUrl) {\n return;\n }\n\n this.downloadEmitter.emit(this.mo.id);\n\n const subscription = this.filesService\n .fetchFileWithProgress$(this.mo)\n .pipe(takeUntil(this.destroy$))\n .subscribe(\n progress => {\n this.progress = progress;\n if (this.progress.blob) {\n this.dataUrl = URL.createObjectURL(progress.blob);\n this.safeDataUrl = this.sanitizer.bypassSecurityTrustUrl(this.dataUrl);\n }\n },\n e => {\n this.modalRef.hide();\n this.alertService.addServerFailure(e);\n }\n );\n\n this.modalRef.onHide.pipe(first(), takeUntil(this.destroy$)).subscribe(() => {\n subscription.unsubscribe();\n });\n }\n\n private removeDownloadedFile(): void {\n URL.revokeObjectURL(this.dataUrl);\n delete this.dataUrl;\n delete this.safeDataUrl;\n }\n\n private setContentType(): void {\n if (!this.mo || !this.mo.hasOwnProperty('c8y_IsBinary')) {\n // eslint-disable-next-line no-console\n console.warn('Provided Managed object is not binary');\n this.contentType = 'unsupported';\n return;\n }\n\n if (this.mo.contentType.startsWith('image/')) {\n this.contentType = 'image';\n } else if (this.mo.contentType.startsWith('video/')) {\n this.contentType = 'video';\n } else if (this.mo.contentType.startsWith('text/')) {\n // @TODO: Implement in future\n this.contentType = 'unsupported';\n } else if (this.mo.contentType.startsWith('application/json')) {\n // @TODO: Implement in future\n this.contentType = 'unsupported';\n } else {\n this.contentType = 'unsupported';\n }\n }\n}\n","<div\n class=\"d-inline-block\"\n *ngIf=\"contentType !== 'unsupported'\"\n (click)=\"openModal(modalTemplate)\"\n>\n <div #customButtonRef>\n <ng-content select=\"[customButton]\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"!customButtonRef.children.length\">\n <button [title]=\"'Preview file' | translate\" type=\"button\" class=\"btn btn-default btn-icon\">\n <i c8yIcon=\"search\"></i>\n </button>\n </ng-container>\n</div>\n\n<ng-template #modalTemplate>\n <c8y-modal\n [title]=\"mo.name\"\n [customFooter]=\"false\"\n (onClose)=\"modalRef.hide()\"\n (onDismiss)=\"modalRef.hide()\"\n [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n class=\"text-break-word\"\n >\n <div class=\"text-center d-block\" *ngIf=\"!dataUrl\">\n <c8y-loading layout=\"application\" [progress]=\"progress.percentage\"></c8y-loading>\n {{\n BUFFERING_STATUS_TEXT\n | translate\n : {\n totalBytes: progress.totalBytes | bytes,\n bufferedBytes: progress.bufferedBytes | bytes,\n percentage: progress.percentage,\n speed: progress.bytesPerSecond | bytes\n }\n }}\n </div>\n\n <ng-container *ngIf=\"dataUrl\" [ngSwitch]=\"contentType\" id=\"modal-body\">\n <ng-container *ngSwitchCase=\"'image'\">\n <img class=\"fit-w\" alt=\"safeDataUrl\" [src]=\"safeDataUrl\" />\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'video'\">\n <video controls autoplay class=\"fit-w\">\n <source [src]=\"safeDataUrl\" />\n {{ 'Your browser does not support the video tag.' | translate }}\n </video>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <!-- @TODO: Implement text viewer-->\n text\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'json'\">\n <!-- @TODO: Implement json viewer-->\n json\n </ng-container>\n\n <ng-container *ngSwitchDefault></ng-container>\n </ng-container>\n </c8y-modal>\n</ng-template>\n","import { EventEmitter, NgModule } from '@angular/core';\nimport { CoreModule, CommonModule } from '@c8y/ngx-components';\nimport { FilePreviewComponent } from './file-preview.component';\nimport { DOWNLOAD_EMITTER } from './download-emitter.token';\n\nconst downloadEmitter = new EventEmitter<string>();\n\n@NgModule({\n imports: [CoreModule, CommonModule, FilePreviewComponent],\n exports: [FilePreviewComponent],\n providers: [\n {\n provide: DOWNLOAD_EMITTER,\n useValue: downloadEmitter\n }\n ]\n})\nexport class FilePreviewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-file-preview.mjs","sources":["../../file-preview/file-preview-product-experience.constants.ts","../../file-preview/download-emitter.token.ts","../../file-preview/file-preview.component.ts","../../file-preview/file-preview.component.html","../../file-preview/file-preview.module.ts","../../file-preview/c8y-ngx-components-file-preview.ts"],"sourcesContent":["export const PRODUCT_EXPERIENCE_FILE_PREVIEW = {\n EVENTS: {\n FILE_PREVIEW: 'filePreview'\n },\n COMPONENTS: {\n FILE_PREVIEW_COMPONENT: 'file-preview'\n },\n ACTIONS: {\n OPEN_PREVIEW: 'openPreview'\n }\n} as const;\n","import { EventEmitter, InjectionToken } from '@angular/core';\n\n/**\n * Provides InjectionToken used in FilePreviewModule. This token is used to inject EventEmitter instance, that is\n * shared among all instances of FilePreviewComponent. These components communicate between each other using this\n * emitter, which enables them to clear downloaded files from memory, if other instance of FilePreviewComponent\n * started downloading different file. Value emitted by this EventEmitter is ID of downloaded file.\n */\nexport const DOWNLOAD_EMITTER = new InjectionToken<EventEmitter<string>>('downloadEmitter');\n","import {\n Component,\n computed,\n EventEmitter,\n Inject,\n input,\n OnDestroy,\n TemplateRef\n} from '@angular/core';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { IFetchResponse, IManagedObjectBinary } from '@c8y/client';\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n FilesService,\n IFetchWithProgress,\n GainsightService,\n IconDirective,\n ModalComponent,\n LoadingComponent,\n C8yTranslatePipe,\n BytesPipe\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_FILE_PREVIEW } from './file-preview-product-experience.constants';\nimport { DOWNLOAD_EMITTER } from './download-emitter.token';\n\n/**\n * A component which shows a button that opens a modal with the preview of a binary managed object.\n * This component requires CSP 'blob:' rule for img-src and media-src to be set.\n *\n * ```html\n * <c8y-file-preview [mo]=\"managedObject\">\n * <button customButton>Preview</button>\n * </c8y-file-preview>\n * ```\n * If no custom button provided, the component will use the default search icon button instead.\n *\n */\n@Component({\n selector: 'c8y-file-preview',\n templateUrl: './file-preview.component.html',\n imports: [IconDirective, ModalComponent, LoadingComponent, C8yTranslatePipe, BytesPipe]\n})\nexport class FilePreviewComponent implements OnDestroy {\n mo = input.required<IManagedObjectBinary>();\n downloadFn = input<() => Promise<IFetchResponse>>();\n\n contentType = computed(() => this.resolveContentType(this.mo()));\n progress: IFetchWithProgress = {\n totalBytes: 0,\n bufferedBytes: 0,\n percentage: 0,\n bytesPerSecond: 0\n };\n\n dataUrl: string;\n safeDataUrl: SafeUrl;\n BUFFERING_STATUS_TEXT = gettext(\n '{{speed}}/s - {{bufferedBytes}} of {{totalBytes}} buffered ({{percentage}}%)'\n );\n\n private destroy$: Subject<any> = new Subject();\n\n constructor(\n @Inject(DOWNLOAD_EMITTER) private downloadEmitter: EventEmitter<string>,\n public modalRef: BsModalRef,\n private modalService: BsModalService,\n private sanitizer: DomSanitizer,\n private filesService: FilesService,\n private alertService: AlertService,\n private gainsightService: GainsightService\n ) {\n downloadEmitter.pipe(takeUntil(this.destroy$)).subscribe(id => {\n if (this.dataUrl && this.mo().id !== id) {\n this.removeDownloadedFile();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.removeDownloadedFile();\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n async openModal(template: TemplateRef<any>) {\n this.modalRef = this.modalService.show(template, {\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n });\n\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_FILE_PREVIEW.EVENTS.FILE_PREVIEW, {\n component: PRODUCT_EXPERIENCE_FILE_PREVIEW.COMPONENTS.FILE_PREVIEW_COMPONENT,\n action: PRODUCT_EXPERIENCE_FILE_PREVIEW.ACTIONS.OPEN_PREVIEW\n });\n\n if (this.dataUrl) {\n return;\n }\n\n this.downloadEmitter.emit(this.mo().id);\n\n if (this.downloadFn()) {\n await this.fetchWithDownloadFn();\n return;\n }\n\n const subscription = this.filesService\n .fetchFileWithProgress$(this.mo())\n .pipe(takeUntil(this.destroy$))\n .subscribe(\n progress => {\n this.progress = progress;\n if (this.progress.blob) {\n this.dataUrl = URL.createObjectURL(progress.blob);\n this.safeDataUrl = this.sanitizer.bypassSecurityTrustUrl(this.dataUrl);\n }\n },\n e => {\n this.modalRef.hide();\n this.alertService.addServerFailure(e);\n }\n );\n\n this.modalRef.onHide.pipe(first(), takeUntil(this.destroy$)).subscribe(() => {\n subscription.unsubscribe();\n });\n }\n\n private async fetchWithDownloadFn(): Promise<void> {\n try {\n const fn = this.downloadFn();\n if (!fn) {\n return;\n }\n const response = await fn();\n const blob = await response.blob();\n this.dataUrl = URL.createObjectURL(blob);\n this.safeDataUrl = this.sanitizer.bypassSecurityTrustUrl(this.dataUrl);\n } catch (e) {\n this.modalRef.hide();\n this.alertService.addServerFailure(e);\n }\n }\n\n private removeDownloadedFile(): void {\n URL.revokeObjectURL(this.dataUrl);\n delete this.dataUrl;\n delete this.safeDataUrl;\n }\n\n private resolveContentType(\n mo: IManagedObjectBinary\n ): 'image' | 'video' | 'text' | 'json' | 'unsupported' {\n if (!mo || !mo.hasOwnProperty('c8y_IsBinary')) {\n // eslint-disable-next-line no-console\n console.warn('Provided Managed object is not binary');\n return 'unsupported';\n }\n\n if (mo.contentType.startsWith('image/')) {\n return 'image';\n } else if (mo.contentType.startsWith('video/')) {\n return 'video';\n } else if (mo.contentType.startsWith('text/')) {\n // @TODO: Implement in future\n return 'unsupported';\n } else if (mo.contentType.startsWith('application/json')) {\n // @TODO: Implement in future\n return 'unsupported';\n }\n return 'unsupported';\n }\n}\n","@if (contentType() !== 'unsupported') {\n <div\n class=\"d-inline-block\"\n (click)=\"openModal(modalTemplate)\"\n >\n <div #customButtonRef>\n <ng-content select=\"[customButton]\"></ng-content>\n </div>\n\n @if (!customButtonRef.children.length) {\n <button\n class=\"btn btn-default btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"search\"></i>\n </button>\n }\n </div>\n}\n\n<ng-template #modalTemplate>\n <c8y-modal\n class=\"text-break-word\"\n [title]=\"mo().name\"\n [customFooter]=\"false\"\n (onClose)=\"modalRef.hide()\"\n (onDismiss)=\"modalRef.hide()\"\n [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n >\n @if (!dataUrl) {\n <div class=\"text-center d-block\">\n <c8y-loading\n layout=\"application\"\n [progress]=\"progress.percentage\"\n ></c8y-loading>\n {{\n BUFFERING_STATUS_TEXT\n | translate\n : {\n totalBytes: progress.totalBytes | bytes,\n bufferedBytes: progress.bufferedBytes | bytes,\n percentage: progress.percentage,\n speed: progress.bytesPerSecond | bytes\n }\n }}\n </div>\n }\n\n @if (dataUrl) {\n <div id=\"modal-body\">\n @switch (contentType()) {\n @case ('image') {\n <img\n class=\"fit-w\"\n alt=\"safeDataUrl\"\n [src]=\"safeDataUrl\"\n />\n }\n @case ('video') {\n <video\n class=\"fit-w\"\n controls\n autoplay\n >\n <source [src]=\"safeDataUrl\" />\n {{ 'Your browser does not support the video tag.' | translate }}\n </video>\n }\n @case ('text') {\n <!-- @TODO: Implement text viewer-->\n text\n }\n @case ('json') {\n <!-- @TODO: Implement json viewer-->\n json\n }\n }\n </div>\n }\n </c8y-modal>\n</ng-template>\n","import { EventEmitter, NgModule } from '@angular/core';\nimport { CoreModule, CommonModule } from '@c8y/ngx-components';\nimport { FilePreviewComponent } from './file-preview.component';\nimport { DOWNLOAD_EMITTER } from './download-emitter.token';\n\nconst downloadEmitter = new EventEmitter<string>();\n\n@NgModule({\n imports: [CoreModule, CommonModule, FilePreviewComponent],\n exports: [FilePreviewComponent],\n providers: [\n {\n provide: DOWNLOAD_EMITTER,\n useValue: downloadEmitter\n }\n ]\n})\nexport class FilePreviewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}