@c8y/ngx-components 1024.20.8 → 1024.21.5

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 (142) hide show
  1. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +527 -12
  2. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs +82 -19
  4. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +31 -9
  6. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-ai.mjs +503 -62
  8. package/fesm2022/c8y-ngx-components-ai.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +2 -2
  10. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-alarms.mjs +3 -3
  12. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-application-access-list.mjs +1 -1
  14. package/fesm2022/c8y-ngx-components-application-access-list.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +1 -1
  16. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-bookmarks.mjs +1 -1
  18. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +1 -1
  20. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-cockpit-config.mjs +5 -5
  22. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  23. package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs} +31 -17
  24. package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs.map +1 -0
  25. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-BqbzREl7.mjs} +2 -2
  26. package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-BqbzREl7.mjs.map} +1 -1
  27. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-d3JeKEr4.mjs +108 -0
  28. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-d3JeKEr4.mjs.map +1 -0
  29. package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
  30. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-Jyjkv4JT.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-CP1afwVe.mjs} +2 -2
  31. package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-Jyjkv4JT.mjs.map → c8y-ngx-components-context-dashboard-dashboard-version-history.component-CP1afwVe.mjs.map} +1 -1
  32. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +3 -3
  33. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  34. package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-UEUYsXBv.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CRvgIgri.mjs} +2 -2
  35. package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-UEUYsXBv.mjs.map → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CRvgIgri.mjs.map} +1 -1
  36. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +2 -2
  37. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +1 -1
  38. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -3
  40. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  41. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +2 -2
  42. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  43. package/fesm2022/c8y-ngx-components-device-profile.mjs +2 -2
  44. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  45. package/fesm2022/c8y-ngx-components-diagnostics.mjs +1 -1
  46. package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
  47. package/fesm2022/c8y-ngx-components-echart.mjs +101 -45
  48. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +2 -2
  50. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +1 -1
  52. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-ecosystem.mjs +4 -4
  54. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +1 -1
  56. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-events.mjs +2 -2
  58. package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-icon-selector.mjs +1 -1
  60. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +1 -1
  62. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
  63. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
  64. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  65. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +1 -1
  66. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
  67. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +1 -1
  68. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
  69. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +2 -2
  70. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  71. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +2 -2
  72. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  73. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +2 -2
  74. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  75. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +5 -5
  76. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  77. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +1 -1
  78. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  79. package/fesm2022/c8y-ngx-components-register-device.mjs +3 -3
  80. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  81. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
  82. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
  83. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +1 -1
  84. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
  85. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
  86. package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
  87. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
  88. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  89. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +4 -4
  90. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  91. package/fesm2022/c8y-ngx-components-repository-shared.mjs +2 -2
  92. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  93. package/fesm2022/c8y-ngx-components-repository-software.mjs +3 -3
  94. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
  96. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-tracking.mjs +1 -1
  98. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +1 -1
  100. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  101. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +1 -1
  102. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  103. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +2 -2
  104. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs.map +1 -1
  105. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1 -1
  106. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +1 -1
  108. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +1 -1
  110. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +94 -10
  112. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
  113. package/fesm2022/c8y-ngx-components.mjs +306 -22
  114. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  115. package/locales/de.po +72 -3
  116. package/locales/es.po +72 -3
  117. package/locales/fr.po +72 -3
  118. package/locales/ja_JP.po +72 -3
  119. package/locales/ko.po +72 -3
  120. package/locales/locales.pot +81 -3
  121. package/locales/nl.po +72 -3
  122. package/locales/pl.po +73 -4
  123. package/locales/pt_BR.po +72 -3
  124. package/locales/zh_CN.po +72 -3
  125. package/locales/zh_TW.po +72 -3
  126. package/package.json +1 -1
  127. package/types/c8y-ngx-components-ai-agent-chat.d.ts +201 -3
  128. package/types/c8y-ngx-components-ai-agent-chat.d.ts.map +1 -1
  129. package/types/c8y-ngx-components-ai-agents-scada.d.ts.map +1 -1
  130. package/types/c8y-ngx-components-ai-ai-chat.d.ts +14 -4
  131. package/types/c8y-ngx-components-ai-ai-chat.d.ts.map +1 -1
  132. package/types/c8y-ngx-components-ai.d.ts +157 -2
  133. package/types/c8y-ngx-components-ai.d.ts.map +1 -1
  134. package/types/c8y-ngx-components-echart.d.ts +6 -0
  135. package/types/c8y-ngx-components-echart.d.ts.map +1 -1
  136. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts +28 -2
  137. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts.map +1 -1
  138. package/types/c8y-ngx-components.d.ts +170 -9
  139. package/types/c8y-ngx-components.d.ts.map +1 -1
  140. package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs.map +0 -1
  141. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DOmwNU6m.mjs +0 -86
  142. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DOmwNU6m.mjs.map +0 -1
@@ -4,7 +4,7 @@ import { inject, Injector, Injectable } from '@angular/core';
4
4
  import { TranslateService } from '@ngx-translate/core';
5
5
  import { MeasurementService, InventoryService, AlarmService, EventService, OperationService } from '@c8y/client';
6
6
  import { MeasurementRealtimeService, DatePipe, translateDatapointUnit, ManagedObjectRealtimeService, AlarmRealtimeService, EventRealtimeService, OperationRealtimeService } from '@c8y/ngx-components';
7
- import { from, map, filter, startWith, take, switchMap, distinctUntilChanged, pairwise, share, NEVER, scan, tap, of, catchError, combineLatest, merge } from 'rxjs';
7
+ import { from, map, filter, startWith, take, defaultIfEmpty, switchMap, distinctUntilChanged, pairwise, share, NEVER, scan, tap, of, catchError, combineLatest, merge } from 'rxjs';
8
8
  import { gettext } from '@c8y/ngx-components/gettext';
9
9
  import { get } from 'lodash-es';
10
10
 
@@ -37,19 +37,28 @@ class LastMeasurementStrategy {
37
37
  return from(this.measurementService.list(measurementFilter)).pipe(map(({ data }) => data[0]), filter(measurement => !!measurement), map(measurement => this.formatMeasurement(measurement)));
38
38
  }
39
39
  createRealtimeStream(initialValue) {
40
- return this.measurementRealtime
40
+ const measurementUpdates$ = this.measurementRealtime
41
41
  .onCreateOfSpecificMeasurement$(this.datapoint.fragment, this.datapoint.series, this.datapoint.__target)
42
- .pipe(map(measurement => this.formatMeasurement(measurement)), startWith(initialValue));
42
+ .pipe(map(measurement => this.formatMeasurement(measurement)));
43
+ // Without a measurement yet, consumers keep their own empty state until the first one arrives.
44
+ const hasInitialValue = initialValue != null;
45
+ return hasInitialValue
46
+ ? measurementUpdates$.pipe(startWith(initialValue))
47
+ : measurementUpdates$;
43
48
  }
44
49
  formatMeasurement(measurement) {
45
50
  const resultType = this.config?.resultType;
46
51
  const fragment = this.datapoint.fragment;
47
52
  const series = this.datapoint.series;
53
+ const seriesValue = measurement[fragment][series];
54
+ const keepRawValue = !!this.config?.rawValue;
48
55
  const decimalPlaces = this.config?.numberOfDecimalPlaces ?? DEFAULT_DECIMAL_PLACES;
49
- const value = this.formatValue(measurement[fragment][series].value, decimalPlaces);
56
+ const value = keepRawValue
57
+ ? seriesValue.value
58
+ : this.formatValue(seriesValue.value, decimalPlaces);
50
59
  // The data point carries the unit configured for it in the library, which is the one a tenant
51
60
  // registers a translation for. The measurement only reports whatever the device sent.
52
- const unit = translateDatapointUnit(this.datapoint.unit || measurement[fragment][series].unit, this.translate);
61
+ const unit = translateDatapointUnit(this.datapoint.unit || seriesValue.unit, this.translate);
53
62
  if (resultType === RESULT_TYPES$1.VALUE.value) {
54
63
  return value;
55
64
  }
@@ -61,7 +70,9 @@ class LastMeasurementStrategy {
61
70
  return `${date} | ${value} ${unit}`;
62
71
  }
63
72
  else if (resultType === RESULT_TYPES$1.OBJECT.value) {
64
- return { ...measurement[fragment][series], value: parseFloat(value).toFixed(decimalPlaces) };
73
+ return keepRawValue
74
+ ? { ...seriesValue }
75
+ : { ...seriesValue, value: parseFloat(value).toFixed(decimalPlaces) };
65
76
  }
66
77
  return '';
67
78
  }
@@ -104,9 +115,14 @@ class RealtimeValueHandler {
104
115
  }
105
116
  }
106
117
  handleUncontrolledRealtime() {
107
- return this.strategy
108
- .fetchCurrentValue()
109
- .pipe(switchMap(initialValue => this.strategy.createRealtimeStream(initialValue)));
118
+ return this.fetchCurrentValueThenStream();
119
+ }
120
+ /**
121
+ * A fetch that completes without a value, e.g. a series with no measurement yet, still starts
122
+ * the realtime stream, with `null` as the initial value.
123
+ */
124
+ fetchCurrentValueThenStream() {
125
+ return this.strategy.fetchCurrentValue().pipe(defaultIfEmpty(null), switchMap(currentValue => this.strategy.createRealtimeStream(currentValue)));
110
126
  }
111
127
  handleControlledRealtime(control$) {
112
128
  const controlWithPrevious$ = control$.pipe(distinctUntilChanged(), startWith(null), pairwise(), share());
@@ -130,9 +146,7 @@ class RealtimeValueHandler {
130
146
  // Realtime is enabled
131
147
  if (this.config.refetchOnResume || previous === null) {
132
148
  // Re-fetch current value and start streaming
133
- return this.strategy
134
- .fetchCurrentValue()
135
- .pipe(switchMap(currentValue => this.strategy.createRealtimeStream(currentValue)));
149
+ return this.fetchCurrentValueThenStream();
136
150
  }
137
151
  else {
138
152
  // Continue with realtime stream without re-fetching
@@ -149,7 +163,7 @@ class RealtimeValueHandler {
149
163
  *
150
164
  * @param config - Measurement configuration (datapoint, result type, etc.)
151
165
  * @param metadata - Configuration controlling the behavior of the function
152
- * @returns Observable<string> - Stream of measurement string values
166
+ * @returns Stream of measurement values, shaped by `config`
153
167
  */
154
168
  function lastMeasurementValue(config, metadata = { mode: 'realtime' }) {
155
169
  const injector = inject(Injector);
@@ -173,12 +187,12 @@ const lastMeasurement = {
173
187
  name: 'lastMeasurement',
174
188
  label: gettext('Last measurement'),
175
189
  type: 'string',
176
- config: { dp: [], resultType: 1 },
190
+ config: { dp: [], resultType: 1, rawValue: true },
177
191
  computed: true,
178
192
  isEditable: false,
179
193
  isStandardProperty: true
180
194
  },
181
- loadConfigComponent: () => import('./c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DOmwNU6m.mjs').then(m => m.ComputedPropertyLastMeasurementConfigComponent),
195
+ loadConfigComponent: () => import('./c8y-ngx-components-computed-asset-properties-last-measurement-config.component-d3JeKEr4.mjs').then(m => m.ComputedPropertyLastMeasurementConfigComponent),
182
196
  value: ({ config }) => {
183
197
  return lastMeasurementValue(config);
184
198
  }
@@ -774,7 +788,7 @@ const fieldbusItemStatus = {
774
788
  isEditable: false,
775
789
  isStandardProperty: true
776
790
  },
777
- loadConfigComponent: () => import('./c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs').then(m => m.FieldbusItemStatusConfigComponent),
791
+ loadConfigComponent: () => import('./c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-BqbzREl7.mjs').then(m => m.FieldbusItemStatusConfigComponent),
778
792
  value: ({ config, context }) => fieldbusItemStatusValue(context, config)
779
793
  };
780
794
  function fieldbusItemStatusValue(asset, config, metadata = { mode: 'realtime' }) {
@@ -809,4 +823,4 @@ const computedAssetPropertiesProviders = [
809
823
  */
810
824
 
811
825
  export { DEFAULT_DECIMAL_PLACES as D, FieldbusService as F, RESULT_TYPES$1 as R, RESULT_TYPES as a, computedAssetPropertiesProviders as c };
812
- //# sourceMappingURL=c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs.map
826
+ //# sourceMappingURL=c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs","sources":["../../computed-asset-properties/last-measurement/last-measurement.model.ts","../../computed-asset-properties/strategies/last-measurement-strategy.ts","../../computed-asset-properties/common/realtime-value-handler.ts","../../computed-asset-properties/last-measurement/last-measurement-value.ts","../../computed-asset-properties/last-measurement/last-measurement-computed-property.ts","../../computed-asset-properties/strategies/child-count-strategy.ts","../../computed-asset-properties/child-count/child-count-value.ts","../../computed-asset-properties/child-count/child-assets-count-computed-property.ts","../../computed-asset-properties/strategies/count-strategy-base.ts","../../computed-asset-properties/strategies/alarm-count-strategy.ts","../../computed-asset-properties/alarm-count/alarm-count-value.ts","../../computed-asset-properties/alarm-count/alarm-count-3-months-computed-property.ts","../../computed-asset-properties/alarm-count/alarm-count-today-computed-property.ts","../../computed-asset-properties/strategies/event-count-strategy.ts","../../computed-asset-properties/event-count/event-count-value.ts","../../computed-asset-properties/event-count/event-count-today.ts","../../computed-asset-properties/event-count/event-count-3-months.ts","../../computed-asset-properties/configuration-snapshot/configuration-snapshot-computed-property.ts","../../computed-asset-properties/child-count/child-devices-count-computed-property.ts","../../computed-asset-properties/strategies/last-device-message-strategy.ts","../../computed-asset-properties/last-device-message/last-device-message-value.ts","../../computed-asset-properties/last-device-message/last-device-message-computed-property.ts","../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status.model.ts","../../computed-asset-properties/fieldbus-item-status/fieldbus.service.ts","../../computed-asset-properties/strategies/fieldbus-item-status-strategy.ts","../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-computed-property.ts","../../computed-asset-properties/index.ts","../../computed-asset-properties/c8y-ngx-components-computed-asset-properties.ts"],"sourcesContent":["import { IMeasurementValue } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const RESULT_TYPES = {\n VALUE: { name: 'VALUE', value: 1, label: gettext('Only value') },\n VALUE_UNIT: { name: 'VALUE_UNIT', value: 2, label: gettext('Value and unit') },\n VALUE_UNIT_TIME: { name: 'VALUE_UNIT_TIME', value: 3, label: gettext('Value, unit and time') },\n OBJECT: { name: 'OBJECT', value: 4, label: gettext('Complete object') }\n};\n\nexport const DEFAULT_DECIMAL_PLACES = 2;\n\nexport type LastMeasurementConfig = {\n dp: KPIDetails[];\n resultType: number;\n numberOfDecimalPlaces?: number;\n /**\n * Returns the value as the device sent it, not rounded to `numberOfDecimalPlaces` nor turned\n * into a string. The default for new properties, cleared by \"Format as numeric string\" in the\n * config form; configs saved without it stay formatted. Set on mappings migrated from\n * SCADA 1.0, whose drawings compare the raw value.\n */\n rawValue?: boolean;\n};\n\nexport type LastMeasurementResult = string | number | IMeasurementValue;\n","import { Injector } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { IMeasurement, MeasurementService } from '@c8y/client';\nimport { DatePipe, MeasurementRealtimeService, translateDatapointUnit } from '@c8y/ngx-components';\nimport { filter, from, map, Observable, startWith } from 'rxjs';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DEFAULT_DECIMAL_PLACES,\n LastMeasurementConfig,\n LastMeasurementResult,\n RESULT_TYPES\n} from '../last-measurement/last-measurement.model';\nimport { ValueStrategy } from '../common/realtime-value-base';\n\nexport class LastMeasurementStrategy implements ValueStrategy<LastMeasurementResult> {\n private measurementService: MeasurementService;\n private measurementRealtime: MeasurementRealtimeService;\n private datapoint: KPIDetails;\n private datePipe: DatePipe;\n private translate: TranslateService;\n\n constructor(\n private config: LastMeasurementConfig,\n injector: Injector\n ) {\n this.measurementService = injector.get(MeasurementService);\n this.measurementRealtime = injector.get(MeasurementRealtimeService);\n this.datePipe = injector.get(DatePipe);\n this.translate = injector.get(TranslateService);\n this.datapoint = config.dp.filter(dp => dp.__active)[0];\n }\n\n fetchCurrentValue(): Observable<LastMeasurementResult> {\n const measurementFilter: any = {\n valueFragmentSeries: this.datapoint.series,\n valueFragmentType: this.datapoint.fragment,\n pageSize: 1,\n revert: true,\n dateFrom: '1970-01-01',\n source: this.datapoint.__target.id\n };\n\n return from(this.measurementService.list(measurementFilter)).pipe(\n map(({ data }) => data[0]),\n filter(measurement => !!measurement),\n map(measurement => this.formatMeasurement(measurement))\n );\n }\n\n createRealtimeStream(initialValue: LastMeasurementResult): Observable<LastMeasurementResult> {\n const measurementUpdates$ = this.measurementRealtime\n .onCreateOfSpecificMeasurement$(\n this.datapoint.fragment,\n this.datapoint.series,\n this.datapoint.__target\n )\n .pipe(map(measurement => this.formatMeasurement(measurement)));\n // Without a measurement yet, consumers keep their own empty state until the first one arrives.\n const hasInitialValue = initialValue != null;\n return hasInitialValue\n ? measurementUpdates$.pipe(startWith(initialValue))\n : measurementUpdates$;\n }\n\n private formatMeasurement(measurement: IMeasurement): LastMeasurementResult {\n const resultType = this.config?.resultType;\n const fragment = this.datapoint.fragment;\n const series = this.datapoint.series;\n const seriesValue = measurement[fragment][series];\n const keepRawValue = !!this.config?.rawValue;\n const decimalPlaces = this.config?.numberOfDecimalPlaces ?? DEFAULT_DECIMAL_PLACES;\n const value = keepRawValue\n ? seriesValue.value\n : this.formatValue(seriesValue.value, decimalPlaces);\n // The data point carries the unit configured for it in the library, which is the one a tenant\n // registers a translation for. The measurement only reports whatever the device sent.\n const unit = translateDatapointUnit(this.datapoint.unit || seriesValue.unit, this.translate);\n\n if (resultType === RESULT_TYPES.VALUE.value) {\n return value;\n } else if (resultType === RESULT_TYPES.VALUE_UNIT.value) {\n return `${value} ${unit}`;\n } else if (resultType === RESULT_TYPES.VALUE_UNIT_TIME.value) {\n const date = this.datePipe.transform(new Date(measurement.time as string), 'short');\n return `${date} | ${value} ${unit}`;\n } else if (resultType === RESULT_TYPES.OBJECT.value) {\n return keepRawValue\n ? { ...seriesValue }\n : { ...seriesValue, value: parseFloat(value as string).toFixed(decimalPlaces) };\n }\n return '';\n }\n\n private formatValue(value: number | string, decimalPlaces: number): string {\n const numericValue = typeof value === 'string' ? parseFloat(value) : value;\n if (isNaN(numericValue)) {\n return String(value);\n }\n return numericValue.toFixed(decimalPlaces);\n }\n}\n","import {\n defaultIfEmpty,\n distinctUntilChanged,\n NEVER,\n Observable,\n pairwise,\n share,\n startWith,\n switchMap,\n take\n} from 'rxjs';\nimport { ValueCallbackMetadata } from '@c8y/ngx-components/asset-properties';\nimport { ValueStrategy, RealtimeValueConfig } from './realtime-value-base';\n\n/**\n * Generic handler for realtime values following the three modes pattern\n * Closed for modification but open for extension through strategies\n */\nexport class RealtimeValueHandler<T> {\n private readonly config: Required<RealtimeValueConfig> = {\n refetchOnResume: true,\n preserveValueOnPause: true\n };\n\n constructor(\n private strategy: ValueStrategy<T>,\n config?: RealtimeValueConfig\n ) {\n if (config) {\n this.config = { ...this.config, ...config };\n }\n }\n\n /**\n * Creates an Observable based on the metadata mode\n */\n getValue(metadata: ValueCallbackMetadata = { mode: 'realtime' }): Observable<T> {\n if (metadata.mode === 'singleValue') {\n return this.strategy.fetchCurrentValue().pipe(take(1));\n }\n\n if (metadata.mode === 'realtime' && !metadata.realtimeControl$) {\n return this.handleUncontrolledRealtime();\n }\n\n if (metadata.mode === 'realtime' && metadata.realtimeControl$) {\n return this.handleControlledRealtime(metadata.realtimeControl$);\n }\n }\n\n private handleUncontrolledRealtime(): Observable<T> {\n return this.fetchCurrentValueThenStream();\n }\n\n /**\n * A fetch that completes without a value, e.g. a series with no measurement yet, still starts\n * the realtime stream, with `null` as the initial value.\n */\n private fetchCurrentValueThenStream(): Observable<T> {\n return this.strategy.fetchCurrentValue().pipe(\n defaultIfEmpty(null as T),\n switchMap(currentValue => this.strategy.createRealtimeStream(currentValue))\n );\n }\n\n private handleControlledRealtime(control$: Observable<boolean>): Observable<T> {\n const controlWithPrevious$ = control$.pipe(\n distinctUntilChanged(),\n startWith(null),\n pairwise(),\n share()\n );\n\n return controlWithPrevious$.pipe(\n switchMap(([previous, current]) => {\n if (!current) {\n // Realtime is disabled\n if (previous === null) {\n // Initial emission while disabled\n return this.strategy.fetchCurrentValue().pipe(take(1));\n } else if (this.config.preserveValueOnPause) {\n // Was previously enabled - preserve last value\n return NEVER;\n } else {\n // Don't preserve value - fetch current\n return this.strategy.fetchCurrentValue().pipe(take(1));\n }\n } else {\n // Realtime is enabled\n if (this.config.refetchOnResume || previous === null) {\n // Re-fetch current value and start streaming\n return this.fetchCurrentValueThenStream();\n } else {\n // Continue with realtime stream without re-fetching\n return this.strategy.createRealtimeStream(null as T);\n }\n }\n })\n );\n }\n}\n","import { inject, Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { LastMeasurementConfig, LastMeasurementResult } from './last-measurement.model';\nimport { ValueCallbackMetadata } from '@c8y/ngx-components/asset-properties';\nimport { LastMeasurementStrategy } from '../strategies/last-measurement-strategy';\nimport { RealtimeValueHandler } from '../common/realtime-value-handler';\n\n/**\n * Creates an Observable that tracks the latest measurement value for a specific datapoint.\n * Combines initial server fetch with real-time measurement updates.\n *\n * @param config - Measurement configuration (datapoint, result type, etc.)\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Stream of measurement values, shaped by `config`\n */\nexport function lastMeasurementValue(\n config: LastMeasurementConfig,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<LastMeasurementResult> {\n const injector = inject(Injector);\n const strategy = new LastMeasurementStrategy(config, injector);\n const handler = new RealtimeValueHandler(strategy);\n return handler.getValue(metadata);\n}\n","import { ComputedPropertyDefinition } from '@c8y/ngx-components/asset-properties';\nimport { LastMeasurementConfig } from './last-measurement.model';\nimport { lastMeasurementValue } from './last-measurement-value';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const lastMeasurement: ComputedPropertyDefinition<\n ['device', 'asset', 'group'],\n LastMeasurementConfig\n> = {\n name: 'lastMeasurement',\n contextType: ['device', 'asset', 'group'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n lastMeasurement: {\n label: 'Last measurement',\n type: 'string'\n }\n }\n },\n name: 'lastMeasurement',\n label: gettext('Last measurement'),\n type: 'string',\n config: { dp: [], resultType: 1, rawValue: true } as LastMeasurementConfig,\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./last-measurement-config.component').then(\n m => m.ComputedPropertyLastMeasurementConfigComponent\n ),\n value: ({ config }) => {\n return lastMeasurementValue(config);\n }\n};\n","import { Injector } from '@angular/core';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { ManagedObjectRealtimeService } from '@c8y/ngx-components';\nimport { from, map, Observable, startWith } from 'rxjs';\nimport { ValueStrategy } from '../common/realtime-value-base';\n\nexport class ChildCountStrategy implements ValueStrategy<number> {\n private inventoryService: InventoryService;\n private moRealtimeService: ManagedObjectRealtimeService;\n\n constructor(\n private asset: IManagedObject,\n private childType: 'childDevices' | 'childAssets',\n injector: Injector\n ) {\n this.inventoryService = injector.get(InventoryService);\n this.moRealtimeService = injector.get(ManagedObjectRealtimeService);\n }\n\n fetchCurrentValue(): Observable<number> {\n return from(this.inventoryService.detail(this.asset.id, { withChildren: true })).pipe(\n map(resp => resp?.data?.[this.childType]?.references?.length || 0)\n );\n }\n\n createRealtimeStream(initialValue: number): Observable<number> {\n return this.moRealtimeService.onAll$(this.asset.id).pipe(\n map(resp => (resp?.data as IManagedObject)?.[this.childType]?.references?.length || 0),\n startWith(initialValue)\n );\n }\n}\n","import { inject, Injector } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { ValueCallbackMetadata } from '@c8y/ngx-components/asset-properties';\nimport { Observable } from 'rxjs';\nimport { ChildCountStrategy } from '../strategies/child-count-strategy';\nimport { RealtimeValueHandler } from '../common/realtime-value-handler';\n\n/**\n * Shared function that tracks the count of child items (devices or assets) for a specific managed object.\n * Supports real-time updates when child items are added or removed.\n *\n * @param asset - The managed object to track child items for\n * @param childType - Type of child items ('childDevices' or 'childAssets')\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Observable<number> - Stream of child items count values\n */\nexport function childCountValue(\n asset: IManagedObject,\n metadata: ValueCallbackMetadata = { mode: 'realtime' },\n childType: 'childDevices' | 'childAssets'\n): Observable<number> {\n const injector = inject(Injector);\n const strategy = new ChildCountStrategy(asset, childType, injector);\n const handler = new RealtimeValueHandler(strategy);\n return handler.getValue(metadata);\n}\n","import { IManagedObject } from '@c8y/client';\nimport {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { Observable } from 'rxjs';\nimport { childCountValue } from './child-count-value';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const childAssetsCount: ComputedPropertyDefinition<['group', 'asset']> = {\n name: 'childAssetsCount',\n contextType: ['group', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n childAssetsCount: {\n label: 'Number of child assets',\n type: 'number'\n }\n }\n },\n name: 'childAssetsCount',\n label: gettext('Number of child assets'),\n type: 'number',\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n value: ({ context, metadata }) => childAssetsCountValue(context, metadata)\n};\n\n/**\n * Creates an Observable that tracks the count of child assets for a specific asset.\n * Supports real-time updates when child assets are added or removed.\n *\n * @param asset - The managed object (asset) to track child assets for\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Observable<number> - Stream of child assets count values\n */\nexport function childAssetsCountValue(\n asset: IManagedObject,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<number> {\n return childCountValue(asset, metadata, 'childAssets');\n}\n","import { Observable, scan, startWith } from 'rxjs';\nimport { ValueStrategy } from '../common/realtime-value-base';\n\n/**\n * Base class for count-based strategies\n * Provides common accumulation logic\n */\nexport abstract class CountStrategyBase implements ValueStrategy<number> {\n abstract fetchCurrentValue(): Observable<number>;\n abstract getRealtimeIncrement$(): Observable<number>;\n\n createRealtimeStream(initialValue: number): Observable<number> {\n return this.getRealtimeIncrement$().pipe(\n scan((count, increment) => count + increment, initialValue),\n startWith(initialValue)\n );\n }\n}\n","import { Injector } from '@angular/core';\nimport {\n AlarmQueryFilter,\n AlarmService,\n IAlarm,\n IManagedObject,\n SeverityFilter\n} from '@c8y/client';\nimport { AlarmRealtimeService } from '@c8y/ngx-components';\nimport { filter, from, map, Observable, tap } from 'rxjs';\nimport { AlarmCountConfig } from '../alarm-count/alarm-count.model';\nimport { CountStrategyBase } from './count-strategy-base';\n\nexport class AlarmCountStrategy extends CountStrategyBase {\n private alarmService: AlarmService;\n private alarmRealtimeService: AlarmRealtimeService;\n private startTime: Date;\n\n constructor(\n private config: AlarmCountConfig,\n private asset: IManagedObject,\n private dateFrom: Date,\n injector: Injector\n ) {\n super();\n this.alarmService = injector.get(AlarmService);\n this.alarmRealtimeService = injector.get(AlarmRealtimeService);\n this.startTime = new Date();\n }\n\n fetchCurrentValue(): Observable<number> {\n const severities: SeverityFilter[] = Object.keys(this.config.severities || {}).filter(\n key => this.config.severities[key]\n ) as SeverityFilter[];\n\n const filters: AlarmQueryFilter = {\n source: this.asset.id,\n dateFrom: this.dateFrom.toISOString(),\n type: this.config.type,\n pageSize: 1,\n withTotalElements: true,\n ...(severities.length && { severity: severities.join(',') })\n };\n\n return from(this.alarmService.list(filters)).pipe(\n map(resp => resp?.paging?.totalElements || 0),\n tap(() => (this.startTime = new Date())) // Update start time after fetch\n );\n }\n\n getRealtimeIncrement$(): Observable<number> {\n return this.alarmRealtimeService.onAll$(this.asset.id).pipe(\n map(({ data }) => data as IAlarm),\n filter(\n alarm =>\n alarm.type === this.config.type &&\n this.config.severities[alarm.severity] &&\n new Date(alarm.creationTime) > this.startTime\n ),\n tap(() => (this.startTime = new Date())),\n map(() => 1) // Each matching alarm increments by 1\n );\n }\n}\n","import { inject, Injector } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { ValueCallbackMetadata } from '@c8y/ngx-components/asset-properties';\nimport { Observable } from 'rxjs';\nimport { AlarmCountStrategy } from '../strategies/alarm-count-strategy';\nimport { AlarmCountConfig } from './alarm-count.model';\nimport { RealtimeValueHandler } from '../common/realtime-value-handler';\n\n/**\n * Creates an Observable that tracks alarm count for a specific asset.\n * When real-time is paused and resumed, it re-fetches the current count from server\n * to account for alarms that occurred during the pause.\n *\n * @param config - Alarm filtering configuration (type, severities, etc.)\n * @param asset - The managed object (device/asset) to track alarms for\n * @param dateFrom - Start date for counting alarms\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Observable<number> - Stream of alarm count values\n */\nexport function alarmCountValue(\n config: AlarmCountConfig,\n asset: IManagedObject,\n dateFrom: Date,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<number> {\n const injector = inject(Injector);\n const strategy = new AlarmCountStrategy(config, asset, dateFrom, injector);\n const handler = new RealtimeValueHandler(strategy);\n return handler.getValue(metadata);\n}\n","import { IManagedObject } from '@c8y/client';\nimport {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { AlarmCountConfig } from './alarm-count.model';\nimport { alarmCountValue } from './alarm-count-value';\nimport { Observable } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const alarmCount3Months: ComputedPropertyDefinition<\n ['device', 'group', 'asset'],\n AlarmCountConfig\n> = {\n name: 'alarmCount3Months',\n contextType: ['device', 'group', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n alarmCount3Months: {\n label: 'Alarm count 3 months',\n type: 'number'\n }\n }\n },\n name: 'alarmCount3Months',\n label: gettext('Alarm count 3 months'),\n type: 'number',\n config: { type: '' } as AlarmCountConfig,\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./alarm-count-config.component').then(m => m.ComputedPropertyAlarmCountConfigComponent),\n value: ({ config, context, metadata }) => alarmCount3MonthsValue(config, context, metadata)\n};\n\nfunction alarmCount3MonthsValue(\n config: AlarmCountConfig,\n asset: IManagedObject,\n metadata: ValueCallbackMetadata\n): Observable<number> {\n const threeMonthsAgo = new Date();\n threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3);\n return alarmCountValue(config, asset, threeMonthsAgo, metadata);\n}\n","import { IManagedObject } from '@c8y/client';\nimport {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { AlarmCountConfig } from './alarm-count.model';\nimport { alarmCountValue } from './alarm-count-value';\nimport { Observable } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const alarmCountToday: ComputedPropertyDefinition<\n ['device', 'group', 'asset'],\n AlarmCountConfig\n> = {\n name: 'alarmCountToday',\n contextType: ['device', 'group', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n alarmCountToday: {\n label: 'Alarm count today',\n type: 'number'\n }\n }\n },\n name: 'alarmCountToday',\n label: gettext('Alarm count today'),\n type: 'number',\n config: { type: '' } as AlarmCountConfig,\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./alarm-count-config.component').then(m => m.ComputedPropertyAlarmCountConfigComponent),\n value: ({ config, context, metadata }) => alarmCountTodayValue(config, context, metadata)\n};\n\nfunction alarmCountTodayValue(\n config: AlarmCountConfig,\n asset: IManagedObject,\n metadata: ValueCallbackMetadata\n): Observable<number> {\n const oneDayAgo = new Date();\n oneDayAgo.setDate(oneDayAgo.getDate() - 1);\n return alarmCountValue(config, asset, oneDayAgo, metadata);\n}\n","import { Injector } from '@angular/core';\nimport { EventService, IEvent, IManagedObject } from '@c8y/client';\nimport { EventRealtimeService } from '@c8y/ngx-components';\nimport { filter, from, map, Observable } from 'rxjs';\nimport { EventCountConfig } from '../event-count/event-count.model';\nimport { CountStrategyBase } from './count-strategy-base';\n\nexport class EventCountStrategy extends CountStrategyBase {\n private eventService: EventService;\n private eventRealtimeService: EventRealtimeService;\n\n constructor(\n private config: EventCountConfig,\n private asset: IManagedObject,\n private dateFrom: Date,\n injector: Injector\n ) {\n super();\n this.eventService = injector.get(EventService);\n this.eventRealtimeService = injector.get(EventRealtimeService);\n }\n\n fetchCurrentValue(): Observable<number> {\n const filters = {\n source: this.asset.id,\n dateFrom: this.dateFrom.toISOString(),\n type: this.config.type,\n pageSize: 1,\n withTotalElements: true\n };\n\n return from(this.eventService.list(filters)).pipe(\n map(resp => resp?.paging?.totalElements || 0)\n );\n }\n\n getRealtimeIncrement$(): Observable<number> {\n return this.eventRealtimeService.onAll$(this.asset.id).pipe(\n map(({ data }) => data as IEvent),\n filter(event => event.type === this.config.type && new Date(event.time) >= this.dateFrom),\n map(() => 1)\n );\n }\n}\n","import { inject, Injector } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { EventCountConfig } from './event-count.model';\nimport { Observable } from 'rxjs';\nimport { ValueCallbackMetadata } from '@c8y/ngx-components/asset-properties';\nimport { EventCountStrategy } from '../strategies/event-count-strategy';\nimport { RealtimeValueHandler } from '../common/realtime-value-handler';\n\n/**\n * Creates an Observable that tracks event count for a specific asset.\n * When real-time is paused and resumed, it re-fetches the current count from server\n * to account for events that occurred during the pause.\n *\n * @param config - Event filtering configuration (type, etc.)\n * @param asset - The managed object (device/asset) to track events for\n * @param dateFrom - Start date for counting events\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Observable<number> - Stream of event count values\n */\nexport function eventCountValue(\n config: EventCountConfig,\n asset: IManagedObject,\n dateFrom: Date,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<number> {\n const injector = inject(Injector);\n const strategy = new EventCountStrategy(config, asset, dateFrom, injector);\n const handler = new RealtimeValueHandler(strategy);\n return handler.getValue(metadata);\n}\n","import { IManagedObject } from '@c8y/client';\nimport {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { EventCountConfig } from './event-count.model';\nimport { eventCountValue } from './event-count-value';\nimport { Observable } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const eventCountToday: ComputedPropertyDefinition<\n ['device', 'group', 'asset'],\n EventCountConfig\n> = {\n name: 'eventCountToday',\n contextType: ['device', 'group', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n eventCountToday: {\n label: 'Event count today',\n type: 'number'\n }\n }\n },\n name: 'eventCountToday',\n label: gettext('Event count today'),\n type: 'number',\n config: { type: '' },\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./event-count-config.component').then(m => m.ComputedPropertyEventCountConfigComponent),\n value: ({ config, context, metadata }) => eventCountTodayValue(config, context, metadata)\n};\n\nfunction eventCountTodayValue(\n config: EventCountConfig,\n asset: IManagedObject,\n metadata: ValueCallbackMetadata\n): Observable<number> {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return eventCountValue(config, asset, today, metadata);\n}\n","import { IManagedObject } from '@c8y/client';\nimport {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { EventCountConfig } from './event-count.model';\nimport { eventCountValue } from './event-count-value';\nimport { Observable } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const eventCount3Months: ComputedPropertyDefinition<\n ['device', 'group', 'asset'],\n EventCountConfig\n> = {\n name: 'eventCount3Months',\n contextType: ['device', 'group', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n eventCount3Months: {\n label: 'Event count 3 months',\n type: 'number'\n }\n }\n },\n name: 'eventCount3Months',\n label: gettext('Event count 3 months'),\n type: 'number',\n config: { type: '' },\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./event-count-config.component').then(m => m.ComputedPropertyEventCountConfigComponent),\n value: ({ config, context, metadata }) => eventCount3MonthsValue(config, context, metadata)\n};\n\nfunction eventCount3MonthsValue(\n config: EventCountConfig,\n asset: IManagedObject,\n metadata: ValueCallbackMetadata\n): Observable<number> {\n const threeMonthsAgo = new Date();\n threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3);\n return eventCountValue(config, asset, threeMonthsAgo, metadata);\n}\n","import { ComputedPropertyDefinition } from '@c8y/ngx-components/asset-properties';\nimport { from, Observable, of, switchMap } from 'rxjs';\nimport { ConfigurationSnapshotConfig } from './configuration-snapshot.model';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { inject, Injector } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const configurationSnapshot: ComputedPropertyDefinition<\n ['device', 'asset'],\n ConfigurationSnapshotConfig\n> = {\n name: 'configurationSnapshot',\n contextType: ['device', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n configurationSnapshot: {\n label: 'Configuration snapshot',\n type: 'string'\n }\n }\n },\n contextType: ['device', 'asset'],\n name: 'configurationSnapshot',\n label: gettext('Configuration snapshot'),\n type: 'string',\n config: { legacy: true } as ConfigurationSnapshotConfig,\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./configuration-snapshot-config.component').then(\n m => m.ConfigurationSnapshotConfigComponent\n ),\n value: ({ config, context }) => configurationSnapshotValue(config, context)\n};\n\nfunction configurationSnapshotValue(\n config: ConfigurationSnapshotConfig,\n asset: IManagedObject\n): Observable<string> {\n if (config.legacy) {\n const configId = asset.c8y_ConfigurationDump?.id;\n if (!configId) {\n return of(null);\n }\n const injector = inject(Injector);\n const inventoryService = injector.get(InventoryService);\n return from(inventoryService.detail(configId, { withChildren: false })).pipe(\n switchMap(({ data }) => {\n return of(data?.name);\n })\n );\n } else {\n const fragment = `c8y_Configuration_${config.type}`;\n return of(asset[fragment]?.name);\n }\n}\n","import { IManagedObject } from '@c8y/client';\nimport {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { Observable } from 'rxjs';\nimport { childCountValue } from './child-count-value';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const childDevicesCount: ComputedPropertyDefinition<['group', 'device', 'asset']> = {\n name: 'childDevicesCount',\n contextType: ['group', 'device', 'asset'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n childDevicesCount: {\n label: 'Number of child devices',\n type: 'number'\n }\n }\n },\n name: 'childDevicesCount',\n label: gettext('Number of child devices'),\n type: 'number',\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n value: ({ context, metadata }) => childDevicesCountValue(context, metadata)\n};\n\n/**\n * Creates an Observable that tracks the count of child devices for a specific asset.\n * Supports real-time updates when child devices are added or removed.\n *\n * @param asset - The managed object (asset) to track child devices for\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Observable<number> - Stream of child devices count values\n */\nexport function childDevicesCountValue(\n asset: IManagedObject,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<number> {\n return childCountValue(asset, metadata, 'childDevices');\n}\n","import { Injector } from '@angular/core';\nimport {\n AlarmService,\n EventService,\n IAlarm,\n IEvent,\n IManagedObject,\n IMeasurement,\n IOperation,\n MeasurementService,\n OperationService\n} from '@c8y/client';\nimport {\n AlarmRealtimeService,\n EventRealtimeService,\n MeasurementRealtimeService,\n OperationRealtimeService\n} from '@c8y/ngx-components';\nimport {\n catchError,\n combineLatest,\n filter,\n from,\n map,\n merge,\n Observable,\n of,\n scan,\n startWith\n} from 'rxjs';\nimport { ValueStrategy } from '../common/realtime-value-base';\n\nexport class LastDeviceMessageStrategy implements ValueStrategy<string> {\n private measurementService: MeasurementService;\n private measurementRealtime: MeasurementRealtimeService;\n private eventService: EventService;\n private eventRealtimeService: EventRealtimeService;\n private alarmService: AlarmService;\n private alarmRealtimeService: AlarmRealtimeService;\n private operationService: OperationService;\n private operationRealtimeService: OperationRealtimeService;\n private startTime: Date;\n\n constructor(\n private asset: IManagedObject,\n injector: Injector\n ) {\n this.measurementService = injector.get(MeasurementService);\n this.measurementRealtime = injector.get(MeasurementRealtimeService);\n this.eventService = injector.get(EventService);\n this.eventRealtimeService = injector.get(EventRealtimeService);\n this.alarmService = injector.get(AlarmService);\n this.alarmRealtimeService = injector.get(AlarmRealtimeService);\n this.operationService = injector.get(OperationService);\n this.operationRealtimeService = injector.get(OperationRealtimeService);\n this.startTime = new Date();\n }\n\n fetchCurrentValue(): Observable<string> {\n const fetchFilter = {\n source: this.asset.id,\n pageSize: 1,\n revert: true\n };\n\n const fetchLatestMeasurement = (): Observable<string | null> => {\n return from(this.measurementService.list(fetchFilter)).pipe(\n map(resp => resp.data?.[0]?.time || null),\n catchError(() => of(null))\n );\n };\n\n const fetchLatestEvent = (): Observable<string | null> => {\n return from(this.eventService.list(fetchFilter)).pipe(\n map(resp => resp.data?.[0]?.time || null),\n catchError(() => of(null))\n );\n };\n\n const fetchLatestAlarm = (): Observable<string | null> => {\n return from(this.alarmService.list(fetchFilter)).pipe(\n map(resp => resp.data?.[0]?.time || null),\n catchError(() => of(null))\n );\n };\n\n const fetchLatestOperation = (): Observable<string | null> => {\n return from(this.operationService.list(fetchFilter)).pipe(\n map(resp => resp.data?.[0]?.creationTime || null),\n catchError(() => of(null))\n );\n };\n\n return combineLatest([\n fetchLatestMeasurement(),\n fetchLatestEvent(),\n fetchLatestAlarm(),\n fetchLatestOperation()\n ]).pipe(\n map(timestamps => {\n const validTimestamps = timestamps.filter(Boolean) as string[];\n\n if (validTimestamps.length === 0) {\n return null;\n }\n\n const latest = validTimestamps.reduce((latest, current) => {\n return new Date(current) > new Date(latest) ? current : latest;\n });\n\n // Update start time for realtime filtering\n this.startTime = new Date();\n return latest;\n })\n );\n }\n\n createRealtimeStream(initialValue: string): Observable<string> {\n const measurementStream$ = this.measurementRealtime.onAll$(this.asset.id).pipe(\n map(({ data }) => (data as IMeasurement).time),\n filter(time => new Date(time) > this.startTime)\n );\n\n const eventStream$ = this.eventRealtimeService.onAll$(this.asset.id).pipe(\n map(({ data }) => (data as IEvent).time),\n filter(time => new Date(time) > this.startTime)\n );\n\n const alarmStream$ = this.alarmRealtimeService.onAll$(this.asset.id).pipe(\n map(({ data }) => (data as IAlarm).time),\n filter(time => time && new Date(time) > this.startTime)\n );\n\n const operationStream$ = this.operationRealtimeService.onAll$(this.asset.id).pipe(\n map(({ data }) => (data as IOperation).creationTime),\n filter(time => time && new Date(time) > this.startTime)\n );\n\n return merge(measurementStream$, eventStream$, alarmStream$, operationStream$).pipe(\n scan((latestTimestamp, newTimestamp) => {\n return new Date(newTimestamp) > new Date(latestTimestamp) ? newTimestamp : latestTimestamp;\n }, initialValue),\n startWith(initialValue)\n );\n }\n}\n","import { ValueCallbackMetadata } from '@c8y/ngx-components/asset-properties';\nimport { IManagedObject } from '@c8y/client';\nimport { inject, Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { LastDeviceMessageStrategy } from '../strategies/last-device-message-strategy';\nimport { RealtimeValueHandler } from '../common/realtime-value-handler';\n\n/**\n * Gets the latest timestamp from events, alarms, measurements, and operations for a device.\n * Returns the most recent timestamp across all these sources.\n *\n * @param asset - The managed object (device/asset) to track\n * @param metadata - Configuration controlling the behavior of the function\n * @returns Observable<string> - Stream of latest timestamp values\n */\nexport function getLastDeviceMessage(\n asset: IManagedObject,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<string> {\n const injector = inject(Injector);\n const strategy = new LastDeviceMessageStrategy(asset, injector);\n const handler = new RealtimeValueHandler(strategy);\n return handler.getValue(metadata);\n}\n","import { ComputedPropertyDefinition } from '@c8y/ngx-components/asset-properties';\nimport { getLastDeviceMessage } from './last-device-message-value';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport const lastDeviceMessage: ComputedPropertyDefinition<['device']> = {\n name: 'lastDeviceMessage',\n contextType: ['device'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n lastDeviceMessage: {\n label: 'Last device message',\n type: 'string'\n }\n }\n },\n name: 'lastDeviceMessage',\n label: gettext('Last device message'),\n printFormat: 'datetime',\n type: 'string',\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n value: ({ context }) => {\n return getLastDeviceMessage(context);\n }\n};\n","import { IManagedObject } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport interface FieldbusItemStatusConfig {\n itemName: string;\n itemType: 'c8y_Coil' | 'c8y_Register';\n resultType: keyof typeof RESULT_TYPES;\n}\n\nexport const RESULT_TYPES = {\n RAW_VALUE: { name: 'RAW_VALUE', value: 'RAW_VALUE', label: gettext('Raw value') },\n ENUM_VALUE: { name: 'ENUM_VALUE', value: 'ENUM_VALUE', label: gettext('Enum value') }\n} as const;\n\nexport interface FieldbusDevice extends IManagedObject {\n c8y_ModbusDevice?: {\n address: number;\n protocol: string;\n ipAddress: string;\n /** Reference URL to Fieldbus device type (e.g. /inventory/managedObjects/12345). */\n type: string;\n };\n c8y_CoilStatus?: {\n [name: string]: number;\n };\n c8y_RegisterStatus?: {\n [name: string]: number;\n };\n}\n\nexport interface FieldbusDeviceType extends IManagedObject {\n name: string;\n type: string;\n fieldbusType: string;\n c8y_Coils?: FieldbusCoil[];\n c8y_Registers?: FieldbusRegister[];\n}\n\nexport interface FieldbusCoil {\n number: number;\n name: string;\n input: boolean;\n statusMapping: {\n status: 'read' | 'write';\n };\n enumValues?: {\n [value: number]: string;\n };\n alarmMapping?: {\n severity: 'CRITICAL' | 'MAJOR' | 'MINOR' | 'WARNING';\n type: string;\n text: string;\n raiseAlarmTemplate: number;\n };\n}\n\nexport interface FieldbusRegister {\n number: number;\n input: boolean;\n startBit: number;\n noBits: number;\n name: string;\n multiplier: number;\n divisor: number;\n decimalPlaces: number;\n unit: string;\n signed: boolean;\n min: number;\n max: number;\n category: string;\n measurementMapping?: {\n series: string;\n sendMeasurementTemplate: number;\n type: string;\n };\n statusMapping?: {\n status: 'read' | 'write';\n };\n enumValues?: {\n [value: number]: string;\n };\n eventMapping?: {\n eventTemplate: number;\n type: string;\n text: string;\n };\n}\n\nexport interface LegacyFieldbusProperty {\n fieldbus: true;\n id: string;\n keyPath: [string, string];\n label: string;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { InventoryService } from '@c8y/client';\nimport {\n FieldbusDevice,\n FieldbusDeviceType,\n LegacyFieldbusProperty\n} from './fieldbus-item-status.model';\nimport { AssetPropertyType, ComputedPropertiesService } from '@c8y/ngx-components/asset-properties';\n\n@Injectable({ providedIn: 'root' })\nexport class FieldbusService {\n private inventory = inject(InventoryService);\n private computedProperties = inject(ComputedPropertiesService);\n\n async getDeviceTypeOf(fieldbusDevice: FieldbusDevice): Promise<FieldbusDeviceType> {\n const typeRef = fieldbusDevice?.c8y_ModbusDevice?.type;\n if (!typeRef) {\n throw new Error('Provided device is missing c8y_ModbusDevice.type.');\n }\n\n const match = /^\\/inventory\\/managedObjects\\/(\\d+)$/.exec(typeRef);\n if (!match) {\n throw new Error(\n `Provided Fieldbus type reference ${typeRef} has invalid format, expected: /inventory/managedObjects/{id}`\n );\n }\n\n const deviceTypeId = match[1];\n try {\n const { data } = await this.inventory.detail(deviceTypeId);\n return data as FieldbusDeviceType;\n } catch (ex) {\n const errorMessage = ex instanceof Error ? ex.message : String(ex);\n throw new Error(\n `Could not fetch Fieldbus device type with ID ${deviceTypeId}: ${errorMessage}.`\n );\n }\n }\n\n async migrateFieldbusProperty(\n legacyProperty: LegacyFieldbusProperty,\n fieldbusDevice: FieldbusDevice\n ): Promise<AssetPropertyType> {\n if (!legacyProperty.fieldbus) {\n throw new Error('Provided property is not a legacy Fieldbus property.');\n }\n\n const computedPropertyName = 'fieldbusItemStatus';\n const computedProperty = await this.computedProperties.getByName(computedPropertyName);\n\n const [statusPropertyName, itemName] = legacyProperty.keyPath;\n const itemType = statusPropertyName === 'c8y_CoilStatus' ? 'c8y_Coil' : 'c8y_Register';\n const deviceType = await this.getDeviceTypeOf(fieldbusDevice);\n const itemListPropertyName = `${itemType}s` as 'c8y_Coils' | 'c8y_Registers';\n const itemList = deviceType[itemListPropertyName] || [];\n const item = itemList.find(i => i.name === itemName);\n const resultType = item.enumValues ? 'ENUM_VALUE' : 'RAW_VALUE';\n\n return {\n ...computedProperty.prop,\n active: true,\n temporary: true,\n asset: {\n id: fieldbusDevice.id,\n name: fieldbusDevice.name\n },\n config: {\n itemName,\n itemType,\n resultType\n }\n };\n }\n}\n","import { Injector } from '@angular/core';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { ManagedObjectRealtimeService } from '@c8y/ngx-components';\nimport { from, Observable, startWith, switchMap } from 'rxjs';\nimport { ValueStrategy } from '../common/realtime-value-base';\nimport {\n FieldbusCoil,\n FieldbusDevice,\n FieldbusDeviceType,\n FieldbusItemStatusConfig,\n FieldbusRegister,\n RESULT_TYPES\n} from '../fieldbus-item-status/fieldbus-item-status.model';\nimport { get } from 'lodash-es';\nimport { FieldbusService } from '../fieldbus-item-status/fieldbus.service';\n\nexport class FieldbusItemStatusStrategy implements ValueStrategy<number | string> {\n private inventoryService: InventoryService;\n private moRealtimeService: ManagedObjectRealtimeService;\n private fieldbusService: FieldbusService;\n private _fieldbusDeviceType: FieldbusDeviceType;\n\n constructor(\n private asset: IManagedObject,\n private config: FieldbusItemStatusConfig,\n injector: Injector\n ) {\n this.inventoryService = injector.get(InventoryService);\n this.moRealtimeService = injector.get(ManagedObjectRealtimeService);\n this.fieldbusService = injector.get(FieldbusService);\n }\n\n fetchCurrentValue(): Observable<number | string> {\n return from(this.inventoryService.detail(this.asset.id)).pipe(\n switchMap(({ data }) => this.getStatus(data as FieldbusDevice))\n );\n }\n\n createRealtimeStream(initialValue: number | string): Observable<number | string> {\n return this.moRealtimeService.onAll$(this.asset.id).pipe(\n switchMap(({ data }) => this.getStatus(data as FieldbusDevice)),\n startWith(initialValue)\n );\n }\n\n private async getStatus(fieldbusDevice: FieldbusDevice): Promise<number | string> {\n const fieldbusDeviceType = await this.getFieldbusDeviceType(fieldbusDevice);\n if (!fieldbusDeviceType) {\n return null;\n }\n\n const itemListPropertyName = `${this.config.itemType}s` as 'c8y_Coils' | 'c8y_Registers';\n const statusPropertyName = `${this.config.itemType}Status` as\n | 'c8y_CoilStatus'\n | 'c8y_RegisterStatus';\n const items: FieldbusCoil[] | FieldbusRegister[] =\n fieldbusDeviceType[itemListPropertyName] ?? [];\n const item: FieldbusCoil | FieldbusRegister = items.find(i => i.name === this.config.itemName);\n const statusProperty = get(fieldbusDevice, statusPropertyName);\n const rawValue: number = get(statusProperty, this.config.itemName);\n if (this.config.resultType === RESULT_TYPES.ENUM_VALUE.value && item?.enumValues) {\n return item.enumValues[rawValue] ?? rawValue;\n } else {\n return rawValue;\n }\n }\n\n private async getFieldbusDeviceType(fieldbusDevice: FieldbusDevice): Promise<FieldbusDeviceType> {\n if (this._fieldbusDeviceType === undefined) {\n try {\n this._fieldbusDeviceType = await this.fieldbusService.getDeviceTypeOf(fieldbusDevice);\n } catch (ex) {\n this._fieldbusDeviceType = null;\n }\n }\n return this._fieldbusDeviceType;\n }\n}\n","import {\n ComputedPropertyDefinition,\n ValueCallbackMetadata\n} from '@c8y/ngx-components/asset-properties';\nimport { Observable } from 'rxjs';\nimport { inject, Injector } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { FieldbusItemStatusConfig } from './fieldbus-item-status.model';\nimport { FieldbusItemStatusStrategy } from '../strategies/fieldbus-item-status-strategy';\nimport { RealtimeValueHandler } from '../common/realtime-value-handler';\nimport { IManagedObject } from '@c8y/client';\n\nexport const fieldbusItemStatus: ComputedPropertyDefinition<['device'], FieldbusItemStatusConfig> =\n {\n name: 'fieldbusItemStatus',\n contextType: ['device'],\n prop: {\n c8y_JsonSchema: {\n properties: {\n fieldbusItemStatus: {\n label: gettext('Fieldbus item status'),\n type: ['number', 'string']\n }\n }\n },\n name: 'fieldbusItemStatus',\n label: gettext('Fieldbus item status'),\n type: ['number', 'string'],\n config: {\n itemName: null,\n itemType: null,\n resultType: 'RAW_VALUE'\n } as FieldbusItemStatusConfig,\n computed: true,\n isEditable: false,\n isStandardProperty: true\n },\n loadConfigComponent: () =>\n import('./fieldbus-item-status-config.component').then(\n m => m.FieldbusItemStatusConfigComponent\n ),\n value: ({ config, context }) => fieldbusItemStatusValue(context, config)\n };\n\nexport function fieldbusItemStatusValue(\n asset: IManagedObject,\n config: FieldbusItemStatusConfig,\n metadata: ValueCallbackMetadata = { mode: 'realtime' }\n): Observable<number | string> {\n const injector = inject(Injector);\n const strategy = new FieldbusItemStatusStrategy(asset, config, injector);\n const handler = new RealtimeValueHandler(strategy);\n return handler.getValue(metadata);\n}\n","import { hookComputedProperty } from '@c8y/ngx-components/asset-properties';\nimport { lastMeasurement } from './last-measurement/last-measurement-computed-property';\nimport { childAssetsCount } from './child-count/child-assets-count-computed-property';\nimport {\n AlarmRealtimeService,\n EventRealtimeService,\n ManagedObjectRealtimeService,\n MeasurementRealtimeService,\n OperationRealtimeService\n} from '@c8y/ngx-components';\nimport { alarmCount3Months } from './alarm-count/alarm-count-3-months-computed-property';\nimport { alarmCountToday } from './alarm-count/alarm-count-today-computed-property';\nimport { eventCountToday } from './event-count/event-count-today';\nimport { eventCount3Months } from './event-count/event-count-3-months';\nimport { configurationSnapshot } from './configuration-snapshot/configuration-snapshot-computed-property';\nimport { childDevicesCount } from './child-count/child-devices-count-computed-property';\nimport { lastDeviceMessage } from './last-device-message/last-device-message-computed-property';\nimport { fieldbusItemStatus } from './fieldbus-item-status/fieldbus-item-status-computed-property';\n\nexport { FieldbusService } from './fieldbus-item-status/fieldbus.service';\nexport const computedAssetPropertiesProviders = [\n AlarmRealtimeService,\n EventRealtimeService,\n MeasurementRealtimeService,\n OperationRealtimeService,\n ManagedObjectRealtimeService,\n hookComputedProperty([\n lastMeasurement,\n lastDeviceMessage,\n childAssetsCount,\n childDevicesCount,\n alarmCount3Months,\n alarmCountToday,\n eventCountToday,\n eventCount3Months,\n configurationSnapshot,\n fieldbusItemStatus\n ])\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["RESULT_TYPES"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { FormBuilder, NgForm, Validators, ControlContainer, ReactiveFormsModule
5
5
  import * as i1 from '@c8y/ngx-components';
6
6
  import { CoreModule, CommonModule, C8yTranslatePipe } from '@c8y/ngx-components';
7
7
  import { gettext } from '@c8y/ngx-components/gettext';
8
- import { a as RESULT_TYPES, F as FieldbusService } from './c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs';
8
+ import { a as RESULT_TYPES, F as FieldbusService } from './c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs';
9
9
  import * as i2$1 from '@angular/common';
10
10
 
11
11
  class FieldbusItemStatusConfigComponent {
@@ -117,4 +117,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
117
117
  }] } });
118
118
 
119
119
  export { FieldbusItemStatusConfigComponent };
120
- //# sourceMappingURL=c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs.map
120
+ //# sourceMappingURL=c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-BqbzREl7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs","sources":["../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-config.component.ts","../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-config.component.html"],"sourcesContent":["import {\n Component,\n inject,\n Input,\n OnInit,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {\n ControlContainer,\n FormBuilder,\n NgForm,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { IManagedObject } from '@c8y/client';\nimport { C8yTranslatePipe, CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n FieldbusCoil,\n FieldbusDeviceType,\n FieldbusItemStatusConfig,\n FieldbusRegister,\n RESULT_TYPES\n} from './fieldbus-item-status.model';\nimport { FieldbusService } from './fieldbus.service';\nimport { Observable } from 'rxjs';\n\ntype FieldbusItemsGroup = {\n type: 'c8y_Coil' | 'c8y_Register';\n label: string;\n items: (FieldbusCoil | FieldbusRegister)[];\n};\n\n@Component({\n selector: 'c8y-fieldbus-item-status-config',\n templateUrl: './fieldbus-item-status-config.component.html',\n imports: [CoreModule, CommonModule, C8yTranslatePipe, ReactiveFormsModule],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class FieldbusItemStatusConfigComponent implements OnInit, OnChanges, OnDestroy {\n @Input() config?: FieldbusItemStatusConfig;\n @Input() asset?: IManagedObject;\n\n resultTypes = RESULT_TYPES;\n formGroup: ReturnType<FieldbusItemStatusConfigComponent['createForm']>;\n groupedItems: FieldbusItemsGroup[] = [];\n private deviceType: FieldbusDeviceType;\n\n private fieldbusService = inject(FieldbusService);\n private formBuilder = inject(FormBuilder);\n private form = inject(NgForm);\n\n ngOnInit() {\n this.initForm();\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['asset'] && this.asset) {\n try {\n this.deviceType = await this.fieldbusService.getDeviceTypeOf(this.asset);\n this.buildGroupedItemsFromDeviceType();\n this.patchFormFromConfig();\n } catch (err) {\n this.deviceType = null;\n this.groupedItems = [];\n this.formGroup.reset();\n }\n }\n\n if (changes['config'] && this.config) {\n this.patchFormFromConfig();\n }\n }\n\n ngOnDestroy() {\n this.form.form.removeControl('config');\n }\n\n onBeforeSave(\n config?: FieldbusItemStatusConfig\n ): boolean | Promise<boolean> | Observable<boolean> {\n if (this.formGroup.valid) {\n Object.assign(config, this.formToConfig());\n return true;\n }\n return false;\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue({ item: null, resultType: RESULT_TYPES.RAW_VALUE.value });\n this.patchFormFromConfig();\n }\n\n private createForm() {\n return this.formBuilder.group({\n item: [null, [Validators.required]],\n resultType: ['', [Validators.required]]\n });\n }\n\n private formToConfig(): FieldbusItemStatusConfig {\n const formValue = this.formGroup.value;\n if (!formValue.item) return null;\n const item = formValue.item as FieldbusCoil | FieldbusRegister;\n const itemName = item.name;\n const itemType = this.groupedItems.find(g => g.items.includes(item))?.type;\n const resultType = formValue.resultType as keyof typeof RESULT_TYPES;\n return { itemName, itemType, resultType };\n }\n\n private patchFormFromConfig(): void {\n if (!this.config || !this.groupedItems.length || !this.formGroup) return;\n const { itemType, itemName, resultType } = this.config;\n let foundItem = null;\n for (const group of this.groupedItems) {\n foundItem = group.items.find(item => group.type === itemType && item.name === itemName);\n if (foundItem) break;\n }\n if (foundItem) {\n this.formGroup.patchValue({ item: foundItem, resultType });\n } else {\n this.formGroup.patchValue({ item: null, resultType: RESULT_TYPES.RAW_VALUE.value });\n }\n }\n\n private buildGroupedItemsFromDeviceType() {\n this.groupedItems = [];\n if (!this.deviceType) return;\n if (this.deviceType.c8y_Coils?.length) {\n this.groupedItems.push({\n type: 'c8y_Coil',\n label: gettext('Coils'),\n items: this.deviceType.c8y_Coils\n });\n }\n if (this.deviceType.c8y_Registers?.length) {\n this.groupedItems.push({\n type: 'c8y_Register',\n label: gettext('Registers'),\n items: this.deviceType.c8y_Registers\n });\n }\n }\n}\n","<form [formGroup]=\"formGroup\">\n <div class=\"d-flex-md row\">\n <div class=\"col-md-6\">\n <c8y-form-group style=\"padding-top: var(--c8y-font-size-base)\">\n <label for=\"fieldbusItem\">{{ 'Fieldbus item' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"fieldbusItem\"\n formControlName=\"item\"\n >\n @for (group of groupedItems; track group.label) {\n <optgroup [label]=\"group.label | translate\">\n @for (item of group.items; track item.name) {\n <option [ngValue]=\"item\">\n {{ item.name }}\n </option>\n }\n </optgroup>\n }\n </select>\n </div>\n <c8y-messages\n [show]=\"formGroup.controls?.item?.touched ? formGroup?.controls?.item?.errors : {}\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group style=\"padding-top: var(--c8y-font-size-base)\">\n <label for=\"resultType\">{{ 'Result type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"resultType\"\n formControlName=\"resultType\"\n >\n @for (resultType of resultTypes | keyvalue; track resultType.key) {\n <option [ngValue]=\"resultType.value.value\">\n {{ resultType.value.label | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n</form>\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-BqbzREl7.mjs","sources":["../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-config.component.ts","../../computed-asset-properties/fieldbus-item-status/fieldbus-item-status-config.component.html"],"sourcesContent":["import {\n Component,\n inject,\n Input,\n OnInit,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport {\n ControlContainer,\n FormBuilder,\n NgForm,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { IManagedObject } from '@c8y/client';\nimport { C8yTranslatePipe, CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n FieldbusCoil,\n FieldbusDeviceType,\n FieldbusItemStatusConfig,\n FieldbusRegister,\n RESULT_TYPES\n} from './fieldbus-item-status.model';\nimport { FieldbusService } from './fieldbus.service';\nimport { Observable } from 'rxjs';\n\ntype FieldbusItemsGroup = {\n type: 'c8y_Coil' | 'c8y_Register';\n label: string;\n items: (FieldbusCoil | FieldbusRegister)[];\n};\n\n@Component({\n selector: 'c8y-fieldbus-item-status-config',\n templateUrl: './fieldbus-item-status-config.component.html',\n imports: [CoreModule, CommonModule, C8yTranslatePipe, ReactiveFormsModule],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class FieldbusItemStatusConfigComponent implements OnInit, OnChanges, OnDestroy {\n @Input() config?: FieldbusItemStatusConfig;\n @Input() asset?: IManagedObject;\n\n resultTypes = RESULT_TYPES;\n formGroup: ReturnType<FieldbusItemStatusConfigComponent['createForm']>;\n groupedItems: FieldbusItemsGroup[] = [];\n private deviceType: FieldbusDeviceType;\n\n private fieldbusService = inject(FieldbusService);\n private formBuilder = inject(FormBuilder);\n private form = inject(NgForm);\n\n ngOnInit() {\n this.initForm();\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes['asset'] && this.asset) {\n try {\n this.deviceType = await this.fieldbusService.getDeviceTypeOf(this.asset);\n this.buildGroupedItemsFromDeviceType();\n this.patchFormFromConfig();\n } catch (err) {\n this.deviceType = null;\n this.groupedItems = [];\n this.formGroup.reset();\n }\n }\n\n if (changes['config'] && this.config) {\n this.patchFormFromConfig();\n }\n }\n\n ngOnDestroy() {\n this.form.form.removeControl('config');\n }\n\n onBeforeSave(\n config?: FieldbusItemStatusConfig\n ): boolean | Promise<boolean> | Observable<boolean> {\n if (this.formGroup.valid) {\n Object.assign(config, this.formToConfig());\n return true;\n }\n return false;\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue({ item: null, resultType: RESULT_TYPES.RAW_VALUE.value });\n this.patchFormFromConfig();\n }\n\n private createForm() {\n return this.formBuilder.group({\n item: [null, [Validators.required]],\n resultType: ['', [Validators.required]]\n });\n }\n\n private formToConfig(): FieldbusItemStatusConfig {\n const formValue = this.formGroup.value;\n if (!formValue.item) return null;\n const item = formValue.item as FieldbusCoil | FieldbusRegister;\n const itemName = item.name;\n const itemType = this.groupedItems.find(g => g.items.includes(item))?.type;\n const resultType = formValue.resultType as keyof typeof RESULT_TYPES;\n return { itemName, itemType, resultType };\n }\n\n private patchFormFromConfig(): void {\n if (!this.config || !this.groupedItems.length || !this.formGroup) return;\n const { itemType, itemName, resultType } = this.config;\n let foundItem = null;\n for (const group of this.groupedItems) {\n foundItem = group.items.find(item => group.type === itemType && item.name === itemName);\n if (foundItem) break;\n }\n if (foundItem) {\n this.formGroup.patchValue({ item: foundItem, resultType });\n } else {\n this.formGroup.patchValue({ item: null, resultType: RESULT_TYPES.RAW_VALUE.value });\n }\n }\n\n private buildGroupedItemsFromDeviceType() {\n this.groupedItems = [];\n if (!this.deviceType) return;\n if (this.deviceType.c8y_Coils?.length) {\n this.groupedItems.push({\n type: 'c8y_Coil',\n label: gettext('Coils'),\n items: this.deviceType.c8y_Coils\n });\n }\n if (this.deviceType.c8y_Registers?.length) {\n this.groupedItems.push({\n type: 'c8y_Register',\n label: gettext('Registers'),\n items: this.deviceType.c8y_Registers\n });\n }\n }\n}\n","<form [formGroup]=\"formGroup\">\n <div class=\"d-flex-md row\">\n <div class=\"col-md-6\">\n <c8y-form-group style=\"padding-top: var(--c8y-font-size-base)\">\n <label for=\"fieldbusItem\">{{ 'Fieldbus item' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"fieldbusItem\"\n formControlName=\"item\"\n >\n @for (group of groupedItems; track group.label) {\n <optgroup [label]=\"group.label | translate\">\n @for (item of group.items; track item.name) {\n <option [ngValue]=\"item\">\n {{ item.name }}\n </option>\n }\n </optgroup>\n }\n </select>\n </div>\n <c8y-messages\n [show]=\"formGroup.controls?.item?.touched ? formGroup?.controls?.item?.errors : {}\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group style=\"padding-top: var(--c8y-font-size-base)\">\n <label for=\"resultType\">{{ 'Result type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"resultType\"\n formControlName=\"resultType\"\n >\n @for (resultType of resultTypes | keyvalue; track resultType.key) {\n <option [ngValue]=\"resultType.value.value\">\n {{ resultType.value.label | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n</form>\n"],"names":["i1","i2","i3"],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DestroyRef, Input, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import * as i2 from '@angular/forms';
5
+ import { FormBuilder, NgForm, Validators, ControlContainer, ReactiveFormsModule } from '@angular/forms';
6
+ import * as i1 from '@c8y/ngx-components';
7
+ import { CoreModule, CommonModule, C8yTranslatePipe } from '@c8y/ngx-components';
8
+ import * as i3 from '@c8y/ngx-components/datapoint-selector';
9
+ import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
10
+ import * as i4 from 'ngx-bootstrap/popover';
11
+ import { PopoverModule } from 'ngx-bootstrap/popover';
12
+ import { R as RESULT_TYPES, D as DEFAULT_DECIMAL_PLACES } from './c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs';
13
+ import * as i2$1 from '@angular/common';
14
+
15
+ function exactlyASingleDatapointActive() {
16
+ return (control) => {
17
+ const datapoints = control.value;
18
+ if (!datapoints || !datapoints.length) {
19
+ return null;
20
+ }
21
+ const activeDatapoints = datapoints.filter(datapoint => datapoint.__active);
22
+ if (activeDatapoints.length === 1) {
23
+ return null;
24
+ }
25
+ return { exactlyOneDatapointNeedsToBeActive: true };
26
+ };
27
+ }
28
+ class ComputedPropertyLastMeasurementConfigComponent {
29
+ constructor() {
30
+ this.datapointSelectionConfig = {};
31
+ this.formBuilder = inject(FormBuilder);
32
+ this.form = inject(NgForm);
33
+ this.destroyRef = inject(DestroyRef);
34
+ this.selectedProperty = [];
35
+ this.minSelectCount = 1;
36
+ this.maxSelectCount = 1;
37
+ this.resultTypes = RESULT_TYPES;
38
+ }
39
+ ngOnInit() {
40
+ if (this.asset) {
41
+ this.datapointSelectionConfig.contextAsset = this.asset;
42
+ this.datapointSelectionConfig.allowChangingContext = false;
43
+ }
44
+ this.initForm();
45
+ }
46
+ onBeforeSave(config) {
47
+ if (this.formGroup.valid) {
48
+ const { formatAsNumericString, ...value } = this.formGroup.value;
49
+ Object.assign(config, value, { rawValue: !formatAsNumericString });
50
+ config.dp = config.dp.filter(d => d.__active);
51
+ config.dp[0].__target = { id: config.dp[0].__target.id, name: config.dp[0].__target.name };
52
+ return true;
53
+ }
54
+ return false;
55
+ }
56
+ initForm() {
57
+ this.formGroup = this.createForm();
58
+ this.form.form.addControl('config', this.formGroup);
59
+ this.formGroup.patchValue({ ...this.config, formatAsNumericString: !this.config?.rawValue });
60
+ const formatAsNumericString = this.formGroup.controls.formatAsNumericString;
61
+ this.setDecimalPlacesEnabled(formatAsNumericString.value);
62
+ formatAsNumericString.valueChanges
63
+ .pipe(takeUntilDestroyed(this.destroyRef))
64
+ .subscribe(enabled => this.setDecimalPlacesEnabled(enabled));
65
+ }
66
+ setDecimalPlacesEnabled(enabled) {
67
+ const decimalPlaces = this.formGroup.controls.numberOfDecimalPlaces;
68
+ if (enabled) {
69
+ decimalPlaces.enable({ emitEvent: false });
70
+ }
71
+ else {
72
+ decimalPlaces.disable({ emitEvent: false });
73
+ }
74
+ }
75
+ createForm() {
76
+ return this.formBuilder.group({
77
+ resultType: [this.resultTypes.VALUE.value, [Validators.required]],
78
+ // Stored inverted, as `LastMeasurementConfig.rawValue`.
79
+ formatAsNumericString: [true],
80
+ numberOfDecimalPlaces: [DEFAULT_DECIMAL_PLACES, [Validators.min(0), Validators.max(10)]],
81
+ dp: this.formBuilder.control(new Array(), [
82
+ Validators.required,
83
+ Validators.minLength(1),
84
+ exactlyASingleDatapointActive()
85
+ ])
86
+ });
87
+ }
88
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ComputedPropertyLastMeasurementConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
89
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: ComputedPropertyLastMeasurementConfigComponent, isStandalone: true, selector: "c8y-last-measurement-config", inputs: { config: "config", asset: "asset" }, ngImport: i0, template: "<form [formGroup]=\"formGroup\">\n <div class=\"d-flex-md row\">\n <div class=\"col-md-6\">\n <div\n class=\"form-group\"\n style=\"padding-top: var(--c8y-font-size-base)\"\n >\n <label for=\"resultType\">{{ 'Result type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"resultType\"\n formControlName=\"resultType\"\n >\n @for (type of resultTypes | keyvalue; track type.key) {\n <option [ngValue]=\"type.value.value\">\n {{ type.value.label | translate }}\n </option>\n }\n </select>\n </div>\n </div>\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Value format' | translate }}</legend>\n <div class=\"form-group\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Format as numeric string' | translate\"\n >\n <input\n name=\"formatAsNumericString\"\n type=\"checkbox\"\n formControlName=\"formatAsNumericString\"\n />\n <span></span>\n <span translate>Format as numeric string</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Rounds the value to the number of decimal places and returns it as text. Clear it to get the value exactly as the device sent it.'\n | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div class=\"form-group form-group-sm\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n for=\"numberOfDecimalPlaces\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n id=\"numberOfDecimalPlaces\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 2 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </fieldset>\n </div>\n <div class=\"col-md-6 no-card-context bg-component\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit\"\n name=\"dp\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"minSelectCount\"\n [maxActiveCount]=\"maxSelectCount\"\n formControlName=\"dp\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n</form>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i3.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle", "removeTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2$1.KeyValuePipe, name: "keyvalue" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ComputedPropertyLastMeasurementConfigComponent, decorators: [{
92
+ type: Component,
93
+ args: [{ selector: 'c8y-last-measurement-config', imports: [
94
+ CoreModule,
95
+ DatapointSelectorModule,
96
+ CommonModule,
97
+ C8yTranslatePipe,
98
+ ReactiveFormsModule,
99
+ PopoverModule
100
+ ], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], changeDetection: ChangeDetectionStrategy.Eager, template: "<form [formGroup]=\"formGroup\">\n <div class=\"d-flex-md row\">\n <div class=\"col-md-6\">\n <div\n class=\"form-group\"\n style=\"padding-top: var(--c8y-font-size-base)\"\n >\n <label for=\"resultType\">{{ 'Result type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"resultType\"\n formControlName=\"resultType\"\n >\n @for (type of resultTypes | keyvalue; track type.key) {\n <option [ngValue]=\"type.value.value\">\n {{ type.value.label | translate }}\n </option>\n }\n </select>\n </div>\n </div>\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Value format' | translate }}</legend>\n <div class=\"form-group\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Format as numeric string' | translate\"\n >\n <input\n name=\"formatAsNumericString\"\n type=\"checkbox\"\n formControlName=\"formatAsNumericString\"\n />\n <span></span>\n <span translate>Format as numeric string</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Rounds the value to the number of decimal places and returns it as text. Clear it to get the value exactly as the device sent it.'\n | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div class=\"form-group form-group-sm\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n for=\"numberOfDecimalPlaces\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n id=\"numberOfDecimalPlaces\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 2 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </fieldset>\n </div>\n <div class=\"col-md-6 no-card-context bg-component\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit\"\n name=\"dp\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"minSelectCount\"\n [maxActiveCount]=\"maxSelectCount\"\n formControlName=\"dp\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n</form>\n" }]
101
+ }], propDecorators: { config: [{
102
+ type: Input
103
+ }], asset: [{
104
+ type: Input
105
+ }] } });
106
+
107
+ export { ComputedPropertyLastMeasurementConfigComponent, exactlyASingleDatapointActive };
108
+ //# sourceMappingURL=c8y-ngx-components-computed-asset-properties-last-measurement-config.component-d3JeKEr4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c8y-ngx-components-computed-asset-properties-last-measurement-config.component-d3JeKEr4.mjs","sources":["../../computed-asset-properties/last-measurement/last-measurement-config.component.ts","../../computed-asset-properties/last-measurement/last-measurement-config.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n OnInit\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n ControlContainer,\n FormBuilder,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { IManagedObject } from '@c8y/client';\nimport { C8yTranslatePipe, CommonModule, CoreModule } from '@c8y/ngx-components';\nimport {\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { Observable } from 'rxjs';\nimport {\n DEFAULT_DECIMAL_PLACES,\n LastMeasurementConfig,\n RESULT_TYPES\n} from './last-measurement.model';\n\nexport function exactlyASingleDatapointActive(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const datapoints: KPIDetails[] = control.value;\n\n if (!datapoints || !datapoints.length) {\n return null;\n }\n\n const activeDatapoints = datapoints.filter(datapoint => datapoint.__active);\n\n if (activeDatapoints.length === 1) {\n return null;\n }\n\n return { exactlyOneDatapointNeedsToBeActive: true };\n };\n}\n\n@Component({\n selector: 'c8y-last-measurement-config',\n templateUrl: './last-measurement-config.component.html',\n imports: [\n CoreModule,\n DatapointSelectorModule,\n CommonModule,\n C8yTranslatePipe,\n ReactiveFormsModule,\n PopoverModule\n ],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class ComputedPropertyLastMeasurementConfigComponent implements OnInit {\n @Input() config?: LastMeasurementConfig;\n @Input() asset?: IManagedObject;\n formGroup: ReturnType<ComputedPropertyLastMeasurementConfigComponent['createForm']>;\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n\n private formBuilder = inject(FormBuilder);\n private form = inject(NgForm);\n private destroyRef = inject(DestroyRef);\n\n selectedProperty: IManagedObject[] = [];\n minSelectCount = 1;\n maxSelectCount = 1;\n resultTypes = RESULT_TYPES;\n\n ngOnInit() {\n if (this.asset) {\n this.datapointSelectionConfig.contextAsset = this.asset;\n this.datapointSelectionConfig.allowChangingContext = false;\n }\n this.initForm();\n }\n\n onBeforeSave(config?: LastMeasurementConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (this.formGroup.valid) {\n const { formatAsNumericString, ...value } = this.formGroup.value;\n Object.assign(config, value, { rawValue: !formatAsNumericString });\n config.dp = config.dp.filter(d => d.__active);\n config.dp[0].__target = { id: config.dp[0].__target.id, name: config.dp[0].__target.name };\n return true;\n }\n return false;\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue({ ...this.config, formatAsNumericString: !this.config?.rawValue });\n const formatAsNumericString = this.formGroup.controls.formatAsNumericString;\n this.setDecimalPlacesEnabled(formatAsNumericString.value);\n formatAsNumericString.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(enabled => this.setDecimalPlacesEnabled(enabled));\n }\n\n private setDecimalPlacesEnabled(enabled: boolean): void {\n const decimalPlaces = this.formGroup.controls.numberOfDecimalPlaces;\n if (enabled) {\n decimalPlaces.enable({ emitEvent: false });\n } else {\n decimalPlaces.disable({ emitEvent: false });\n }\n }\n\n private createForm() {\n return this.formBuilder.group({\n resultType: [this.resultTypes.VALUE.value, [Validators.required]],\n // Stored inverted, as `LastMeasurementConfig.rawValue`.\n formatAsNumericString: [true],\n numberOfDecimalPlaces: [DEFAULT_DECIMAL_PLACES, [Validators.min(0), Validators.max(10)]],\n dp: this.formBuilder.control(new Array<KPIDetails>(), [\n Validators.required,\n Validators.minLength(1),\n exactlyASingleDatapointActive()\n ])\n });\n }\n}\n","<form [formGroup]=\"formGroup\">\n <div class=\"d-flex-md row\">\n <div class=\"col-md-6\">\n <div\n class=\"form-group\"\n style=\"padding-top: var(--c8y-font-size-base)\"\n >\n <label for=\"resultType\">{{ 'Result type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"resultType\"\n formControlName=\"resultType\"\n >\n @for (type of resultTypes | keyvalue; track type.key) {\n <option [ngValue]=\"type.value.value\">\n {{ type.value.label | translate }}\n </option>\n }\n </select>\n </div>\n </div>\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Value format' | translate }}</legend>\n <div class=\"form-group\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Format as numeric string' | translate\"\n >\n <input\n name=\"formatAsNumericString\"\n type=\"checkbox\"\n formControlName=\"formatAsNumericString\"\n />\n <span></span>\n <span translate>Format as numeric string</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Rounds the value to the number of decimal places and returns it as text. Clear it to get the value exactly as the device sent it.'\n | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </div>\n <div class=\"form-group form-group-sm\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n for=\"numberOfDecimalPlaces\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n id=\"numberOfDecimalPlaces\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 2 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n </fieldset>\n </div>\n <div class=\"col-md-6 no-card-context bg-component\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit\"\n name=\"dp\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"minSelectCount\"\n [maxActiveCount]=\"maxSelectCount\"\n formControlName=\"dp\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n</form>\n"],"names":["i5"],"mappings":";;;;;;;;;;;;;;SAkCgB,6BAA6B,GAAA;IAC3C,OAAO,CAAC,OAAwB,KAA6B;AAC3D,QAAA,MAAM,UAAU,GAAiB,OAAO,CAAC,KAAK;QAE9C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACrC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC;AAE3E,QAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE;AACrD,IAAA,CAAC;AACH;MAgBa,8CAA8C,CAAA;AAd3D,IAAA,WAAA,GAAA;QAkBE,IAAA,CAAA,wBAAwB,GAA2C,EAAE;AAE7D,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAEvC,IAAA,CAAA,gBAAgB,GAAqB,EAAE;QACvC,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,WAAW,GAAG,YAAY;AAsD3B,IAAA;IApDC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,wBAAwB,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK;AACvD,YAAA,IAAI,CAAC,wBAAwB,CAAC,oBAAoB,GAAG,KAAK;QAC5D;QACA,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEA,IAAA,YAAY,CAAC,MAA8B,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,YAAA,MAAM,EAAE,qBAAqB,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAChE,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,qBAAqB,EAAE,CAAC;AAClE,YAAA,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;AAC7C,YAAA,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC1F,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5F,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB;AAC3E,QAAA,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACzD,QAAA,qBAAqB,CAAC;AACnB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAChE;AAEQ,IAAA,uBAAuB,CAAC,OAAgB,EAAA;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB;QACnE,IAAI,OAAO,EAAE;YACX,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC5C;aAAO;YACL,aAAa,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7C;IACF;IAEQ,UAAU,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5B,YAAA,UAAU,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;;YAEjE,qBAAqB,EAAE,CAAC,IAAI,CAAC;AAC7B,YAAA,qBAAqB,EAAE,CAAC,sBAAsB,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACxF,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,KAAK,EAAc,EAAE;AACpD,gBAAA,UAAU,CAAC,QAAQ;AACnB,gBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACvB,gBAAA,6BAA6B;aAC9B;AACF,SAAA,CAAC;IACJ;+GAlEW,8CAA8C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA9C,8CAA8C,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClE3D,g/FAuFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/BI,UAAU,8iEACV,uBAAuB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,+BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACvB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,aAAA,EAEA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAGxD,8CAA8C,EAAA,UAAA,EAAA,CAAA;kBAd1D,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,OAAA,EAE9B;wBACP,UAAU;wBACV,uBAAuB;wBACvB,YAAY;wBACZ,gBAAgB;wBAChB,mBAAmB;wBACnB;AACD,qBAAA,EAAA,aAAA,EACc,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,eAAA,EAClD,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,g/FAAA,EAAA;;sBAG7C;;sBACA;;;;;"}
@@ -1,2 +1,2 @@
1
- export { F as FieldbusService, c as computedAssetPropertiesProviders } from './c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs';
1
+ export { F as FieldbusService, c as computedAssetPropertiesProviders } from './c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-B0EYpohd.mjs';
2
2
  //# sourceMappingURL=c8y-ngx-components-computed-asset-properties.mjs.map
@@ -107,7 +107,7 @@ class DashboardVersionHistoryComponent {
107
107
  this.dashboardDetailService.revertToDashboardFn(newDashboard);
108
108
  }
109
109
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DashboardVersionHistoryComponent, deps: [{ token: i2.TranslateService }, { token: ContextDashboardService }, { token: DashboardDetailService }], target: i0.ɵɵFactoryTarget.Component }); }
110
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: DashboardVersionHistoryComponent, isStandalone: true, selector: "c8y-dashboard-version-history", ngImport: i0, template: "<div class=\"bg-component p-t-8 p-b-8 separator-bottom text-center\">\n <i\n class=\"text-info m-r-4\"\n c8yIcon=\"info\"\n ></i>\n {{\n versionHistoryLimitMessage\n | translate: { versionHistoryLimit: contextDashboardService.VERSION_HISTORY_SIZE_LIMIT }\n }}\n</div>\n<c8y-list-group class=\"p-t-24 p-b-24\">\n <c8y-li-timeline\n *ngFor=\"let dashboard of dashboardHistoryExtended; index as i\"\n [ngClass]=\"{ active: i === 0 }\"\n >\n {{ dashboard.created | date: 'mediumDate' }}\n {{ dashboard.created | date: 'shortTime' }}\n <c8y-li data-cy=\"c8y-dashboard-version-history--history-row\">\n <c8y-li-body>\n <div class=\"d-flex a-i-start\">\n <div class=\"flex-grow\">\n <span\n class=\"text-truncate-wrap\"\n title=\"{{ dashboard.descriptionText }}\"\n data-cy=\"c8y-dashboard-version-history--history-title\"\n >\n {{ dashboard.descriptionText }}\n {{\n dashboard.historyDescription.restored\n ? (restoredDashboardMessage\n | translate\n : {\n restoredStateCreationDate: dashboard.historyDescription.restored | c8yDate\n })\n : ''\n }}\n </span>\n <small\n class=\"text-muted\"\n title=\"{{ 'by`user`' | translate }} {{ dashboard.author }}\"\n *ngIf=\"dashboard.author\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"c8y-user\"></i>\n {{ dashboard.author }}\n </div>\n </small>\n </div>\n\n <span\n class=\"label label-primary m-l-auto\"\n title=\"{{ 'The last saved status of the dashboard' | translate }}\"\n *ngIf=\"i === 0\"\n >\n {{ 'Current`dashboard status`' | translate }}\n </span>\n <span\n class=\"m-l-auto showOnHover\"\n *ngIf=\"dashboardHistoryExtended.length > 1 && i > 0\"\n >\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Restore the dashboard to this status' | translate }}\"\n type=\"button\"\n (click)=\"revertDashboard(dashboard)\"\n >\n {{ 'Restore' | translate }}\n </button>\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n</c8y-list-group>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { 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: "component", type: i2$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2$1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2$1.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i2$1.DatePipe, name: "c8yDate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
110
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: DashboardVersionHistoryComponent, isStandalone: true, selector: "c8y-dashboard-version-history", ngImport: i0, template: "<div class=\"bg-component p-t-8 p-b-8 separator-bottom text-center\">\n <i\n class=\"text-info m-r-4\"\n c8yIcon=\"info\"\n ></i>\n {{\n versionHistoryLimitMessage\n | translate: { versionHistoryLimit: contextDashboardService.VERSION_HISTORY_SIZE_LIMIT }\n }}\n</div>\n<c8y-list-group class=\"p-t-24 p-b-24\">\n <c8y-li-timeline\n *ngFor=\"let dashboard of dashboardHistoryExtended; index as i\"\n [ngClass]=\"{ active: i === 0 }\"\n >\n {{ dashboard.created | date: 'mediumDate' }}\n {{ dashboard.created | date: 'shortTime' }}\n <c8y-li data-cy=\"c8y-dashboard-version-history--history-row\">\n <c8y-li-body>\n <div class=\"d-flex a-i-start\">\n <div class=\"flex-grow\">\n <span\n class=\"text-truncate-wrap\"\n title=\"{{ dashboard.descriptionText }}\"\n data-cy=\"c8y-dashboard-version-history--history-title\"\n >\n {{ dashboard.descriptionText }}\n {{\n dashboard.historyDescription.restored\n ? (restoredDashboardMessage\n | translate\n : {\n restoredStateCreationDate: dashboard.historyDescription.restored | c8yDate\n })\n : ''\n }}\n </span>\n <small\n class=\"text-muted\"\n title=\"{{ 'by`user`' | translate }} {{ dashboard.author }}\"\n *ngIf=\"dashboard.author\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"c8y-user\"></i>\n {{ dashboard.author }}\n </div>\n </small>\n </div>\n\n <span\n class=\"label label-primary m-l-auto\"\n title=\"{{ 'The last saved status of the dashboard' | translate }}\"\n *ngIf=\"i === 0\"\n >\n {{ 'Current`dashboard status`' | translate }}\n </span>\n <span\n class=\"m-l-auto showOnHover\"\n *ngIf=\"dashboardHistoryExtended.length > 1 && i > 0\"\n >\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Restore the dashboard to this status' | translate }}\"\n type=\"button\"\n (click)=\"revertDashboard(dashboard)\"\n >\n {{ 'Restore' | translate }}\n </button>\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n</c8y-list-group>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { 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: "component", type: i2$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable", "selectOnClick"], outputs: ["collapsedChange"] }, { kind: "component", type: i2$1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2$1.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i2$1.DatePipe, name: "c8yDate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
111
111
  }
112
112
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: DashboardVersionHistoryComponent, decorators: [{
113
113
  type: Component,
@@ -115,4 +115,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
115
115
  }], ctorParameters: () => [{ type: i2.TranslateService }, { type: ContextDashboardService }, { type: DashboardDetailService }] });
116
116
 
117
117
  export { DashboardVersionHistoryComponent };
118
- //# sourceMappingURL=c8y-ngx-components-context-dashboard-dashboard-version-history.component-Jyjkv4JT.mjs.map
118
+ //# sourceMappingURL=c8y-ngx-components-context-dashboard-dashboard-version-history.component-CP1afwVe.mjs.map