@c8y/ngx-components 1021.51.1 → 1021.54.2

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 (252) hide show
  1. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts +10 -2
  2. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.d.ts.map +1 -1
  3. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts +11 -0
  4. package/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.d.ts.map +1 -0
  5. package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts +10 -4
  6. package/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.d.ts.map +1 -1
  7. package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts +3 -1
  8. package/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.d.ts.map +1 -1
  9. package/alarm-event-selector/alarm-event-selector.model.d.ts +7 -0
  10. package/alarm-event-selector/alarm-event-selector.model.d.ts.map +1 -1
  11. package/core/dashboard/dashboard-child-action.component.d.ts +1 -1
  12. package/core/dashboard/dashboard-child-action.component.d.ts.map +1 -1
  13. package/core/dashboard/dashboard.module.d.ts +29 -29
  14. package/core/dashboard/index.d.ts +3 -0
  15. package/core/dashboard/index.d.ts.map +1 -1
  16. package/core/dashboard/widgets-dashboard.component.d.ts +1 -1
  17. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  18. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +1 -1
  19. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  20. package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts +1 -1
  21. package/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.d.ts.map +1 -1
  22. package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts +10 -0
  23. package/core/dashboard/wiget-time-context/widget-time-context-date-range.service.d.ts.map +1 -0
  24. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +7 -4
  25. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  26. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +0 -1
  27. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  28. package/core/date-picker/date-picker.component.d.ts +1 -1
  29. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  30. package/core/date-picker/date-picker.module.d.ts +9 -9
  31. package/core/date-time-picker/close-date-picker.directive.d.ts +1 -1
  32. package/core/date-time-picker/close-date-picker.directive.d.ts.map +1 -1
  33. package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
  34. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  35. package/core/date-time-picker/date-time-picker.module.d.ts +11 -11
  36. package/core/date-time-picker/date-time-picker.module.d.ts.map +1 -1
  37. package/core/forms/forms.module.d.ts +18 -18
  38. package/core/forms/required-input-placeholder.directive.d.ts +1 -1
  39. package/core/forms/required-input-placeholder.directive.d.ts.map +1 -1
  40. package/core/router/router.service.d.ts.map +1 -1
  41. package/core/user/user-menu.service.d.ts +36 -11
  42. package/core/user/user-menu.service.d.ts.map +1 -1
  43. package/datapoint-explorer/c8y-ngx-components-datapoint-explorer.d.ts.map +1 -0
  44. package/datapoint-explorer/datapoint-explorer.module.d.ts +7 -0
  45. package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -0
  46. package/datapoint-explorer/index.d.ts +2 -0
  47. package/datapoint-explorer/index.d.ts.map +1 -0
  48. package/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -0
  49. package/datapoint-explorer/view/configuration/naming-dictionary.d.ts +3 -0
  50. package/datapoint-explorer/view/configuration/naming-dictionary.d.ts.map +1 -0
  51. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts +38 -0
  52. package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -0
  53. package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts +7 -0
  54. package/datapoint-explorer/view/configuration/workspace-configuration.model.d.ts.map +1 -0
  55. package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts +15 -0
  56. package/datapoint-explorer/view/configuration/workspace-configuration.service.d.ts.map +1 -0
  57. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts +25 -0
  58. package/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.d.ts.map +1 -0
  59. package/datapoint-explorer/view/datapoint-explorer.component.d.ts +67 -0
  60. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -0
  61. package/datapoint-explorer/view/datapoint-explorer.service.d.ts +9 -0
  62. package/datapoint-explorer/view/datapoint-explorer.service.d.ts.map +1 -0
  63. package/datapoint-explorer/view/index.d.ts +2 -0
  64. package/datapoint-explorer/view/index.d.ts.map +1 -0
  65. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts +23 -0
  66. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts.map +1 -0
  67. package/echart/c8y-ngx-components-echart.d.ts.map +1 -0
  68. package/echart/chart-alerts/chart-alerts.component.d.ts +8 -0
  69. package/echart/chart-alerts/chart-alerts.component.d.ts.map +1 -0
  70. package/echart/charts.component.d.ts +63 -0
  71. package/echart/charts.component.d.ts.map +1 -0
  72. package/echart/index.d.ts +5 -0
  73. package/echart/index.d.ts.map +1 -0
  74. package/echart/models/c8y-ngx-components-echart-models.d.ts.map +1 -0
  75. package/echart/models/chart.model.d.ts +37 -0
  76. package/echart/models/chart.model.d.ts.map +1 -0
  77. package/echart/models/datapoints-graph-widget.model.d.ts +126 -0
  78. package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -0
  79. package/echart/models/index.d.ts +4 -0
  80. package/echart/models/index.d.ts.map +1 -0
  81. package/echart/models/svg-icons.model.d.ts +22 -0
  82. package/echart/models/svg-icons.model.d.ts.map +1 -0
  83. package/echart/services/chart-alarms.service.d.ts +17 -0
  84. package/echart/services/chart-alarms.service.d.ts.map +1 -0
  85. package/echart/services/chart-events.service.d.ts +17 -0
  86. package/echart/services/chart-events.service.d.ts.map +1 -0
  87. package/echart/services/chart-realtime.service.d.ts +35 -0
  88. package/echart/services/chart-realtime.service.d.ts.map +1 -0
  89. package/echart/services/chart-types.service.d.ts +15 -0
  90. package/echart/services/chart-types.service.d.ts.map +1 -0
  91. package/echart/services/custom-measurements.service.d.ts +12 -0
  92. package/echart/services/custom-measurements.service.d.ts.map +1 -0
  93. package/echart/services/echarts-options.service.d.ts +143 -0
  94. package/echart/services/echarts-options.service.d.ts.map +1 -0
  95. package/echart/services/y-axis.service.d.ts +17 -0
  96. package/echart/services/y-axis.service.d.ts.map +1 -0
  97. package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.component.mjs +37 -12
  98. package/esm2022/alarm-event-selector/alarm-event-attributes-form/alarm-event-attributes-form.model.mjs +2 -0
  99. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +39 -12
  100. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +6 -4
  101. package/esm2022/alarm-event-selector/alarm-event-selector.component.mjs +1 -1
  102. package/esm2022/alarm-event-selector/alarm-event-selector.model.mjs +1 -1
  103. package/esm2022/alarm-event-selector/custom-alarm-event-form/custom-alarm-event-form.component.mjs +1 -1
  104. package/esm2022/alarms/alarms-filter.component.mjs +3 -3
  105. package/esm2022/core/dashboard/dashboard-child-action.component.mjs +3 -3
  106. package/esm2022/core/dashboard/dashboard.module.mjs +17 -14
  107. package/esm2022/core/dashboard/index.mjs +4 -1
  108. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -9
  109. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +11 -9
  110. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +8 -7
  111. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-date-range.service.mjs +23 -0
  112. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +70 -26
  113. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -1
  114. package/esm2022/core/date-picker/date-picker.component.mjs +29 -14
  115. package/esm2022/core/date-picker/date-picker.module.mjs +9 -7
  116. package/esm2022/core/date-time-picker/close-date-picker.directive.mjs +4 -3
  117. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +57 -29
  118. package/esm2022/core/date-time-picker/date-time-picker.module.mjs +11 -7
  119. package/esm2022/core/forms/forms.module.mjs +3 -3
  120. package/esm2022/core/forms/ip-range-input-list.component.mjs +5 -5
  121. package/esm2022/core/forms/required-input-placeholder.directive.mjs +4 -3
  122. package/esm2022/core/router/router.service.mjs +1 -1
  123. package/esm2022/core/user/user-menu.service.mjs +57 -17
  124. package/esm2022/datapoint-explorer/c8y-ngx-components-datapoint-explorer.mjs +5 -0
  125. package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +65 -0
  126. package/esm2022/datapoint-explorer/index.mjs +2 -0
  127. package/esm2022/datapoint-explorer/view/c8y-ngx-components-datapoint-explorer-view.mjs +5 -0
  128. package/esm2022/datapoint-explorer/view/configuration/naming-dictionary.mjs +65 -0
  129. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.component.mjs +169 -0
  130. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.model.mjs +2 -0
  131. package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.service.mjs +40 -0
  132. package/esm2022/datapoint-explorer/view/create-new-report-modal/create-new-report-modal.component.mjs +64 -0
  133. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +279 -0
  134. package/esm2022/datapoint-explorer/view/datapoint-explorer.service.mjs +23 -0
  135. package/esm2022/datapoint-explorer/view/index.mjs +2 -0
  136. package/esm2022/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.mjs +48 -0
  137. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
  138. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  139. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +3 -3
  140. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +3 -3
  141. package/esm2022/device-list/add-smart-group.component.mjs +3 -3
  142. package/esm2022/echart/c8y-ngx-components-echart.mjs +5 -0
  143. package/esm2022/echart/chart-alerts/chart-alerts.component.mjs +16 -0
  144. package/esm2022/echart/charts.component.mjs +560 -0
  145. package/esm2022/echart/index.mjs +5 -0
  146. package/esm2022/echart/models/c8y-ngx-components-echart-models.mjs +5 -0
  147. package/esm2022/echart/models/chart.model.mjs +2 -0
  148. package/esm2022/echart/models/datapoints-graph-widget.model.mjs +17 -0
  149. package/esm2022/echart/models/index.mjs +4 -0
  150. package/esm2022/echart/models/svg-icons.model.mjs +22 -0
  151. package/esm2022/echart/services/chart-alarms.service.mjs +58 -0
  152. package/esm2022/echart/services/chart-events.service.mjs +44 -0
  153. package/esm2022/echart/services/chart-realtime.service.mjs +193 -0
  154. package/esm2022/echart/services/chart-types.service.mjs +102 -0
  155. package/esm2022/echart/services/custom-measurements.service.mjs +52 -0
  156. package/esm2022/echart/services/echarts-options.service.mjs +857 -0
  157. package/esm2022/echart/services/y-axis.service.mjs +150 -0
  158. package/esm2022/icon-selector/icons/platform/index.mjs +10 -8
  159. package/esm2022/interval-picker/interval-picker.component.mjs +3 -3
  160. package/esm2022/interval-picker/interval-picker.model.mjs +1 -1
  161. package/esm2022/report-dashboard/index.mjs +2 -1
  162. package/esm2022/time-context/c8y-ngx-components-time-context.mjs +5 -0
  163. package/esm2022/time-context/index.mjs +2 -0
  164. package/esm2022/time-context/time-context.component.mjs +217 -0
  165. package/esm2022/time-context/time-context.service.mjs +83 -0
  166. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +6 -5
  167. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  168. package/esm2022/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +5 -0
  169. package/esm2022/widgets/definitions/datapoints-graph/index.mjs +31 -0
  170. package/esm2022/widgets/definitions/index.mjs +3 -2
  171. package/esm2022/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +5 -0
  172. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +239 -0
  173. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +241 -0
  174. package/esm2022/widgets/implementations/datapoints-graph/index.mjs +3 -0
  175. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +80 -28
  176. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  177. package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
  178. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  179. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +658 -0
  180. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -0
  181. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +72 -0
  182. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -0
  183. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +4 -4
  184. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  185. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +4 -4
  186. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  187. package/fesm2022/c8y-ngx-components-device-list.mjs +2 -2
  188. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  189. package/fesm2022/c8y-ngx-components-echart-models.mjs +46 -0
  190. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -0
  191. package/fesm2022/c8y-ngx-components-echart.mjs +2023 -0
  192. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -0
  193. package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs +9 -7
  194. package/fesm2022/c8y-ngx-components-icon-selector-icons-platform.mjs.map +1 -1
  195. package/fesm2022/c8y-ngx-components-interval-picker.mjs +2 -2
  196. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  197. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
  198. package/fesm2022/c8y-ngx-components-time-context.mjs +300 -0
  199. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -0
  200. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +5 -4
  201. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  202. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  203. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  204. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +38 -0
  205. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -0
  206. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  207. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  208. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +467 -0
  209. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -0
  210. package/fesm2022/c8y-ngx-components.mjs +429 -277
  211. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  212. package/icon-selector/icons/index.d.ts +1 -1
  213. package/icon-selector/icons/platform/index.d.ts +2 -2
  214. package/icon-selector/icons/platform/index.d.ts.map +1 -1
  215. package/interval-picker/interval-picker.component.d.ts.map +1 -1
  216. package/interval-picker/interval-picker.model.d.ts.map +1 -1
  217. package/locales/de.po +206 -279
  218. package/locales/es.po +206 -279
  219. package/locales/fr.po +206 -279
  220. package/locales/ja_JP.po +196 -279
  221. package/locales/ko.po +455 -444
  222. package/locales/locales.pot +190 -272
  223. package/locales/nl.po +206 -279
  224. package/locales/pl.po +206 -279
  225. package/locales/pt_BR.po +206 -279
  226. package/locales/zh_CN.po +450 -443
  227. package/locales/zh_TW.po +452 -445
  228. package/package.json +1 -1
  229. package/report-dashboard/index.d.ts +1 -0
  230. package/report-dashboard/index.d.ts.map +1 -1
  231. package/time-context/c8y-ngx-components-time-context.d.ts.map +1 -0
  232. package/time-context/index.d.ts +2 -0
  233. package/time-context/index.d.ts.map +1 -0
  234. package/time-context/time-context.component.d.ts +61 -0
  235. package/time-context/time-context.component.d.ts.map +1 -0
  236. package/time-context/time-context.service.d.ts +25 -0
  237. package/time-context/time-context.service.d.ts.map +1 -0
  238. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -1
  239. package/widgets/cockpit-exports/index.d.ts +6 -0
  240. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  241. package/widgets/definitions/datapoints-graph/c8y-ngx-components-widgets-definitions-datapoints-graph.d.ts.map +1 -0
  242. package/widgets/definitions/datapoints-graph/index.d.ts +16 -0
  243. package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -0
  244. package/widgets/definitions/index.d.ts +1 -0
  245. package/widgets/definitions/index.d.ts.map +1 -1
  246. package/widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -0
  247. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts +43 -0
  248. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -0
  249. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +54 -0
  250. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -0
  251. package/widgets/implementations/datapoints-graph/index.d.ts +3 -0
  252. package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -0
@@ -0,0 +1,467 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Component, Optional, Input, ViewChild } from '@angular/core';
3
+ import * as i4 from '@angular/forms';
4
+ import { FormBuilder, NgForm, Validators } from '@angular/forms';
5
+ import * as i2 from '@c8y/ngx-components';
6
+ import { WidgetTimeContextDateRangeService, gettext, CommonModule, CoreModule, FormsModule, AGGREGATION_ICONS, AGGREGATION_TEXTS } from '@c8y/ngx-components';
7
+ import * as i2$1 from '@ngx-translate/core';
8
+ import { TranslateService } from '@ngx-translate/core';
9
+ import { takeUntil } from 'rxjs/operators';
10
+ import { Subject } from 'rxjs';
11
+ import * as i7 from '@c8y/ngx-components/datapoint-selector';
12
+ import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
13
+ import { omit, cloneDeep } from 'lodash-es';
14
+ import * as i1 from '@c8y/ngx-components/context-dashboard';
15
+ import * as i8 from '@c8y/ngx-components/alarm-event-selector';
16
+ import { AlarmEventSelectorModule } from '@c8y/ngx-components/alarm-event-selector';
17
+ import * as i5$1 from 'ngx-bootstrap/tooltip';
18
+ import { TooltipModule } from 'ngx-bootstrap/tooltip';
19
+ import * as i6 from 'ngx-bootstrap/popover';
20
+ import { PopoverModule } from 'ngx-bootstrap/popover';
21
+ import { DATE_SELECTION_EXTENDED, ChartEventsService, ChartAlarmsService, ChartsComponent } from '@c8y/ngx-components/echart';
22
+ import { TimeContextComponent } from '@c8y/ngx-components/time-context';
23
+ import * as i5 from '@angular/common';
24
+ import { CommonModule as CommonModule$1 } from '@angular/common';
25
+ import { ALARM_STATUS_LABELS } from '@c8y/client';
26
+ import { A11yModule } from '@angular/cdk/a11y';
27
+ import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
28
+ import * as i8$1 from '@c8y/ngx-components/alarms';
29
+ import { AlarmsModule } from '@c8y/ngx-components/alarms';
30
+
31
+ class DatapointsGraphWidgetConfigComponent {
32
+ constructor(widgetConfig, dashboardContextComponent) {
33
+ this.widgetConfig = widgetConfig;
34
+ this.dashboardContextComponent = dashboardContextComponent;
35
+ this.formBuilder = inject(FormBuilder);
36
+ this.form = inject(NgForm);
37
+ this.translate = inject(TranslateService);
38
+ this.widgetTimeContextDateRangeService = inject(WidgetTimeContextDateRangeService);
39
+ this.DATE_SELECTION = DATE_SELECTION_EXTENDED;
40
+ this.dateSelectionHelp = this.translate.instant(gettext(`Choose how to select a date range, the available options are:
41
+ <ul class="m-l-0 p-l-8 m-t-8 m-b-0">
42
+ <li>
43
+ <b>Widget configuration:</b>
44
+ restricts the date selection only to the widget configuration
45
+ </li>
46
+ <li>
47
+ <b>Widget and widget configuration:</b>
48
+ restricts the date selection to the widget view and widget configuration only
49
+ </li>
50
+ <li>
51
+ <b>Dashboard time range:</b>
52
+ restricts date selection to the global dashboard configuration only
53
+ </li>
54
+ </ul>`));
55
+ this.datapointSelectDefaultFormOptions = {
56
+ showRange: true,
57
+ showChart: true
58
+ };
59
+ this.datapointSelectionConfig = {};
60
+ this.activeDatapointsExists = false;
61
+ this.alarmsOrEventsHaveNoMatchingDps = false;
62
+ this.destroy$ = new Subject();
63
+ this.formGroup = this.initForm();
64
+ }
65
+ ngOnInit() {
66
+ this.config?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));
67
+ this.form.form.addControl('config', this.formGroup);
68
+ this.formGroup.patchValue(this.config || {});
69
+ this.formGroup.controls.alarms.setValue(this.config?.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'ALARM'));
70
+ this.formGroup.controls.events.setValue(this.config?.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'EVENT'));
71
+ this.initDateSelection();
72
+ this.setActiveDatapointsExists();
73
+ this.checkForMatchingDatapoints();
74
+ this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
75
+ this.config = {
76
+ ...value,
77
+ alarmsEventsConfigs: [
78
+ ...(this.formGroup.value.alarms || []),
79
+ ...(this.formGroup.value.events || [])
80
+ ]
81
+ };
82
+ this.setActiveDatapointsExists();
83
+ this.checkForMatchingDatapoints();
84
+ });
85
+ if (this.config?.widgetInstanceGlobalTimeContext) {
86
+ this.updateDashboardTimeContext(this.widgetTimeContextDateRangeService.initialTimeRange());
87
+ }
88
+ if (this.config.dateFrom && this.config.dateTo) {
89
+ this.timeProps = {
90
+ dateFrom: new Date(this.config?.dateFrom),
91
+ dateTo: new Date(this.config?.dateTo),
92
+ interval: this.config?.interval,
93
+ realtime: this.config?.realtime,
94
+ aggregation: this.config?.realtime ? null : this.config?.aggregation
95
+ };
96
+ }
97
+ }
98
+ ngOnDestroy() {
99
+ this.destroy$.next();
100
+ this.destroy$.complete();
101
+ }
102
+ onBeforeSave(config) {
103
+ if (this.formGroup.valid && config) {
104
+ Object.assign(config, omit(this.formGroup.value, ['alarms', 'events']), {
105
+ alarmsEventsConfigs: [
106
+ ...(this.formGroup.value.alarms || []),
107
+ ...(this.formGroup.value.events || [])
108
+ ]
109
+ });
110
+ return true;
111
+ }
112
+ return false;
113
+ }
114
+ timePropsChanged(timeProps) {
115
+ if (timeProps.realtime !== this.config.realtime) {
116
+ this.formGroup.patchValue({ realtime: timeProps.realtime });
117
+ }
118
+ if (timeProps.realtime) {
119
+ if (timeProps.currentDateContextInterval !== this.formGroup.value.interval) {
120
+ this.formGroup.patchValue({ interval: timeProps.currentDateContextInterval });
121
+ }
122
+ return;
123
+ }
124
+ const patchValues = {
125
+ dateFrom: new Date(timeProps.currentDateContextFromDate),
126
+ dateTo: new Date(timeProps.currentDateContextToDate),
127
+ interval: timeProps.currentDateContextInterval,
128
+ ...(timeProps.aggregation && { aggregation: timeProps.aggregation }),
129
+ ...(timeProps.realtime && { realtime: timeProps.realtime })
130
+ };
131
+ this.formGroup.patchValue(patchValues);
132
+ }
133
+ updateDashboardTimeContext(timeProps) {
134
+ const initialTimeRange = {
135
+ dateFrom: timeProps.dateFrom,
136
+ dateTo: timeProps.dateTo,
137
+ interval: timeProps.interval || 'custom'
138
+ };
139
+ if (!this.widgetTimeContextDateRangeService.initialTimeRange()) {
140
+ this.widgetTimeContextDateRangeService.updateInitialTimeRange(initialTimeRange);
141
+ }
142
+ this.formGroup.patchValue({ ...timeProps, ...initialTimeRange });
143
+ }
144
+ updateTimeRangeOnRealtime(timeRange) {
145
+ this.formGroup.patchValue(timeRange, { emitEvent: false });
146
+ }
147
+ dateSelectionChange(dateSelection) {
148
+ this.dateSelection = dateSelection;
149
+ if (dateSelection === DATE_SELECTION_EXTENDED.CONFIG) {
150
+ this.formGroup.controls.displayDateSelection.enable();
151
+ this.formGroup.patchValue({ widgetInstanceGlobalTimeContext: false });
152
+ return;
153
+ }
154
+ // displayDateSelection should be false and disabled when dateSelection is not CONFIG
155
+ this.formGroup.controls.displayDateSelection.disable();
156
+ this.formGroup.patchValue({
157
+ widgetInstanceGlobalTimeContext: true,
158
+ realtime: false,
159
+ displayDateSelection: false
160
+ });
161
+ }
162
+ assignContextFromContextDashboard(datapoint) {
163
+ if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {
164
+ return;
165
+ }
166
+ const context = this.widgetConfig?.context;
167
+ if (context?.id) {
168
+ const { name, id } = context;
169
+ datapoint.__target = { name, id };
170
+ this.datapointSelectionConfig.contextAsset = { id };
171
+ }
172
+ }
173
+ checkForMatchingDatapoints() {
174
+ const allMatch = this.config?.alarmsEventsConfigs?.every(ae => this.formGroup.value.datapoints?.some(dp => dp.__target?.id === ae.__target?.id));
175
+ queueMicrotask(() => {
176
+ if (allMatch) {
177
+ this.alarmsOrEventsHaveNoMatchingDps = false;
178
+ }
179
+ else {
180
+ this.alarmsOrEventsHaveNoMatchingDps = true;
181
+ }
182
+ });
183
+ }
184
+ initForm() {
185
+ const form = this.formBuilder.group({
186
+ datapoints: [
187
+ [],
188
+ [Validators.required, Validators.minLength(1)]
189
+ ],
190
+ alarms: [[]],
191
+ events: [[]],
192
+ displayMarkedLine: [true, []],
193
+ displayMarkedPoint: [true, []],
194
+ mergeMatchingDatapoints: [true, []],
195
+ showLabelAndUnit: [true, []],
196
+ displayDateSelection: [false, []],
197
+ displayAggregationSelection: [false, []],
198
+ widgetInstanceGlobalTimeContext: [false, []],
199
+ canDecoupleGlobalTimeContext: [false, []],
200
+ dateFrom: [null, []],
201
+ dateTo: [null, []],
202
+ interval: ['days', [Validators.required]],
203
+ aggregation: [null, []],
204
+ realtime: [false, [Validators.required]],
205
+ showSlider: [true, [Validators.required]],
206
+ yAxisSplitLines: [false, [Validators.required]],
207
+ xAxisSplitLines: [false, [Validators.required]]
208
+ });
209
+ return form;
210
+ }
211
+ initDateSelection() {
212
+ if (!this.config?.widgetInstanceGlobalTimeContext) {
213
+ this.dateSelection = DATE_SELECTION_EXTENDED.CONFIG;
214
+ return;
215
+ }
216
+ this.dateSelection = DATE_SELECTION_EXTENDED.DASHBOARD_CONTEXT;
217
+ this.formGroup.controls.displayDateSelection.disable();
218
+ }
219
+ setActiveDatapointsExists() {
220
+ this.activeDatapointsExists =
221
+ (this.config?.datapoints?.filter(dp => dp.__active)?.length || 0) > 0;
222
+ }
223
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, deps: [{ token: i1.WidgetConfigComponent, optional: true }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
224
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching datapoints into single axis.</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & Events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5$1.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, decorators: [{
227
+ type: Component,
228
+ args: [{ selector: 'c8y-datapoints-graph-widget-config', host: { class: 'd-contents' }, standalone: true, imports: [
229
+ CommonModule,
230
+ CoreModule,
231
+ FormsModule,
232
+ TooltipModule,
233
+ PopoverModule,
234
+ ChartsComponent,
235
+ DatapointSelectorModule,
236
+ AlarmEventSelectorModule,
237
+ TimeContextComponent
238
+ ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching datapoints into single axis.</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & Events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
239
+ }], ctorParameters: () => [{ type: i1.WidgetConfigComponent, decorators: [{
240
+ type: Optional
241
+ }] }, { type: i1.ContextDashboardComponent, decorators: [{
242
+ type: Optional
243
+ }] }], propDecorators: { config: [{
244
+ type: Input
245
+ }] } });
246
+
247
+ class DatapointsGraphWidgetViewComponent {
248
+ set config(value) {
249
+ this.displayConfig = cloneDeep(value);
250
+ }
251
+ get config() {
252
+ throw Error('"config" property should not be referenced in view component to avoid mutating data.');
253
+ }
254
+ constructor(formBuilder, translate, widgetTimeContextDateRangeService, dashboardContextComponent) {
255
+ this.formBuilder = formBuilder;
256
+ this.translate = translate;
257
+ this.widgetTimeContextDateRangeService = widgetTimeContextDateRangeService;
258
+ this.dashboardContextComponent = dashboardContextComponent;
259
+ this.events = [];
260
+ this.alarms = [];
261
+ this.AGGREGATION_ICONS = AGGREGATION_ICONS;
262
+ this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
263
+ this.datapointsOutOfSync = new Map();
264
+ this.hasAtLeastOneDatapointActive = true;
265
+ this.hasAtLeastOneAlarmActive = true;
266
+ this.isMarkedAreaEnabled = false;
267
+ this.legendHelp = this.translate.instant(gettext(`<ul class="m-l-0 p-l-8 m-t-8 m-b-0">
268
+ <li>
269
+ <b>Visibility:</b>
270
+ use visibility icon to toggle datapoint, alarm or event visibility on chart. At least one datapoint is required to display chart.
271
+ </li>
272
+ <li>
273
+ <b>Alarm details</b>
274
+ Click alarm legend item to highlight area between alarm raised timestamp and alarm cleared timestamp.
275
+ You can also click alarm markline on chart to highlight alarm and to pause tooltip. Click on highlighted area or legend item to cancel highlighting.
276
+ </li>
277
+ </ul>`));
278
+ this.disableZoomInLabel = gettext('Disable zoom in');
279
+ this.enableZoomInLabel = gettext('Click to enable zoom, then click and drag on the desired area in the chart.');
280
+ this.hideDatapointLabel = gettext('Hide data point');
281
+ this.showDatapointLabel = gettext('Show data point');
282
+ this.destroy$ = new Subject();
283
+ this.timeControlsFormGroup = this.initForm();
284
+ this.timeControlsFormGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
285
+ this.displayConfig = { ...this.displayConfig, ...value };
286
+ });
287
+ }
288
+ ngOnInit() {
289
+ this.displayConfig?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));
290
+ if (this.displayConfig.dateFrom && this.displayConfig.dateTo) {
291
+ this.timeProps = {
292
+ dateFrom: new Date(this.displayConfig?.dateFrom),
293
+ dateTo: new Date(this.displayConfig?.dateTo),
294
+ interval: this.displayConfig?.interval,
295
+ realtime: this.displayConfig?.realtime,
296
+ aggregation: this.displayConfig?.realtime ? null : this.displayConfig?.aggregation
297
+ };
298
+ }
299
+ }
300
+ ngOnDestroy() {
301
+ this.destroy$.next();
302
+ this.destroy$.complete();
303
+ }
304
+ ngOnChanges(changes) {
305
+ this.timeControlsFormGroup.patchValue(this.displayConfig || {});
306
+ const config = changes['config']?.currentValue;
307
+ if (config?.date && config?.widgetInstanceGlobalTimeContext && this.displayConfig?.date) {
308
+ if (!this.displayConfig.sliderChange) {
309
+ this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);
310
+ }
311
+ this.timePropsChanged({
312
+ currentDateContextFromDate: this.displayConfig?.date[0].toISOString(),
313
+ currentDateContextToDate: this.displayConfig?.date[1].toISOString(),
314
+ currentDateContextInterval: this.displayConfig?.interval,
315
+ realtime: this.displayConfig?.realtime,
316
+ aggregation: this.displayConfig?.aggregation
317
+ });
318
+ }
319
+ }
320
+ timePropsChanged(timeProps) {
321
+ const patchValues = {
322
+ dateFrom: new Date(timeProps.currentDateContextFromDate),
323
+ dateTo: new Date(timeProps.currentDateContextToDate),
324
+ interval: timeProps.currentDateContextInterval,
325
+ ...(timeProps.aggregation && { aggregation: timeProps.aggregation }),
326
+ ...(timeProps.realtime && { realtime: timeProps.realtime })
327
+ };
328
+ this.timeControlsFormGroup.patchValue(patchValues);
329
+ }
330
+ updateDashboardTimeContext(timeProps) {
331
+ if (this.displayConfig?.widgetInstanceGlobalTimeContext) {
332
+ this.widgetTimeContextDateRangeService.emitPropertyUpdate(timeProps);
333
+ }
334
+ this.timeControlsFormGroup.patchValue(timeProps);
335
+ this.timeProps = { ...timeProps, realtime: false };
336
+ }
337
+ updateTimeRangeOnRealtime(timeRange) {
338
+ this.timeControlsFormGroup.patchValue(timeRange, { emitEvent: false });
339
+ }
340
+ toggleChart(datapoint) {
341
+ if (this.displayConfig?.datapoints?.filter(dp => dp.__active).length === 1 &&
342
+ datapoint.__active) {
343
+ // at least 1 datapoint should be active
344
+ this.hasAtLeastOneDatapointActive = false;
345
+ return;
346
+ }
347
+ datapoint.__active = !datapoint.__active;
348
+ this.hasAtLeastOneDatapointActive = true;
349
+ this.displayConfig = { ...this.displayConfig };
350
+ }
351
+ handleDatapointOutOfSync(dpOutOfSync) {
352
+ const key = (dp) => dp.__target?.id + dp.fragment + dp.series;
353
+ const dpMatch = this.displayConfig?.datapoints?.find(dp => key(dp) === key(dpOutOfSync));
354
+ if (!dpMatch) {
355
+ return;
356
+ }
357
+ this.datapointsOutOfSync.set(dpMatch, true);
358
+ }
359
+ toggleMarkedArea(alarm) {
360
+ this.enabledMarkedAreaAlarmType = alarm.filters.type;
361
+ const params = {
362
+ data: {
363
+ itemType: alarm.filters.type
364
+ }
365
+ };
366
+ this.chartComponent.onChartClick(params);
367
+ }
368
+ toggleAlarmEventType(alarmOrEvent) {
369
+ if (alarmOrEvent.timelineType === 'ALARM') {
370
+ this.alarms = this.alarms.map(alarm => {
371
+ if (alarm.filters.type === alarmOrEvent.filters.type) {
372
+ alarm.__hidden = !alarm.__hidden;
373
+ }
374
+ return alarm;
375
+ });
376
+ }
377
+ else {
378
+ this.events = this.events.map(event => {
379
+ if (event.filters.type === alarmOrEvent.filters.type) {
380
+ event.__hidden = !event.__hidden;
381
+ }
382
+ return event;
383
+ });
384
+ }
385
+ this.displayConfig = { ...this.displayConfig };
386
+ }
387
+ updateAlarmsAndEvents(alarmsEventsConfigs) {
388
+ this.alarms = alarmsEventsConfigs.filter(alarm => alarm.timelineType === 'ALARM');
389
+ this.events = alarmsEventsConfigs.filter(event => event.timelineType === 'EVENT');
390
+ if (this.alarms.length === 0 || !this.alarms.find(alarm => alarm.__active)) {
391
+ this.hasAtLeastOneAlarmActive = false;
392
+ }
393
+ }
394
+ filterSeverity(eventTarget) {
395
+ this.alarms = this.alarms.map(alarm => {
396
+ if (!alarm.__severity) {
397
+ alarm.__severity = [];
398
+ }
399
+ alarm.__severity = Object.keys(eventTarget.severityOptions).filter((severity) => eventTarget.severityOptions[severity]);
400
+ if (!alarm.__status) {
401
+ alarm.__status = [];
402
+ }
403
+ const statuses = Object.keys(ALARM_STATUS_LABELS);
404
+ const filteredStatuses = eventTarget.showCleared
405
+ ? statuses
406
+ : statuses.filter(status => status !== 'CLEARED');
407
+ alarm.__status = filteredStatuses;
408
+ return alarm;
409
+ });
410
+ this.displayConfig = { ...this.displayConfig };
411
+ }
412
+ assignContextFromContextDashboard(datapoint) {
413
+ if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {
414
+ return;
415
+ }
416
+ const context = this.dashboardContextComponent?.context;
417
+ if (context?.id) {
418
+ const { name, id } = context;
419
+ datapoint.__target = { name, id };
420
+ }
421
+ }
422
+ initForm() {
423
+ const form = this.formBuilder.group({
424
+ dateFrom: [undefined, [Validators.required]],
425
+ dateTo: [undefined, [Validators.required]],
426
+ interval: [
427
+ this.displayConfig?.interval || 'hours',
428
+ [Validators.required]
429
+ ],
430
+ aggregation: [null, []],
431
+ realtime: [false, [Validators.required]],
432
+ widgetInstanceGlobalTimeContext: [false, []]
433
+ });
434
+ form.patchValue(this.displayConfig || {});
435
+ return form;
436
+ }
437
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetViewComponent, deps: [{ token: i4.FormBuilder }, { token: i2$1.TranslateService }, { token: i2.WidgetTimeContextDateRangeService }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
438
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsGraphWidgetViewComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-view", inputs: { config: "config" }, providers: [ChartEventsService, ChartAlarmsService], viewQueries: [{ propertyName: "chartComponent", first: true, predicate: ChartsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"p-l-16 p-r-16\">\n <div class=\"d-flex gap-16 a-i-start\">\n <div\n class=\"btn-group btn-group-sm flex-no-shrink\"\n *ngIf=\"!displayConfig?.widgetInstanceGlobalTimeContext\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (displayConfig?.aggregation\n ? AGGREGATION_TEXTS[displayConfig.aggregation]\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n displayConfig?.aggregation\n ? AGGREGATION_ICONS[displayConfig.aggregation]\n : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n\n <c8y-time-context\n class=\"d-contents\"\n (contextChange)=\"timePropsChanged($event)\"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: displayConfig?.displayDateSelection,\n interval: displayConfig?.displayDateSelection,\n aggregation: displayConfig?.displayAggregationSelection\n }\"\n ></c8y-time-context>\n </div>\n <c8y-alarms-filter\n class=\"d-contents form-group-sm\"\n *ngIf=\"hasAtLeastOneAlarmActive\"\n (filterApplied)=\"filterSeverity($event)\"\n ></c8y-alarms-filter>\n\n <div class=\"m-l-auto btn-group btn-group-sm flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Save as image' | translate\"\n tooltip=\"{{ 'Save as image' | translate }}\"\n container=\"body\"\n type=\"button\"\n (click)=\"chart.saveAsImage()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"image-file-checked\"\n ></i>\n </button>\n </div>\n </div>\n <div\n class=\"d-flex\"\n style=\"align-items: center\"\n >\n <button\n class=\"btn-help btn-help--sm m-r-8\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"legendHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n <div class=\"inner-scroll\">\n <div class=\"flex-grow p-t-8 d-flex a-i-start gap-8 p-b-4\">\n <div\n class=\"c8y-datapoint-pill flex-no-shrink\"\n title=\"{{ datapoint.label }} - {{ datapoint.__target.name }}\"\n *ngFor=\"let datapoint of displayConfig.datapoints\"\n [ngClass]=\"{ active: datapoint.__active }\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 active data points must be active.' | translate\"\n container=\"body\"\n *ngIf=\"!hasAtLeastOneDatapointActive && datapoint.__active\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-datapoint-pill__btn\"\n title=\"{{\n (datapoint.__active ? hideDatapointLabel : showDatapointLabel) | translate\n }} \"\n type=\"button\"\n (click)=\"toggleChart(datapoint)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"datapoint.__active ? 'eye text-primary' : 'eye-slash text-muted'\"\n ></i>\n </button>\n <div class=\"c8y-datapoint-pill__label c8y-datapoint-pill__btn\">\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [ngStyle]=\"{\n color: datapoint.color\n }\"\n ></i>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': !datapoint.__active }\"\n >\n <span class=\"text-truncate\">\n {{ datapoint.label }}\n </span>\n <small class=\"text-muted text-10\">\n {{ datapoint.__target.name }}\n </small>\n </span>\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Measurements received for this data point may be out of sync.' | translate\n \"\n container=\"body\"\n *ngIf=\"datapointsOutOfSync.get(datapoint)\"\n [adaptivePosition]=\"false\"\n ></i>\n </div>\n </div>\n <!-- Alarms -->\n\n <ng-container *ngFor=\"let alarm of alarms\">\n <div\n class=\"c8y-alarm-pill flex-no-shrink\"\n title=\"{{ alarm.filters.type }} \"\n *ngIf=\"alarm.__active\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Alarm of this type is currently active and outside of the selected time range'\n | translate\n \"\n container=\"body\"\n *ngIf=\"displayConfig?.activeAlarmTypesOutOfRange?.includes(alarm.filters.type)\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-alarm-pill__btn\"\n title=\"{{ alarm.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(alarm)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"alarm.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <button\n class=\"c8y-alarm-pill__label c8y-alarm-pill__btn\"\n (click)=\"toggleMarkedArea(alarm)\"\n [ngClass]=\"{\n active: !isMarkedAreaEnabled && alarm.filters.type === enabledMarkedAreaAlarmType\n }\"\n >\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [style.background-color]=\"alarm.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': alarm.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ alarm.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ alarm.__target.name }}\n </small>\n </span>\n </button>\n </div>\n </ng-container>\n\n <!-- Events -->\n <ng-container *ngFor=\"let event of events\">\n <div\n class=\"c8y-event-pill flex-no-shrink\"\n title=\"{{ event.filters.type }}\"\n *ngIf=\"event.__active\"\n >\n <button\n class=\"c8y-event-pill__btn\"\n title=\"{{ event.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(event)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"event.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <div class=\"c8y-event-pill__label c8y-event-pill__btn\">\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [ngStyle]=\"{ 'background-color': event.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"c8y-events\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': event.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ event.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ event.__target.name }}\n </small>\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<c8y-charts\n #chart\n [config]=\"displayConfig\"\n [alerts]=\"alerts\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n></c8y-charts>\n\n<ng-template #legendHelpTemplate>\n <div [innerHTML]=\"legendHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "ngmodule", type: CommonModule$1 }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5$1.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: AlarmsModule }, { kind: "component", type: i8$1.AlarmsFilterComponent, selector: "c8y-alarms-filter", inputs: ["contextSourceId"], outputs: ["onFilterApplied"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
439
+ }
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsGraphWidgetViewComponent, decorators: [{
441
+ type: Component,
442
+ args: [{ selector: 'c8y-datapoints-graph-widget-view', standalone: true, imports: [
443
+ A11yModule,
444
+ CommonModule$1,
445
+ ChartsComponent,
446
+ CoreModule,
447
+ TooltipModule,
448
+ BsDropdownModule,
449
+ PopoverModule,
450
+ AlarmsModule,
451
+ TimeContextComponent
452
+ ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"p-l-16 p-r-16\">\n <div class=\"d-flex gap-16 a-i-start\">\n <div\n class=\"btn-group btn-group-sm flex-no-shrink\"\n *ngIf=\"!displayConfig?.widgetInstanceGlobalTimeContext\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (displayConfig?.aggregation\n ? AGGREGATION_TEXTS[displayConfig.aggregation]\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n displayConfig?.aggregation\n ? AGGREGATION_ICONS[displayConfig.aggregation]\n : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n\n <c8y-time-context\n class=\"d-contents\"\n (contextChange)=\"timePropsChanged($event)\"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: displayConfig?.displayDateSelection,\n interval: displayConfig?.displayDateSelection,\n aggregation: displayConfig?.displayAggregationSelection\n }\"\n ></c8y-time-context>\n </div>\n <c8y-alarms-filter\n class=\"d-contents form-group-sm\"\n *ngIf=\"hasAtLeastOneAlarmActive\"\n (filterApplied)=\"filterSeverity($event)\"\n ></c8y-alarms-filter>\n\n <div class=\"m-l-auto btn-group btn-group-sm flex-no-shrink\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Save as image' | translate\"\n tooltip=\"{{ 'Save as image' | translate }}\"\n container=\"body\"\n type=\"button\"\n (click)=\"chart.saveAsImage()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"image-file-checked\"\n ></i>\n </button>\n </div>\n </div>\n <div\n class=\"d-flex\"\n style=\"align-items: center\"\n >\n <button\n class=\"btn-help btn-help--sm m-r-8\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"legendHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n <div class=\"inner-scroll\">\n <div class=\"flex-grow p-t-8 d-flex a-i-start gap-8 p-b-4\">\n <div\n class=\"c8y-datapoint-pill flex-no-shrink\"\n title=\"{{ datapoint.label }} - {{ datapoint.__target.name }}\"\n *ngFor=\"let datapoint of displayConfig.datapoints\"\n [ngClass]=\"{ active: datapoint.__active }\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 active data points must be active.' | translate\"\n container=\"body\"\n *ngIf=\"!hasAtLeastOneDatapointActive && datapoint.__active\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-datapoint-pill__btn\"\n title=\"{{\n (datapoint.__active ? hideDatapointLabel : showDatapointLabel) | translate\n }} \"\n type=\"button\"\n (click)=\"toggleChart(datapoint)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"datapoint.__active ? 'eye text-primary' : 'eye-slash text-muted'\"\n ></i>\n </button>\n <div class=\"c8y-datapoint-pill__label c8y-datapoint-pill__btn\">\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [ngStyle]=\"{\n color: datapoint.color\n }\"\n ></i>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': !datapoint.__active }\"\n >\n <span class=\"text-truncate\">\n {{ datapoint.label }}\n </span>\n <small class=\"text-muted text-10\">\n {{ datapoint.__target.name }}\n </small>\n </span>\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Measurements received for this data point may be out of sync.' | translate\n \"\n container=\"body\"\n *ngIf=\"datapointsOutOfSync.get(datapoint)\"\n [adaptivePosition]=\"false\"\n ></i>\n </div>\n </div>\n <!-- Alarms -->\n\n <ng-container *ngFor=\"let alarm of alarms\">\n <div\n class=\"c8y-alarm-pill flex-no-shrink\"\n title=\"{{ alarm.filters.type }} \"\n *ngIf=\"alarm.__active\"\n >\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Alarm of this type is currently active and outside of the selected time range'\n | translate\n \"\n container=\"body\"\n *ngIf=\"displayConfig?.activeAlarmTypesOutOfRange?.includes(alarm.filters.type)\"\n [adaptivePosition]=\"false\"\n ></i>\n <button\n class=\"c8y-alarm-pill__btn\"\n title=\"{{ alarm.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(alarm)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"alarm.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <button\n class=\"c8y-alarm-pill__label c8y-alarm-pill__btn\"\n (click)=\"toggleMarkedArea(alarm)\"\n [ngClass]=\"{\n active: !isMarkedAreaEnabled && alarm.filters.type === enabledMarkedAreaAlarmType\n }\"\n >\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [style.background-color]=\"alarm.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': alarm.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ alarm.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ alarm.__target.name }}\n </small>\n </span>\n </button>\n </div>\n </ng-container>\n\n <!-- Events -->\n <ng-container *ngFor=\"let event of events\">\n <div\n class=\"c8y-event-pill flex-no-shrink\"\n title=\"{{ event.filters.type }}\"\n *ngIf=\"event.__active\"\n >\n <button\n class=\"c8y-event-pill__btn\"\n title=\"{{ event.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(event)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"event.__hidden ? 'eye-slash text-muted' : 'eye text-primary'\"\n ></i>\n </button>\n <div class=\"c8y-event-pill__label c8y-event-pill__btn\">\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [ngStyle]=\"{ 'background-color': event.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"c8y-events\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': event.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ event.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ event.__target.name }}\n </small>\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<c8y-charts\n #chart\n [config]=\"displayConfig\"\n [alerts]=\"alerts\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n></c8y-charts>\n\n<ng-template #legendHelpTemplate>\n <div [innerHTML]=\"legendHelp\"></div>\n</ng-template>\n" }]
453
+ }], ctorParameters: () => [{ type: i4.FormBuilder }, { type: i2$1.TranslateService }, { type: i2.WidgetTimeContextDateRangeService }, { type: i1.ContextDashboardComponent, decorators: [{
454
+ type: Optional
455
+ }] }], propDecorators: { config: [{
456
+ type: Input
457
+ }], chartComponent: [{
458
+ type: ViewChild,
459
+ args: [ChartsComponent]
460
+ }] } });
461
+
462
+ /**
463
+ * Generated bundle index. Do not edit.
464
+ */
465
+
466
+ export { DatapointsGraphWidgetConfigComponent, DatapointsGraphWidgetViewComponent };
467
+ //# sourceMappingURL=c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map