@c8y/ngx-components 1023.14.135 → 1023.14.138

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 (35) hide show
  1. package/datapoint-explorer/view/index.d.ts +8 -0
  2. package/datapoint-explorer/view/index.d.ts.map +1 -1
  3. package/datapoint-selector/index.d.ts +14 -1
  4. package/datapoint-selector/index.d.ts.map +1 -1
  5. package/echart/index.d.ts +2 -0
  6. package/echart/index.d.ts.map +1 -1
  7. package/echart/models/index.d.ts +1 -0
  8. package/echart/models/index.d.ts.map +1 -1
  9. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +33 -4
  10. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +24 -7
  12. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-echart.mjs +32 -10
  15. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +35 -5
  17. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components.mjs +4 -4
  19. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  20. package/index.d.ts +1 -0
  21. package/index.d.ts.map +1 -1
  22. package/locales/de.po +9 -0
  23. package/locales/es.po +9 -0
  24. package/locales/fr.po +9 -0
  25. package/locales/ja_JP.po +9 -0
  26. package/locales/ko.po +9 -0
  27. package/locales/locales.pot +9 -0
  28. package/locales/nl.po +9 -0
  29. package/locales/pl.po +9 -0
  30. package/locales/pt_BR.po +9 -0
  31. package/locales/zh_CN.po +9 -0
  32. package/locales/zh_TW.po +9 -0
  33. package/package.json +1 -1
  34. package/widgets/implementations/datapoints-graph/index.d.ts +8 -0
  35. package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { signal, inject, ViewChild, Input, Optional, Component } from '@angular/core';
3
3
  import * as i3 from '@angular/forms';
4
4
  import { FormBuilder, NgForm, Validators } from '@angular/forms';
5
+ import { MeasurementService, ALARM_STATUS_LABELS } from '@c8y/client';
5
6
  import * as i2 from '@c8y/ngx-components';
6
7
  import { GainsightService, CommonModule, CoreModule, FormsModule, WidgetTimeContextDateRangeService, AGGREGATION_ICONS, AGGREGATION_TEXTS, SelectComponent, SelectItemDirective, SelectedItemsDirective } from '@c8y/ngx-components';
7
8
  import * as i7 from '@c8y/ngx-components/alarm-event-selector';
@@ -18,11 +19,10 @@ import * as i5 from 'ngx-bootstrap/popover';
18
19
  import { PopoverModule } from 'ngx-bootstrap/popover';
19
20
  import * as i4 from 'ngx-bootstrap/tooltip';
20
21
  import { TooltipModule } from 'ngx-bootstrap/tooltip';
21
- import { Subject, takeUntil, BehaviorSubject } from 'rxjs';
22
+ import { Subject, takeUntil, filter, take, BehaviorSubject } from 'rxjs';
22
23
  import { A11yModule } from '@angular/cdk/a11y';
23
24
  import * as i5$1 from '@angular/common';
24
25
  import { CommonModule as CommonModule$1 } from '@angular/common';
25
- import { ALARM_STATUS_LABELS } from '@c8y/client';
26
26
  import * as i9 from '@c8y/ngx-components/alarms';
27
27
  import { AlarmsModule } from '@c8y/ngx-components/alarms';
28
28
  import { gettext } from '@c8y/ngx-components/gettext';
@@ -75,9 +75,11 @@ class DatapointsGraphWidgetConfigComponent {
75
75
  this.widgetConfigService = inject(WidgetConfigService);
76
76
  this.chartHelpersService = inject(ChartHelpersService);
77
77
  this.gainsightService = inject(GainsightService);
78
+ this.measurementService = inject(MeasurementService);
78
79
  this.datapointSelectDefaultFormOptions = {
79
80
  showRange: true,
80
- showChart: true
81
+ showChart: true,
82
+ showAdvancedChartOptions: false
81
83
  };
82
84
  this.datapointSelectionConfig = {};
83
85
  this.activeDatapointsExists = false;
@@ -99,6 +101,13 @@ class DatapointsGraphWidgetConfigComponent {
99
101
  const events = currentConfig.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'EVENT') || [];
100
102
  this.formGroup.patchValue({ ...currentConfig, alarms, events }, { emitEvent: false });
101
103
  this.isInitialized = true;
104
+ this.formGroup.controls.datapoints.valueChanges
105
+ .pipe(takeUntil(this.destroy$), filter(value => value.length > 0), take(1))
106
+ .subscribe(async (value) => {
107
+ const isMigrated = await this.detectTimeSeriesMigration(value[0]);
108
+ this.datapointSelectDefaultFormOptions.showAdvancedChartOptions = isMigrated;
109
+ this.formGroup.patchValue({ showAdvancedChartOptions: isMigrated }, { emitEvent: false });
110
+ });
102
111
  this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(formValue => {
103
112
  const { alarms, events, datapoints } = formValue;
104
113
  this._config.set({
@@ -117,7 +126,8 @@ class DatapointsGraphWidgetConfigComponent {
117
126
  yAxisSplitLines: formValue.yAxisSplitLines,
118
127
  xAxisSplitLines: formValue.xAxisSplitLines,
119
128
  numberOfDecimalPlaces: formValue.numberOfDecimalPlaces,
120
- aggregatedDatapoint: formValue.aggregatedDatapoint
129
+ aggregatedDatapoint: formValue.aggregatedDatapoint,
130
+ showAdvancedChartOptions: formValue.showAdvancedChartOptions
121
131
  });
122
132
  this.setActiveDatapointsExists();
123
133
  this.checkForMatchingDatapoints();
@@ -188,6 +198,25 @@ class DatapointsGraphWidgetConfigComponent {
188
198
  aggregatedDatapoint
189
199
  });
190
200
  }
201
+ /**
202
+ * DEPRECATED: to be removed when there is another way to identify time series migration.
203
+ * This method checks if the tenant is migrated to time series by making a call to measurement detail endpoint.
204
+ * If the endpoint returns 405, it means the tenant is migrated. This is a workaround for now until we have a
205
+ * better way to identify time series migration.
206
+ */
207
+ async detectTimeSeriesMigration(firstDp) {
208
+ const targetId = firstDp?.__target?.id;
209
+ if (!targetId) {
210
+ return false;
211
+ }
212
+ try {
213
+ await this.measurementService.detail(targetId);
214
+ return false;
215
+ }
216
+ catch (err) {
217
+ return err?.res?.status === 405;
218
+ }
219
+ }
191
220
  assignContextFromContextDashboard(datapoint) {
192
221
  if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {
193
222
  return;
@@ -231,7 +260,8 @@ class DatapointsGraphWidgetConfigComponent {
231
260
  yAxisSplitLines: [false, [Validators.required]],
232
261
  xAxisSplitLines: [false, [Validators.required]],
233
262
  numberOfDecimalPlaces: [2, [Validators.required, Validators.min(0), Validators.max(10)]],
234
- aggregatedDatapoint: [initialState?.aggregatedDatapoint || null]
263
+ aggregatedDatapoint: [initialState?.aggregatedDatapoint || null],
264
+ showAdvancedChartOptions: [false]
235
265
  });
236
266
  return form;
237
267
  }
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-widgets-implementations-datapoints-graph.mjs","sources":["../../widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.ts","../../widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.html","../../widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.ts","../../widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.html","../../widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.ts"],"sourcesContent":["import {\n Component,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { FormBuilder, NgForm, Validators } from '@angular/forms';\nimport {\n CommonModule,\n CoreModule,\n DynamicComponentAlertAggregator,\n DynamicComponentService,\n FormsModule,\n GainsightService,\n OnBeforeSave,\n WidgetTimeContextDateRangeService\n} from '@c8y/ngx-components';\nimport {\n AlarmDetails,\n AlarmEventSelectorModule,\n EventDetails,\n SelectedDatapoint\n} from '@c8y/ngx-components/alarm-event-selector';\nimport {\n ContextDashboardComponent,\n WidgetConfigComponent,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport {\n DatapointAttributesFormConfig,\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport {\n CHART_VIEW_CONTEXT,\n ChartAlarmsService,\n ChartEventsService,\n ChartHelpersService,\n ChartsComponent,\n DatapointsGraphKPIDetails,\n DatapointsGraphWidgetConfig,\n DatapointsGraphWidgetTimeProps,\n LEGEND_DISPLAY_OPTIONS,\n PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH\n} from '@c8y/ngx-components/echart';\nimport {\n GlobalContextWidgetWrapperComponent,\n WidgetControls\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { Subject, takeUntil } from 'rxjs';\nimport { Observable } from 'rxjs/internal/Observable';\n\n@Component({\n selector: 'c8y-datapoints-graph-widget-config',\n host: { class: 'd-contents' },\n templateUrl: './datapoints-graph-widget-config.component.html',\n standalone: true,\n imports: [\n CommonModule,\n CoreModule,\n FormsModule,\n TooltipModule,\n PopoverModule,\n ChartsComponent,\n DatapointSelectorModule,\n AlarmEventSelectorModule,\n GlobalContextWidgetWrapperComponent\n ],\n providers: [\n ChartEventsService,\n ChartAlarmsService,\n ChartHelpersService,\n WidgetTimeContextDateRangeService\n ]\n})\nexport class DatapointsGraphWidgetConfigComponent\n implements OnInit, OnChanges, OnBeforeSave, OnDestroy\n{\n private _config = signal<DatapointsGraphWidgetConfig>({} as DatapointsGraphWidgetConfig);\n private isFirstConfigSet = true;\n\n @Input() set config(value: DatapointsGraphWidgetConfig | undefined) {\n if (!value) return;\n\n if (this.isFirstConfigSet) {\n this._config.set({ ...value });\n this.isFirstConfigSet = false;\n } else {\n this._config.set({\n ...this._config(),\n dateFrom: value.dateFrom,\n dateTo: value.dateTo,\n interval: value.interval,\n refreshInterval: value.refreshInterval,\n isAutoRefreshEnabled: value.isAutoRefreshEnabled,\n aggregation: value.aggregation,\n realtime: value.realtime,\n displayMode: value.displayMode,\n refreshOption: value.refreshOption,\n dateTimeContext: value.dateTimeContext\n });\n }\n }\n\n get config(): DatapointsGraphWidgetConfig | undefined {\n return this._config();\n }\n\n @ViewChild('dataPointsGraphPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private readonly formBuilder = inject(FormBuilder);\n private readonly form = inject(NgForm);\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly chartHelpersService = inject(ChartHelpersService);\n private readonly gainsightService = inject(GainsightService);\n\n alerts: DynamicComponentAlertAggregator | undefined;\n formGroup: ReturnType<DatapointsGraphWidgetConfigComponent['initForm']>;\n datapointSelectDefaultFormOptions: Partial<DatapointAttributesFormConfig> = {\n showRange: true,\n showChart: true\n };\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n activeDatapointsExists = false;\n alarmsOrEventsHaveNoMatchingDps = false;\n widgetControls: WidgetControls;\n chartViewContext: CHART_VIEW_CONTEXT = CHART_VIEW_CONTEXT.WIDGET_CONFIG;\n legendDisplayOptions = LEGEND_DISPLAY_OPTIONS;\n private destroy$ = new Subject<void>();\n private isInitialized = false;\n\n constructor(\n @Optional() private widgetConfig: WidgetConfigComponent,\n @Optional() private dashboardContextComponent: ContextDashboardComponent,\n private dynamicComponentService: DynamicComponentService\n ) {\n this.formGroup = this.initForm();\n }\n\n async ngOnInit() {\n this.widgetControls =\n (await this.dynamicComponentService.getById(defaultWidgetIds.DATAPOINTS_GRAPH_NEW)).data\n ?.widgetControls || {};\n\n const currentConfig = this._config();\n currentConfig.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));\n\n this.form.form.addControl('config', this.formGroup);\n\n const alarms =\n currentConfig.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'ALARM') || [];\n const events =\n currentConfig.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'EVENT') || [];\n this.formGroup.patchValue({ ...currentConfig, alarms, events }, { emitEvent: false });\n this.isInitialized = true;\n\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(formValue => {\n const { alarms, events, datapoints } = formValue;\n\n this._config.set({\n ...this._config(),\n datapoints: datapoints || [],\n dataPointLegendDisplay: formValue.dataPointLegendDisplay,\n alarmsEventsConfigs: [...(alarms || []), ...(events || [])],\n displayMarkedLine: formValue.displayMarkedLine,\n displayMarkedPoint: formValue.displayMarkedPoint,\n mergeMatchingDatapoints: formValue.mergeMatchingDatapoints,\n forceMergeDatapoints: formValue.forceMergeDatapoints,\n setYaxisStartToZero: formValue.setYaxisStartToZero,\n smoothLines: formValue.smoothLines,\n showLabelAndUnit: formValue.showLabelAndUnit,\n showSlider: formValue.showSlider,\n yAxisSplitLines: formValue.yAxisSplitLines,\n xAxisSplitLines: formValue.xAxisSplitLines,\n numberOfDecimalPlaces: formValue.numberOfDecimalPlaces,\n aggregatedDatapoint: formValue.aggregatedDatapoint\n });\n\n this.setActiveDatapointsExists();\n this.checkForMatchingDatapoints();\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!changes.config || changes.config.isFirstChange() || !this.isInitialized) return;\n\n this.setActiveDatapointsExists();\n this.checkForMatchingDatapoints();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(\n config?: DatapointsGraphWidgetConfig\n ): boolean | Promise<boolean> | Observable<boolean> {\n if (!this.formGroup.valid || !config) return false;\n\n const snapshot = { ...this._config() };\n\n for (const key in snapshot) {\n if (snapshot.hasOwnProperty(key)) {\n try {\n config[key] = snapshot[key];\n } catch (e) {\n // do nothing\n }\n }\n }\n\n if (snapshot.alarmsEventsConfigs) {\n config.alarmsEventsConfigs = [...snapshot.alarmsEventsConfigs];\n }\n if (snapshot.datapoints) {\n config.datapoints = [...snapshot.datapoints];\n }\n\n this.widgetConfigService.updateConfig(snapshot, true);\n\n const configSummaryGS = this.chartHelpersService.getConfigSummaryForGainsight(config);\n this.gainsightService.triggerEvent(\n PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.EVENTS.DATA_EXPLORER_AND_GRAPH,\n {\n component: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.COMPONENTS.DATA_EXPLORER_DETAILS,\n action: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.ACTIONS.DATA_GRAPH_WIDGET_CONFIG,\n ...configSummaryGS\n }\n );\n\n return true;\n }\n\n updateTimeRangeOnRealtime(\n timeRange: Pick<DatapointsGraphWidgetConfig, 'dateFrom' | 'dateTo'>\n ): void {\n const current = this._config();\n this._config.set({\n ...current,\n ...timeRange,\n interval: current.interval || 'hours'\n });\n }\n\n updateDashboardTimeContext(timeProps: DatapointsGraphWidgetTimeProps): void {\n const dateTimeContext = {\n dateFrom: new Date(timeProps.dateFrom).toISOString(),\n dateTo: new Date(timeProps.dateTo).toISOString(),\n interval: timeProps.interval\n };\n this._config.set({\n ...this._config(),\n dateTimeContext\n });\n }\n\n updateAggregatedSliderDatapoint(selectedDatapoint: SelectedDatapoint | null): void {\n const aggregatedDatapoint = this.chartHelpersService.findMatchingDatapoint(\n this._config().datapoints || [],\n selectedDatapoint\n ) as DatapointsGraphKPIDetails | undefined;\n\n this._config.set({\n ...this._config(),\n aggregatedDatapoint\n });\n }\n\n private assignContextFromContextDashboard(datapoint: KPIDetails) {\n if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.widgetConfig?.context;\n if (context?.id) {\n const { name, id } = context;\n datapoint.__target = { name, id };\n this.datapointSelectionConfig.contextAsset = { id };\n }\n }\n\n private checkForMatchingDatapoints(): void {\n const config = this._config();\n const alarmsEventsConfigs = config.alarmsEventsConfigs || [];\n const datapoints = config.datapoints || [];\n\n const allMatch = alarmsEventsConfigs.every(ae =>\n datapoints.some(dp => dp.__target?.id === ae.__target?.id)\n );\n\n queueMicrotask(() => {\n this.alarmsOrEventsHaveNoMatchingDps = !allMatch;\n });\n }\n\n private initForm() {\n const initialState = this._config();\n\n const form = this.formBuilder.group({\n datapoints: [\n [] as DatapointsGraphKPIDetails[],\n [Validators.required, Validators.minLength(1)]\n ],\n dataPointLegendDisplay: ['auto', []],\n alarms: [[] as AlarmDetails[]],\n events: [[] as EventDetails[]],\n displayMarkedLine: [true, []],\n displayMarkedPoint: [true, []],\n mergeMatchingDatapoints: [true, []],\n forceMergeDatapoints: [false, []],\n setYaxisStartToZero: [false, []],\n smoothLines: [false, []],\n showLabelAndUnit: [true, []],\n displayAggregationSelection: [false, []],\n canDecoupleGlobalTimeContext: [false, []],\n showSlider: [true, [Validators.required]],\n yAxisSplitLines: [false, [Validators.required]],\n xAxisSplitLines: [false, [Validators.required]],\n numberOfDecimalPlaces: [2, [Validators.required, Validators.min(0), Validators.max(10)]],\n aggregatedDatapoint: [initialState?.aggregatedDatapoint || null]\n });\n return form;\n }\n\n private setActiveDatapointsExists() {\n const datapoints = this._config().datapoints || [];\n this.activeDatapointsExists = datapoints.filter(dp => dp.__active).length > 0;\n }\n}\n","<form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <div class=\"form-group form-group-sm\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label>\n {{ 'Data point legend display' | translate }}\n </label>\n <div\n class=\"c8y-select-wrapper\"\n [formGroup]=\"formGroup\"\n >\n <select\n class=\"form-control\"\n [title]=\"'Data point legend display' | translate\"\n id=\"dataPointLegendDisplay\"\n formControlName=\"dataPointLegendDisplay\"\n >\n @for (option of legendDisplayOptions; track option) {\n <option [ngValue]=\"option.value\">\n {{ option.label | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n</form>\n\n<form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n>\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [popover]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [popover]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Set Y-axis start to 0' | translate\"\n >\n <input\n name=\"setYaxisStartToZero\"\n type=\"checkbox\"\n formControlName=\"setYaxisStartToZero\"\n />\n <span></span>\n <span translate>Set Y-axis start to 0</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"\n 'Sets the Y-axis minimum to 0 for all data points with positive values. If any data point includes negative values, the axis may still extend below 0. Explicitly configured minimum and maximum values take precedence over this option.'\n | translate\n \"\n [popover]=\"\n 'Sets the Y-axis minimum to 0 for all data points with positive values. If any data point includes negative values, the axis may still extend below 0. Explicitly configured minimum and maximum values take precedence over this option.'\n | translate\n \"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n @if (alarmsOrEventsHaveNoMatchingDps) {\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n }\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n</form>\n\n<ng-template #dataPointsGraphPreview>\n @if (widgetControls) {\n <c8y-global-context-widget-wrapper\n [config]=\"config\"\n [displayMode]=\"'preview'\"\n [widgetControls]=\"widgetControls\"\n ></c8y-global-context-widget-wrapper>\n }\n\n @if (activeDatapointsExists) {\n <c8y-charts\n class=\"d-block p-relative\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n [chartViewContext]=\"chartViewContext\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (updateAggregatedSliderDatapoint)=\"updateAggregatedSliderDatapoint($event)\"\n ></c8y-charts>\n }\n\n @if (!activeDatapointsExists) {\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n data-cy=\"datapoints-graph-list--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-graph\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n }\n</ng-template>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, Input, OnDestroy, Optional, ViewChild } from '@angular/core';\nimport { ALARM_STATUS_LABELS, AlarmStatusType, SeveritySettings } from '@c8y/client';\nimport {\n AGGREGATION_ICONS,\n AGGREGATION_TEXTS,\n CoreModule,\n DynamicComponentAlertAggregator,\n DynamicComponentService,\n SelectableItem,\n SelectComponent,\n SelectItemDirective,\n SelectedItemsDirective,\n WidgetTimeContextDateRangeService\n} from '@c8y/ngx-components';\nimport { AlarmsModule } from '@c8y/ngx-components/alarms';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport type { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n AlarmDetailsExtended,\n AlarmOrEventExtended,\n CHART_VIEW_CONTEXT,\n ChartAlarmsService,\n ChartEventsService,\n ChartsComponent,\n DatapointsGraphKPIDetails,\n DatapointsGraphWidgetConfig,\n DatapointsGraphWidgetTimeProps,\n EventDetailsExtended,\n SelectableDatapoint,\n SeverityType\n} from '@c8y/ngx-components/echart';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GLOBAL_CONTEXT_EVENTS,\n GLOBAL_CONTEXT_SOURCE,\n GlobalContextEvent,\n GlobalContextWidgetWrapperComponent,\n REFRESH_OPTION,\n WidgetConfigMigrationService,\n WidgetControls\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep, merge } from 'lodash-es';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n@Component({\n selector: 'c8y-datapoints-graph-widget-view',\n templateUrl: './datapoints-graph-widget-view.component.html',\n standalone: true,\n imports: [\n A11yModule,\n CommonModule,\n ChartsComponent,\n CoreModule,\n TooltipModule,\n BsDropdownModule,\n PopoverModule,\n AlarmsModule,\n GlobalContextWidgetWrapperComponent,\n SelectComponent,\n SelectItemDirective,\n SelectedItemsDirective\n ],\n providers: [ChartEventsService, ChartAlarmsService, WidgetTimeContextDateRangeService]\n})\nexport class DatapointsGraphWidgetViewComponent implements OnDestroy {\n events: EventDetailsExtended[] = [];\n alarms: AlarmDetailsExtended[] = [];\n AGGREGATION_ICONS = AGGREGATION_ICONS;\n AGGREGATION_TEXTS = AGGREGATION_TEXTS;\n alerts: DynamicComponentAlertAggregator | undefined;\n datapointsOutOfSync = new Map<DatapointsGraphKPIDetails, boolean>();\n hasAtLeastOneDatapointActive = true;\n hasAtLeastOneAlarmActive = true;\n isMarkedAreaEnabled = false;\n loadedDatapoints: DatapointsGraphKPIDetails[] = [];\n loadedAlarmsOrEvents: AlarmOrEventExtended[] = [];\n isLoading$ = new BehaviorSubject<boolean>(false);\n isSliderBeingDragged$ = new BehaviorSubject<boolean>(false);\n /*\n * @description: The type of alarm that has marked area enabled.\n */\n enabledMarkedAreaAlarmType: string | undefined;\n chartViewContext = CHART_VIEW_CONTEXT.WIDGET_VIEW;\n\n widgetControls: WidgetControls;\n /** Combined number of datapoints, alarms, and events */\n totalLegendItems = 0;\n /** Selectable items for the datapoints, alarms, events dropdown */\n selectableItems: SelectableItem<SelectableDatapoint>[] = [];\n /** Selected items from the dropdown */\n selectedItems: SelectableItem<SelectableDatapoint>[] = [];\n\n @Input() set config(value: DatapointsGraphWidgetConfig) {\n // Special case: sync the config with migrated values.\n // This is needed to reflect migrated states in the widget config.\n const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(value);\n const newConfig = merge(value, migratedConfig);\n this.displayConfig = cloneDeep(newConfig);\n }\n get config(): never {\n throw Error(\n '\"config\" property should not be referenced in view component to avoid mutating data.'\n );\n }\n @ViewChild(GlobalContextWidgetWrapperComponent) wrapper?: GlobalContextWidgetWrapperComponent;\n @ViewChild(ChartsComponent) chartComponent!: ChartsComponent;\n displayConfig: DatapointsGraphWidgetConfig | undefined;\n legendHelp = this.translate.instant(\n gettext(`<ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <li>\n <b>Visibility:</b>\n use visibility icon to toggle datapoint, alarm or event visibility on chart. At least one datapoint is required to display chart.\n </li>\n <li>\n <b>Alarm details</b>\n Click alarm legend item to highlight area between alarm raised timestamp and alarm cleared timestamp.\n You can also click alarm markline on chart to highlight alarm and to pause tooltip. Click on highlighted area or legend item to cancel highlighting.\n </li>\n </ul>`)\n );\n readonly disableZoomInLabel = gettext('Disable zoom in');\n readonly enableZoomInLabel = gettext(\n 'Click to enable zoom, then click and drag on the desired area in the chart.'\n );\n readonly hideDatapointLabel = gettext('Hide data point');\n readonly showDatapointLabel = gettext('Show data point');\n private destroy$ = new Subject<void>();\n private readonly widgetInstanceId = crypto.randomUUID();\n\n constructor(\n private translate: TranslateService,\n @Optional() private dashboardContextComponent: ContextDashboardComponent,\n private dynamicComponentService: DynamicComponentService,\n private widgetConfigMigrationService: WidgetConfigMigrationService,\n private widgetTimeContextDateRangeService: WidgetTimeContextDateRangeService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n this.displayConfig?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));\n this.displayConfig.isRealtimeEnabled = this.displayConfig.realtime;\n\n this.totalLegendItems =\n (this.displayConfig?.datapoints?.length || 0) +\n (this.displayConfig?.alarmsEventsConfigs?.length || 0);\n\n this.loadedDatapoints = (this.displayConfig?.datapoints || []).filter(dp => dp.__active);\n this.loadedAlarmsOrEvents = (this.displayConfig?.alarmsEventsConfigs || []).filter(\n aOrE => aOrE.__active && !aOrE.__hidden\n );\n if (this.totalLegendItems > 5 || this.displayConfig?.dataPointLegendDisplay === 'dropdown') {\n this.selectableItems = this.buildSelectableItems();\n // Initialize selectedItems with the currently active items\n this.selectedItems = this.selectableItems.filter(item => {\n if (item.value.type === 'DATAPOINT') {\n return !!item.value.original.__active;\n } else {\n return item.value.original.__active && !item.value.original.__hidden;\n }\n });\n }\n\n this.widgetControls =\n (await this.dynamicComponentService.getById(defaultWidgetIds.DATAPOINTS_GRAPH_NEW)).data\n ?.widgetControls || {};\n }\n\n onGlobalContextChange(event: GlobalContextEvent) {\n this.invalidateHiddenItemsCache();\n const { context, diff } = event;\n const { dateTimeContext } = context;\n const { dateFrom, dateTo, interval } = dateTimeContext;\n\n const isRealtimeEnabled =\n context.refreshOption === REFRESH_OPTION.LIVE &&\n context.isAutoRefreshEnabled &&\n context.refreshInterval === 5000;\n\n if (this.displayConfig.displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n const realtimeToggled = this.displayConfig?.realtime !== isRealtimeEnabled;\n\n if (realtimeToggled) {\n // When toggling realtime, we must:\n // 1. Spread ALL context properties (isAutoRefreshEnabled, refreshOption, etc.)\n // to keep the GC wrapper in sync. Otherwise stale isAutoRefreshEnabled on\n // displayConfig causes the wrapper's handleConfigChange() to silently\n // re-enable auto-refresh via setAutoRefreshEnabled() on the inline component.\n // 2. Use chart's actual visible range from dataZoom to avoid date jump.\n // GC's dateTimeContext dates don't match the chart's visible range — the chart\n // slides forward every 1s via ChartRealtimeService independently of GC.\n // 3. Return early to skip updateInitialTimeRange(null) which resets cached time range.\n const option = this.chartComponent?.echartsInstance?.getOption();\n const dataZoom = (option?.dataZoom as any[])?.[0];\n const chartDateFrom = dataZoom?.startValue\n ? new Date(dataZoom.startValue).toISOString()\n : dateFrom;\n const chartDateTo = dataZoom?.endValue ? new Date(dataZoom.endValue).toISOString() : dateTo;\n\n this.displayConfig = {\n ...this.displayConfig,\n ...structuredClone(context),\n dateFrom: new Date(chartDateFrom),\n dateTo: new Date(chartDateTo),\n dateTimeContext: {\n ...context.dateTimeContext,\n dateFrom: chartDateFrom,\n dateTo: chartDateTo\n },\n realtime: isRealtimeEnabled\n };\n return;\n }\n\n this.displayConfig = {\n ...this.displayConfig,\n ...structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval,\n realtime: isRealtimeEnabled\n };\n\n if (this.isSliderBeingDragged$.value === true) {\n this.isSliderBeingDragged$.next(false);\n return;\n }\n\n this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);\n return;\n }\n\n if (this.displayConfig?.realtime !== isRealtimeEnabled) {\n // Sync dates to avoid jumps in the chart\n this.displayConfig = merge(this.displayConfig, {\n dateTimeContext: structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval\n });\n\n this.displayConfig = {\n ...this.displayConfig,\n realtime: isRealtimeEnabled\n };\n }\n\n // Realtime is a special case, we need to block \"automatic\" emissions from the global context\n // GC in auto mode emits every 5 seconds. We only want to react to user changes.\n if (\n isRealtimeEnabled &&\n diff?.dateTimeContext &&\n Object.keys(diff).length === 1 &&\n Object.keys(diff.dateTimeContext).length === 2\n ) {\n // Sync dates to avoid jumps in the chart\n this.displayConfig = merge(this.displayConfig, {\n dateTimeContext: structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval\n });\n return;\n }\n\n this.displayConfig = {\n ...this.displayConfig,\n ...structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval\n };\n\n if (\n context.source === GLOBAL_CONTEXT_SOURCE.DASHBOARD &&\n this.displayConfig.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n ) {\n this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n updateDashboardTimeContext(timeProps: DatapointsGraphWidgetTimeProps): void {\n const chartOptions = this.chartComponent?.echartsInstance?.getOption();\n const isEndZoomChanged = chartOptions?.dataZoom[0]?.end !== 100;\n\n // Check if widget is linked to global context\n const linkStatus = this.wrapper?.globalContextInlineComponent?.controlLinkStatus();\n const isLinked = !linkStatus || Object.values(linkStatus).every(v => v !== false);\n\n if (this.displayConfig.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && isLinked) {\n const dateTimeContext = isEndZoomChanged\n ? {\n dateFrom: new Date(timeProps.dateFrom).toISOString(),\n dateTo: new Date(timeProps.dateTo).toISOString(),\n interval: timeProps.interval\n }\n : { dateFrom: new Date(timeProps.dateFrom).toISOString(), interval: timeProps.interval };\n\n window.dispatchEvent(\n new CustomEvent(GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY, {\n detail: {\n type: GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY,\n payload: {\n dateTimeContext,\n isAutoRefreshEnabled: false,\n aggregation: this.displayConfig.aggregation,\n source: GLOBAL_CONTEXT_SOURCE.WIDGET,\n eventSourceId: this.widgetInstanceId\n },\n timestamp: Date.now()\n }\n })\n );\n } else {\n this.isSliderBeingDragged$.next(true);\n const dateTimeContext = {\n dateFrom: new Date(timeProps.dateFrom),\n dateTo: new Date(timeProps.dateTo),\n interval: timeProps.interval\n };\n\n // Update displayConfig for internal state\n this.displayConfig = {\n ...this.displayConfig,\n dateTimeContext: structuredClone(dateTimeContext) as any,\n dateFrom: new Date(timeProps.dateFrom),\n dateTo: new Date(timeProps.dateTo),\n interval: timeProps.interval,\n realtime: false,\n isAutoRefreshEnabled: false\n };\n\n // Trigger wrapper to update its internal state\n this.wrapper.pauseAutoRefresh();\n this.wrapper.updateDateTimeContext(dateTimeContext);\n }\n }\n\n buildSelectableItems(): SelectableItem<SelectableDatapoint>[] {\n const dpItems: SelectableItem<SelectableDatapoint>[] = (\n this.displayConfig.datapoints || []\n ).map(dp => {\n return {\n label: dp.label,\n value: {\n type: 'DATAPOINT',\n original: dp\n }\n };\n });\n\n const alarmItems: SelectableItem<SelectableDatapoint>[] = (\n this.displayConfig.alarmsEventsConfigs || []\n )\n .filter(ae => ae.timelineType === 'ALARM')\n .map(alarm => {\n return {\n label: alarm.label,\n value: {\n type: 'ALARM',\n original: alarm\n }\n };\n });\n\n const eventItems: SelectableItem<SelectableDatapoint>[] = (\n this.displayConfig.alarmsEventsConfigs || []\n )\n .filter(ae => ae.timelineType === 'EVENT')\n .map(event => {\n return {\n label: event.label,\n value: {\n type: 'EVENT',\n original: event\n }\n };\n });\n\n return [...dpItems, ...alarmItems, ...eventItems];\n }\n\n onItemSelected(item: SelectableItem<SelectableDatapoint>): void {\n if (item.value.type === 'DATAPOINT') {\n this.toggleChart(item.value.original as DatapointsGraphKPIDetails);\n } else {\n this.toggleAlarmEventType(item.value.original as AlarmOrEventExtended);\n }\n }\n\n onItemDeselected(item: SelectableItem<SelectableDatapoint>): void {\n if (item.value.type === 'DATAPOINT') {\n this.toggleChart(item.value.original as DatapointsGraphKPIDetails);\n } else {\n this.toggleAlarmEventType(item.value.original as AlarmOrEventExtended);\n }\n }\n\n toggleChart(datapoint: DatapointsGraphKPIDetails): void {\n if (\n this.displayConfig?.datapoints?.filter(dp => dp.__active).length === 1 &&\n datapoint.__active\n ) {\n // at least 1 datapoint should be active\n this.hasAtLeastOneDatapointActive = false;\n this.updateSelectedItems();\n return;\n }\n datapoint.__active = !datapoint.__active;\n this.hasAtLeastOneDatapointActive = true;\n\n this.updateSelectedItems();\n\n const getDatapointId = (dp: DatapointsGraphKPIDetails) =>\n `${dp.__target?.id}${dp.fragment}${dp.series}`;\n const isLoaded = this.loadedDatapoints.find(\n dp => getDatapointId(dp) === getDatapointId(datapoint)\n );\n\n if (datapoint.__active && !isLoaded) {\n // Datapoint being shown but not loaded (or data is stale) - trigger full reload\n this.loadedDatapoints.push(datapoint);\n this.displayConfig = { ...this.displayConfig };\n } else {\n // Datapoint already loaded with fresh data OR being hidden - just toggle visibility in echarts\n this.chartComponent.toggleDatapointSeriesVisibility(datapoint);\n }\n }\n\n handleDatapointOutOfSync(dpOutOfSync: DatapointsGraphKPIDetails): void {\n const key = (dp: KPIDetails) => dp.__target?.id + dp.fragment + dp.series;\n const dpMatch = this.displayConfig?.datapoints?.find(dp => key(dp) === key(dpOutOfSync));\n if (!dpMatch) {\n return;\n }\n this.datapointsOutOfSync.set(dpMatch, true);\n }\n\n toggleMarkedArea(alarm: AlarmDetailsExtended): void {\n this.enabledMarkedAreaAlarmType = alarm.filters.type;\n const params = {\n data: {\n itemType: alarm.filters.type\n }\n };\n this.chartComponent.onChartClick(params);\n }\n\n toggleAlarmEventType(alarmOrEvent: AlarmOrEventExtended): void {\n const type = alarmOrEvent.filters.type;\n const deviceId = alarmOrEvent.__target?.id;\n const newHiddenState = !alarmOrEvent.__hidden;\n const isBeingShown = !newHiddenState;\n\n // Match by both type AND device to distinguish alarms from different devices\n const isSameAlarmConfig = (ae: AlarmOrEventExtended) =>\n ae.filters.type === type && ae.__target?.id === deviceId;\n\n // Update __hidden in all locations\n alarmOrEvent.__hidden = newHiddenState;\n this.displayConfig.alarmsEventsConfigs?.forEach(ae => {\n if (isSameAlarmConfig(ae)) {\n ae.__hidden = newHiddenState;\n }\n });\n this.alarms.forEach(alarm => {\n if (isSameAlarmConfig(alarm)) {\n alarm.__hidden = newHiddenState;\n }\n });\n this.events.forEach(event => {\n if (isSameAlarmConfig(event)) {\n event.__hidden = newHiddenState;\n }\n });\n\n this.updateSelectedItems();\n\n const isLoaded = this.loadedAlarmsOrEvents.find(aOrE => isSameAlarmConfig(aOrE));\n\n if (isBeingShown && !isLoaded) {\n // Showing but not loaded - trigger pipeline to fetch data\n this.loadedAlarmsOrEvents.push(alarmOrEvent);\n this.displayConfig = { ...this.displayConfig };\n } else {\n // Hiding OR showing already-loaded - just toggle visibility in echarts\n this.chartComponent.toggleAlarmEventSeriesVisibility(alarmOrEvent);\n }\n }\n\n updateAlarmsAndEvents(alarmsEventsConfigs: AlarmOrEventExtended[]): void {\n this.alarms = alarmsEventsConfigs.filter(\n alarm => alarm.timelineType === 'ALARM'\n ) as AlarmDetailsExtended[];\n this.events = alarmsEventsConfigs.filter(\n event => event.timelineType === 'EVENT'\n ) as EventDetailsExtended[];\n if (this.alarms.length === 0 || !this.alarms.find(alarm => alarm.__active)) {\n this.hasAtLeastOneAlarmActive = false;\n }\n }\n\n filterSeverity(eventTarget: any): void {\n this.alarms = this.alarms.map(alarm => {\n if (!alarm.__severity) {\n alarm.__severity = [];\n }\n alarm.__severity = Object.keys(eventTarget.severityOptions).filter(\n (severity): severity is keyof SeveritySettings =>\n eventTarget.severityOptions[severity as keyof SeveritySettings]\n ) as SeverityType[];\n\n if (!alarm.__status) {\n alarm.__status = [];\n }\n const statuses = Object.keys(ALARM_STATUS_LABELS) as AlarmStatusType[];\n const filteredStatuses = eventTarget.showCleared\n ? statuses\n : statuses.filter(status => status !== 'CLEARED');\n alarm.__status = filteredStatuses;\n return alarm;\n });\n this.displayConfig = { ...this.displayConfig };\n }\n\n isLastActiveDatapoint(selectedItem: SelectableItem<SelectableDatapoint>): boolean {\n if (!selectedItem) {\n return false;\n }\n\n if (!selectedItem?.value || selectedItem.value.type !== 'DATAPOINT') {\n return false;\n }\n // Check if this is the last active datapoint\n return !this.hasAtLeastOneDatapointActive && selectedItem.value.original.__active;\n }\n\n private updateSelectedItems(): void {\n const filtered = this.selectableItems.filter(item => {\n if (item.value.type === 'DATAPOINT') {\n return !!item.value.original.__active;\n } else {\n return item.value.original.__active && !item.value.original.__hidden;\n }\n });\n this.selectedItems = [...filtered];\n this.cdr.detectChanges();\n }\n\n private assignContextFromContextDashboard(\n dpOrAlarmOrEvent: KPIDetails | AlarmOrEventExtended\n ): void {\n if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.dashboardContextComponent?.context;\n if (context?.id) {\n const { name, id } = context;\n dpOrAlarmOrEvent.__target = { name, id };\n }\n }\n\n /**\n * Remove hidden items from loaded cache so they will be reloaded when toggled visible.\n * Called when context changes (time range, aggregation, etc.) to mark hidden items data as stale.\n */\n private invalidateHiddenItemsCache(): void {\n this.loadedDatapoints = this.loadedDatapoints.filter(dp => dp.__active);\n this.loadedAlarmsOrEvents = this.loadedAlarmsOrEvents.filter(\n aOrE => aOrE.__active && !aOrE.__hidden\n );\n }\n}\n","@if (widgetControls) {\n <c8y-global-context-widget-wrapper\n [widgetControls]=\"widgetControls\"\n [isLoading]=\"isLoading$ | async\"\n [config]=\"displayConfig\"\n [disableRefreshEmits]=\"true\"\n (globalContextChange)=\"onGlobalContextChange($event)\"\n ></c8y-global-context-widget-wrapper>\n}\n<div\n class=\"p-l-16 p-r-16\"\n style=\"min-height: 34px\"\n>\n <div class=\"d-flex gap-16 a-i-center\">\n @if (hasAtLeastOneAlarmActive) {\n <c8y-alarms-filter\n class=\"d-contents form-group-sm min-width-0\"\n (onFilterApplied)=\"filterSeverity($event)\"\n ></c8y-alarms-filter>\n }\n @if (displayConfig?.datapoints.length > 0) {\n <div class=\"d-flex a-i-center min-width-0\">\n @if (\n displayConfig.dataPointLegendDisplay === 'dropdown' ||\n (displayConfig.dataPointLegendDisplay === 'auto' && totalLegendItems > 5)\n ) {\n <c8y-select\n class=\"min-width-0 c8y-select-v2--sm\"\n aria-label=\"Select datapoints, alarms or events\"\n [placeholder]=\"'Select datapoints, alarms or events' | translate\"\n [multi]=\"true\"\n [filterItems]=\"true\"\n [(ngModel)]=\"selectedItems\"\n (onSelect)=\"onItemSelected($event)\"\n (onDeselect)=\"onItemDeselected($event)\"\n >\n @for (item of selectableItems; track item.value) {\n <div\n class=\"d-flex a-i-center gap-4\"\n *c8ySelectItem=\"item.value; label: item.label\"\n >\n @if (\n !hasAtLeastOneDatapointActive &&\n item.value.type === 'DATAPOINT' &&\n item.value.original.__active\n ) {\n <i\n class=\"text-warning m-r-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 data point must be active.' | translate\"\n container=\"body\"\n data-cy=\"datapoint-warning-icon\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n @if (item.value.type === 'DATAPOINT') {\n <span\n class=\"circle-icon-wrapper a-s-start circle-icon-wrapper--small\"\n [style.background-color]=\"item.value.original.color\"\n ></span>\n }\n @if (item.value.type === 'ALARM') {\n <span\n class=\"circle-icon-wrapper a-s-start circle-icon-wrapper--small\"\n [style.background-color]=\"item.value.original.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n }\n @if (item.value.type === 'EVENT') {\n <span\n class=\"circle-icon-wrapper a-s-start circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': item.value.original.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"online1\"\n ></i>\n </span>\n }\n <span class=\"text-truncate d-col\">\n <small class=\"text-truncate\">{{ item.value.original.label }}</small>\n <span class=\"text-muted text-10\">{{ item.value.original.__target?.name }}</span>\n </span>\n </div>\n }\n <span\n class=\"tag tag--info chip\"\n title=\"{{ selectedItem.label }}\"\n *c8ySelectedItems=\"let selectedItem\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ selectedItem.label }}\"\n type=\"button\"\n (click)=\"\n $event.preventDefault(); $event.stopPropagation(); onItemDeselected(selectedItem)\n \"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n @if (isLastActiveDatapoint(selectedItem)) {\n <i\n class=\"text-warning a-s-start\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 data point must be active.' | translate\"\n container=\"body\"\n data-cy=\"datapoint-warning-icon\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n @if (selectedItem.value.type === 'DATAPOINT') {\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [style.background-color]=\"selectedItem.value?.original.color || ''\"\n ></span>\n }\n @if (selectedItem.value?.type === 'ALARM') {\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [style.background-color]=\"selectedItem.value?.original.color || ''\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n }\n @if (selectedItem.value?.type === 'EVENT') {\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{\n 'background-color': selectedItem.value?.original.color || ''\n }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"online1\"\n ></i>\n </span>\n }\n </span>\n </c8y-select>\n } @else {\n <div class=\"inner-scroll\">\n <div class=\"p-t-4 d-flex a-i-start gap-8\">\n @for (datapoint of displayConfig.datapoints; track datapoint) {\n @if (datapoint.retrievalError) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'Data point no longer exists.' | translate\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></i>\n } @else {\n <div\n class=\"c8y-datapoint-pill pill--sm flex-no-shrink\"\n title=\"{{ datapoint.label }} - {{ datapoint.__target.name }}\"\n [ngClass]=\"{ active: datapoint.__active }\"\n >\n @if (!hasAtLeastOneDatapointActive && datapoint.__active) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 data point must be active.' | translate\"\n container=\"body\"\n data-cy=\"datapoint-warning-icon\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n <button\n class=\"c8y-datapoint-pill__btn\"\n title=\"{{\n (datapoint.__active ? hideDatapointLabel : showDatapointLabel) | translate\n }} \"\n type=\"button\"\n data-cy=\"datapoint-toggle-visibility-btn\"\n (click)=\"toggleChart(datapoint)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"datapoint.__active ? 'eye text-primary' : 'eye-slash text-muted'\"\n ></i>\n </button>\n <div class=\"c8y-datapoint-pill__label c8y-datapoint-pill__btn\">\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [ngStyle]=\"{\n color: datapoint.color\n }\"\n ></i>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': !datapoint.__active }\"\n >\n <span class=\"text-truncate text-bold\">\n {{ datapoint.label }}\n </span>\n <small class=\"text-muted text-10\">\n {{ datapoint.__target.name }}\n </small>\n </span>\n @if (datapointsOutOfSync.get(datapoint)) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Measurements received for this data point may be out of sync.'\n | translate\n \"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n </div>\n </div>\n }\n }\n\n @for (alarm of alarms; track alarm) {\n <div\n class=\"c8y-alarm-pill pill--sm flex-no-shrink\"\n title=\"{{ alarm.filters.type }} \"\n >\n @if (displayConfig?.activeAlarmTypesOutOfRange?.includes(alarm.filters.type)) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Alarm of this type is currently active and outside of the selected time range'\n | translate\n \"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n <button\n class=\"c8y-alarm-pill__btn\"\n title=\"{{ alarm.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(alarm)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n alarm.__hidden || !alarm.__active\n ? 'eye-slash text-muted'\n : 'eye text-primary'\n \"\n ></i>\n </button>\n <button\n class=\"c8y-alarm-pill__label c8y-alarm-pill__btn\"\n (click)=\"toggleMarkedArea(alarm)\"\n [ngClass]=\"{\n active:\n !isMarkedAreaEnabled && alarm.filters.type === enabledMarkedAreaAlarmType\n }\"\n >\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [style.background-color]=\"alarm.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': alarm.__hidden }\"\n >\n <span class=\"text-truncate text-bold\">\n {{ alarm.label || alarm.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ alarm.__target.name }}\n </small>\n </span>\n </button>\n </div>\n }\n\n @for (event of events; track event) {\n <div\n class=\"c8y-event-pill pill--sm flex-no-shrink\"\n title=\"{{ event.filters.type }}\"\n >\n <button\n class=\"c8y-event-pill__btn\"\n title=\"{{ event.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(event)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n event.__hidden || !event.__active\n ? 'eye-slash text-muted'\n : 'eye text-primary'\n \"\n ></i>\n </button>\n <div class=\"c8y-event-pill__label c8y-event-pill__btn\">\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [ngStyle]=\"{ 'background-color': event.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"online1\"\n ></i>\n </span>\n <span\n class=\"text-truncate text-bold\"\n [ngClass]=\"{ 'text-muted': event.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ event.label || event.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ event.__target.name }}\n </small>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n <button\n class=\"btn-help btn-help--sm m-r-8\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"legendHelpTemplate\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"true\"\n ></button>\n }\n </div>\n }\n <button\n class=\"btn btn-default btn-sm flex-no-shrink m-l-auto\"\n [attr.aria-label]=\"'Save as image' | translate\"\n tooltip=\"{{ 'Save as image' | translate }}\"\n container=\"body\"\n type=\"button\"\n (click)=\"chartComponent.saveAsImage()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"image-file-checked\"\n ></i>\n </button>\n </div>\n</div>\n\n@if (displayConfig !== null) {\n <c8y-charts\n #chart\n [config]=\"displayConfig\"\n [alerts]=\"alerts\"\n [chartViewContext]=\"chartViewContext\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (finishLoading)=\"this.isLoading$.next($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n ></c8y-charts>\n}\n\n<ng-template #legendHelpTemplate>\n <div [innerHTML]=\"legendHelp\"></div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i4","CommonModule","i5","i6","i7","i8"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-widgets-implementations-datapoints-graph.mjs","sources":["../../widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.ts","../../widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.html","../../widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.ts","../../widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.html","../../widgets/implementations/datapoints-graph/c8y-ngx-components-widgets-implementations-datapoints-graph.ts"],"sourcesContent":["import {\n Component,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { FormBuilder, NgForm, Validators } from '@angular/forms';\nimport { MeasurementService } from '@c8y/client';\nimport {\n CommonModule,\n CoreModule,\n DynamicComponentAlertAggregator,\n DynamicComponentService,\n FormsModule,\n GainsightService,\n OnBeforeSave,\n WidgetTimeContextDateRangeService\n} from '@c8y/ngx-components';\nimport {\n AlarmDetails,\n AlarmEventSelectorModule,\n EventDetails,\n SelectedDatapoint\n} from '@c8y/ngx-components/alarm-event-selector';\nimport {\n ContextDashboardComponent,\n WidgetConfigComponent,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport {\n DatapointAttributesFormConfig,\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport {\n CHART_VIEW_CONTEXT,\n ChartAlarmsService,\n ChartEventsService,\n ChartHelpersService,\n ChartsComponent,\n DatapointsGraphKPIDetails,\n DatapointsGraphWidgetConfig,\n DatapointsGraphWidgetTimeProps,\n LEGEND_DISPLAY_OPTIONS,\n PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH\n} from '@c8y/ngx-components/echart';\nimport {\n GlobalContextWidgetWrapperComponent,\n WidgetControls\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { filter, Subject, take, takeUntil } from 'rxjs';\nimport { Observable } from 'rxjs/internal/Observable';\n\n@Component({\n selector: 'c8y-datapoints-graph-widget-config',\n host: { class: 'd-contents' },\n templateUrl: './datapoints-graph-widget-config.component.html',\n standalone: true,\n imports: [\n CommonModule,\n CoreModule,\n FormsModule,\n TooltipModule,\n PopoverModule,\n ChartsComponent,\n DatapointSelectorModule,\n AlarmEventSelectorModule,\n GlobalContextWidgetWrapperComponent\n ],\n providers: [\n ChartEventsService,\n ChartAlarmsService,\n ChartHelpersService,\n WidgetTimeContextDateRangeService\n ]\n})\nexport class DatapointsGraphWidgetConfigComponent\n implements OnInit, OnChanges, OnBeforeSave, OnDestroy\n{\n private _config = signal<DatapointsGraphWidgetConfig>({} as DatapointsGraphWidgetConfig);\n private isFirstConfigSet = true;\n\n @Input() set config(value: DatapointsGraphWidgetConfig | undefined) {\n if (!value) return;\n\n if (this.isFirstConfigSet) {\n this._config.set({ ...value });\n this.isFirstConfigSet = false;\n } else {\n this._config.set({\n ...this._config(),\n dateFrom: value.dateFrom,\n dateTo: value.dateTo,\n interval: value.interval,\n refreshInterval: value.refreshInterval,\n isAutoRefreshEnabled: value.isAutoRefreshEnabled,\n aggregation: value.aggregation,\n realtime: value.realtime,\n displayMode: value.displayMode,\n refreshOption: value.refreshOption,\n dateTimeContext: value.dateTimeContext\n });\n }\n }\n\n get config(): DatapointsGraphWidgetConfig | undefined {\n return this._config();\n }\n\n @ViewChild('dataPointsGraphPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private readonly formBuilder = inject(FormBuilder);\n private readonly form = inject(NgForm);\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly chartHelpersService = inject(ChartHelpersService);\n private readonly gainsightService = inject(GainsightService);\n private readonly measurementService = inject(MeasurementService);\n\n alerts: DynamicComponentAlertAggregator | undefined;\n formGroup: ReturnType<DatapointsGraphWidgetConfigComponent['initForm']>;\n datapointSelectDefaultFormOptions: Partial<DatapointAttributesFormConfig> = {\n showRange: true,\n showChart: true,\n showAdvancedChartOptions: false\n };\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n activeDatapointsExists = false;\n alarmsOrEventsHaveNoMatchingDps = false;\n widgetControls: WidgetControls;\n chartViewContext: CHART_VIEW_CONTEXT = CHART_VIEW_CONTEXT.WIDGET_CONFIG;\n legendDisplayOptions = LEGEND_DISPLAY_OPTIONS;\n private destroy$ = new Subject<void>();\n private isInitialized = false;\n\n constructor(\n @Optional() private widgetConfig: WidgetConfigComponent,\n @Optional() private dashboardContextComponent: ContextDashboardComponent,\n private dynamicComponentService: DynamicComponentService\n ) {\n this.formGroup = this.initForm();\n }\n\n async ngOnInit() {\n this.widgetControls =\n (await this.dynamicComponentService.getById(defaultWidgetIds.DATAPOINTS_GRAPH_NEW)).data\n ?.widgetControls || {};\n\n const currentConfig = this._config();\n currentConfig.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));\n\n this.form.form.addControl('config', this.formGroup);\n\n const alarms =\n currentConfig.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'ALARM') || [];\n const events =\n currentConfig.alarmsEventsConfigs?.filter(ae => ae.timelineType === 'EVENT') || [];\n this.formGroup.patchValue({ ...currentConfig, alarms, events }, { emitEvent: false });\n this.isInitialized = true;\n\n this.formGroup.controls.datapoints.valueChanges\n .pipe(\n takeUntil(this.destroy$),\n filter(value => value.length > 0),\n take(1)\n )\n .subscribe(async value => {\n const isMigrated = await this.detectTimeSeriesMigration(value[0]);\n this.datapointSelectDefaultFormOptions.showAdvancedChartOptions = isMigrated;\n this.formGroup.patchValue({ showAdvancedChartOptions: isMigrated }, { emitEvent: false });\n });\n\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(formValue => {\n const { alarms, events, datapoints } = formValue;\n\n this._config.set({\n ...this._config(),\n datapoints: datapoints || [],\n dataPointLegendDisplay: formValue.dataPointLegendDisplay,\n alarmsEventsConfigs: [...(alarms || []), ...(events || [])],\n displayMarkedLine: formValue.displayMarkedLine,\n displayMarkedPoint: formValue.displayMarkedPoint,\n mergeMatchingDatapoints: formValue.mergeMatchingDatapoints,\n forceMergeDatapoints: formValue.forceMergeDatapoints,\n setYaxisStartToZero: formValue.setYaxisStartToZero,\n smoothLines: formValue.smoothLines,\n showLabelAndUnit: formValue.showLabelAndUnit,\n showSlider: formValue.showSlider,\n yAxisSplitLines: formValue.yAxisSplitLines,\n xAxisSplitLines: formValue.xAxisSplitLines,\n numberOfDecimalPlaces: formValue.numberOfDecimalPlaces,\n aggregatedDatapoint: formValue.aggregatedDatapoint,\n showAdvancedChartOptions: formValue.showAdvancedChartOptions\n });\n\n this.setActiveDatapointsExists();\n this.checkForMatchingDatapoints();\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!changes.config || changes.config.isFirstChange() || !this.isInitialized) return;\n\n this.setActiveDatapointsExists();\n this.checkForMatchingDatapoints();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(\n config?: DatapointsGraphWidgetConfig\n ): boolean | Promise<boolean> | Observable<boolean> {\n if (!this.formGroup.valid || !config) return false;\n\n const snapshot = { ...this._config() };\n\n for (const key in snapshot) {\n if (snapshot.hasOwnProperty(key)) {\n try {\n config[key] = snapshot[key];\n } catch (e) {\n // do nothing\n }\n }\n }\n\n if (snapshot.alarmsEventsConfigs) {\n config.alarmsEventsConfigs = [...snapshot.alarmsEventsConfigs];\n }\n if (snapshot.datapoints) {\n config.datapoints = [...snapshot.datapoints];\n }\n\n this.widgetConfigService.updateConfig(snapshot, true);\n\n const configSummaryGS = this.chartHelpersService.getConfigSummaryForGainsight(config);\n this.gainsightService.triggerEvent(\n PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.EVENTS.DATA_EXPLORER_AND_GRAPH,\n {\n component: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.COMPONENTS.DATA_EXPLORER_DETAILS,\n action: PRODUCT_EXPERIENCE_DATA_EXPLORER_AND_GRAPH.ACTIONS.DATA_GRAPH_WIDGET_CONFIG,\n ...configSummaryGS\n }\n );\n\n return true;\n }\n\n updateTimeRangeOnRealtime(\n timeRange: Pick<DatapointsGraphWidgetConfig, 'dateFrom' | 'dateTo'>\n ): void {\n const current = this._config();\n this._config.set({\n ...current,\n ...timeRange,\n interval: current.interval || 'hours'\n });\n }\n\n updateDashboardTimeContext(timeProps: DatapointsGraphWidgetTimeProps): void {\n const dateTimeContext = {\n dateFrom: new Date(timeProps.dateFrom).toISOString(),\n dateTo: new Date(timeProps.dateTo).toISOString(),\n interval: timeProps.interval\n };\n this._config.set({\n ...this._config(),\n dateTimeContext\n });\n }\n\n updateAggregatedSliderDatapoint(selectedDatapoint: SelectedDatapoint | null): void {\n const aggregatedDatapoint = this.chartHelpersService.findMatchingDatapoint(\n this._config().datapoints || [],\n selectedDatapoint\n ) as DatapointsGraphKPIDetails | undefined;\n\n this._config.set({\n ...this._config(),\n aggregatedDatapoint\n });\n }\n\n /**\n * DEPRECATED: to be removed when there is another way to identify time series migration.\n * This method checks if the tenant is migrated to time series by making a call to measurement detail endpoint.\n * If the endpoint returns 405, it means the tenant is migrated. This is a workaround for now until we have a\n * better way to identify time series migration.\n */\n private async detectTimeSeriesMigration(firstDp: KPIDetails): Promise<boolean> {\n const targetId = firstDp?.__target?.id;\n\n if (!targetId) {\n return false;\n }\n\n try {\n await this.measurementService.detail(targetId);\n return false;\n } catch (err: any) {\n return err?.res?.status === 405;\n }\n }\n\n private assignContextFromContextDashboard(datapoint: KPIDetails) {\n if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.widgetConfig?.context;\n if (context?.id) {\n const { name, id } = context;\n datapoint.__target = { name, id };\n this.datapointSelectionConfig.contextAsset = { id };\n }\n }\n\n private checkForMatchingDatapoints(): void {\n const config = this._config();\n const alarmsEventsConfigs = config.alarmsEventsConfigs || [];\n const datapoints = config.datapoints || [];\n\n const allMatch = alarmsEventsConfigs.every(ae =>\n datapoints.some(dp => dp.__target?.id === ae.__target?.id)\n );\n\n queueMicrotask(() => {\n this.alarmsOrEventsHaveNoMatchingDps = !allMatch;\n });\n }\n\n private initForm() {\n const initialState = this._config();\n\n const form = this.formBuilder.group({\n datapoints: [\n [] as DatapointsGraphKPIDetails[],\n [Validators.required, Validators.minLength(1)]\n ],\n dataPointLegendDisplay: ['auto', []],\n alarms: [[] as AlarmDetails[]],\n events: [[] as EventDetails[]],\n displayMarkedLine: [true, []],\n displayMarkedPoint: [true, []],\n mergeMatchingDatapoints: [true, []],\n forceMergeDatapoints: [false, []],\n setYaxisStartToZero: [false, []],\n smoothLines: [false, []],\n showLabelAndUnit: [true, []],\n displayAggregationSelection: [false, []],\n canDecoupleGlobalTimeContext: [false, []],\n showSlider: [true, [Validators.required]],\n yAxisSplitLines: [false, [Validators.required]],\n xAxisSplitLines: [false, [Validators.required]],\n numberOfDecimalPlaces: [2, [Validators.required, Validators.min(0), Validators.max(10)]],\n aggregatedDatapoint: [initialState?.aggregatedDatapoint || null],\n showAdvancedChartOptions: [false]\n });\n return form;\n }\n\n private setActiveDatapointsExists() {\n const datapoints = this._config().datapoints || [];\n this.activeDatapointsExists = datapoints.filter(dp => dp.__active).length > 0;\n }\n}\n","<form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <div class=\"form-group form-group-sm\">\n <label\n [title]=\"'Number of decimal places' | translate\"\n translate\n >\n Number of decimal places\n </label>\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.numberOfDecimalPlaces?.touched &&\n formGroup?.controls?.numberOfDecimalPlaces?.errors\n \"\n ></c8y-messages>\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label>\n {{ 'Data point legend display' | translate }}\n </label>\n <div\n class=\"c8y-select-wrapper\"\n [formGroup]=\"formGroup\"\n >\n <select\n class=\"form-control\"\n [title]=\"'Data point legend display' | translate\"\n id=\"dataPointLegendDisplay\"\n formControlName=\"dataPointLegendDisplay\"\n >\n @for (option of legendDisplayOptions; track option) {\n <option [ngValue]=\"option.value\">\n {{ option.label | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n</form>\n\n<form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n>\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [popover]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [popover]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Set Y-axis start to 0' | translate\"\n >\n <input\n name=\"setYaxisStartToZero\"\n type=\"checkbox\"\n formControlName=\"setYaxisStartToZero\"\n />\n <span></span>\n <span translate>Set Y-axis start to 0</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"\n 'Sets the Y-axis minimum to 0 for all data points with positive values. If any data point includes negative values, the axis may still extend below 0. Explicitly configured minimum and maximum values take precedence over this option.'\n | translate\n \"\n [popover]=\"\n 'Sets the Y-axis minimum to 0 for all data points with positive values. If any data point includes negative values, the axis may still extend below 0. Explicitly configured minimum and maximum values take precedence over this option.'\n | translate\n \"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n ></button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n @if (alarmsOrEventsHaveNoMatchingDps) {\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n }\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n</form>\n\n<ng-template #dataPointsGraphPreview>\n @if (widgetControls) {\n <c8y-global-context-widget-wrapper\n [config]=\"config\"\n [displayMode]=\"'preview'\"\n [widgetControls]=\"widgetControls\"\n ></c8y-global-context-widget-wrapper>\n }\n\n @if (activeDatapointsExists) {\n <c8y-charts\n class=\"d-block p-relative\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n [chartViewContext]=\"chartViewContext\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (updateAggregatedSliderDatapoint)=\"updateAggregatedSliderDatapoint($event)\"\n ></c8y-charts>\n }\n\n @if (!activeDatapointsExists) {\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n data-cy=\"datapoints-graph-list--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-graph\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n }\n</ng-template>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, Input, OnDestroy, Optional, ViewChild } from '@angular/core';\nimport { ALARM_STATUS_LABELS, AlarmStatusType, SeveritySettings } from '@c8y/client';\nimport {\n AGGREGATION_ICONS,\n AGGREGATION_TEXTS,\n CoreModule,\n DynamicComponentAlertAggregator,\n DynamicComponentService,\n SelectableItem,\n SelectComponent,\n SelectItemDirective,\n SelectedItemsDirective,\n WidgetTimeContextDateRangeService\n} from '@c8y/ngx-components';\nimport { AlarmsModule } from '@c8y/ngx-components/alarms';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport type { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n AlarmDetailsExtended,\n AlarmOrEventExtended,\n CHART_VIEW_CONTEXT,\n ChartAlarmsService,\n ChartEventsService,\n ChartsComponent,\n DatapointsGraphKPIDetails,\n DatapointsGraphWidgetConfig,\n DatapointsGraphWidgetTimeProps,\n EventDetailsExtended,\n SelectableDatapoint,\n SeverityType\n} from '@c8y/ngx-components/echart';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GLOBAL_CONTEXT_EVENTS,\n GLOBAL_CONTEXT_SOURCE,\n GlobalContextEvent,\n GlobalContextWidgetWrapperComponent,\n REFRESH_OPTION,\n WidgetConfigMigrationService,\n WidgetControls\n} from '@c8y/ngx-components/global-context';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep, merge } from 'lodash-es';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n@Component({\n selector: 'c8y-datapoints-graph-widget-view',\n templateUrl: './datapoints-graph-widget-view.component.html',\n standalone: true,\n imports: [\n A11yModule,\n CommonModule,\n ChartsComponent,\n CoreModule,\n TooltipModule,\n BsDropdownModule,\n PopoverModule,\n AlarmsModule,\n GlobalContextWidgetWrapperComponent,\n SelectComponent,\n SelectItemDirective,\n SelectedItemsDirective\n ],\n providers: [ChartEventsService, ChartAlarmsService, WidgetTimeContextDateRangeService]\n})\nexport class DatapointsGraphWidgetViewComponent implements OnDestroy {\n events: EventDetailsExtended[] = [];\n alarms: AlarmDetailsExtended[] = [];\n AGGREGATION_ICONS = AGGREGATION_ICONS;\n AGGREGATION_TEXTS = AGGREGATION_TEXTS;\n alerts: DynamicComponentAlertAggregator | undefined;\n datapointsOutOfSync = new Map<DatapointsGraphKPIDetails, boolean>();\n hasAtLeastOneDatapointActive = true;\n hasAtLeastOneAlarmActive = true;\n isMarkedAreaEnabled = false;\n loadedDatapoints: DatapointsGraphKPIDetails[] = [];\n loadedAlarmsOrEvents: AlarmOrEventExtended[] = [];\n isLoading$ = new BehaviorSubject<boolean>(false);\n isSliderBeingDragged$ = new BehaviorSubject<boolean>(false);\n /*\n * @description: The type of alarm that has marked area enabled.\n */\n enabledMarkedAreaAlarmType: string | undefined;\n chartViewContext = CHART_VIEW_CONTEXT.WIDGET_VIEW;\n\n widgetControls: WidgetControls;\n /** Combined number of datapoints, alarms, and events */\n totalLegendItems = 0;\n /** Selectable items for the datapoints, alarms, events dropdown */\n selectableItems: SelectableItem<SelectableDatapoint>[] = [];\n /** Selected items from the dropdown */\n selectedItems: SelectableItem<SelectableDatapoint>[] = [];\n\n @Input() set config(value: DatapointsGraphWidgetConfig) {\n // Special case: sync the config with migrated values.\n // This is needed to reflect migrated states in the widget config.\n const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(value);\n const newConfig = merge(value, migratedConfig);\n this.displayConfig = cloneDeep(newConfig);\n }\n get config(): never {\n throw Error(\n '\"config\" property should not be referenced in view component to avoid mutating data.'\n );\n }\n @ViewChild(GlobalContextWidgetWrapperComponent) wrapper?: GlobalContextWidgetWrapperComponent;\n @ViewChild(ChartsComponent) chartComponent!: ChartsComponent;\n displayConfig: DatapointsGraphWidgetConfig | undefined;\n legendHelp = this.translate.instant(\n gettext(`<ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <li>\n <b>Visibility:</b>\n use visibility icon to toggle datapoint, alarm or event visibility on chart. At least one datapoint is required to display chart.\n </li>\n <li>\n <b>Alarm details</b>\n Click alarm legend item to highlight area between alarm raised timestamp and alarm cleared timestamp.\n You can also click alarm markline on chart to highlight alarm and to pause tooltip. Click on highlighted area or legend item to cancel highlighting.\n </li>\n </ul>`)\n );\n readonly disableZoomInLabel = gettext('Disable zoom in');\n readonly enableZoomInLabel = gettext(\n 'Click to enable zoom, then click and drag on the desired area in the chart.'\n );\n readonly hideDatapointLabel = gettext('Hide data point');\n readonly showDatapointLabel = gettext('Show data point');\n private destroy$ = new Subject<void>();\n private readonly widgetInstanceId = crypto.randomUUID();\n\n constructor(\n private translate: TranslateService,\n @Optional() private dashboardContextComponent: ContextDashboardComponent,\n private dynamicComponentService: DynamicComponentService,\n private widgetConfigMigrationService: WidgetConfigMigrationService,\n private widgetTimeContextDateRangeService: WidgetTimeContextDateRangeService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit() {\n this.displayConfig?.datapoints?.forEach(dp => this.assignContextFromContextDashboard(dp));\n this.displayConfig.isRealtimeEnabled = this.displayConfig.realtime;\n\n this.totalLegendItems =\n (this.displayConfig?.datapoints?.length || 0) +\n (this.displayConfig?.alarmsEventsConfigs?.length || 0);\n\n this.loadedDatapoints = (this.displayConfig?.datapoints || []).filter(dp => dp.__active);\n this.loadedAlarmsOrEvents = (this.displayConfig?.alarmsEventsConfigs || []).filter(\n aOrE => aOrE.__active && !aOrE.__hidden\n );\n if (this.totalLegendItems > 5 || this.displayConfig?.dataPointLegendDisplay === 'dropdown') {\n this.selectableItems = this.buildSelectableItems();\n // Initialize selectedItems with the currently active items\n this.selectedItems = this.selectableItems.filter(item => {\n if (item.value.type === 'DATAPOINT') {\n return !!item.value.original.__active;\n } else {\n return item.value.original.__active && !item.value.original.__hidden;\n }\n });\n }\n\n this.widgetControls =\n (await this.dynamicComponentService.getById(defaultWidgetIds.DATAPOINTS_GRAPH_NEW)).data\n ?.widgetControls || {};\n }\n\n onGlobalContextChange(event: GlobalContextEvent) {\n this.invalidateHiddenItemsCache();\n const { context, diff } = event;\n const { dateTimeContext } = context;\n const { dateFrom, dateTo, interval } = dateTimeContext;\n\n const isRealtimeEnabled =\n context.refreshOption === REFRESH_OPTION.LIVE &&\n context.isAutoRefreshEnabled &&\n context.refreshInterval === 5000;\n\n if (this.displayConfig.displayMode !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n const realtimeToggled = this.displayConfig?.realtime !== isRealtimeEnabled;\n\n if (realtimeToggled) {\n // When toggling realtime, we must:\n // 1. Spread ALL context properties (isAutoRefreshEnabled, refreshOption, etc.)\n // to keep the GC wrapper in sync. Otherwise stale isAutoRefreshEnabled on\n // displayConfig causes the wrapper's handleConfigChange() to silently\n // re-enable auto-refresh via setAutoRefreshEnabled() on the inline component.\n // 2. Use chart's actual visible range from dataZoom to avoid date jump.\n // GC's dateTimeContext dates don't match the chart's visible range — the chart\n // slides forward every 1s via ChartRealtimeService independently of GC.\n // 3. Return early to skip updateInitialTimeRange(null) which resets cached time range.\n const option = this.chartComponent?.echartsInstance?.getOption();\n const dataZoom = (option?.dataZoom as any[])?.[0];\n const chartDateFrom = dataZoom?.startValue\n ? new Date(dataZoom.startValue).toISOString()\n : dateFrom;\n const chartDateTo = dataZoom?.endValue ? new Date(dataZoom.endValue).toISOString() : dateTo;\n\n this.displayConfig = {\n ...this.displayConfig,\n ...structuredClone(context),\n dateFrom: new Date(chartDateFrom),\n dateTo: new Date(chartDateTo),\n dateTimeContext: {\n ...context.dateTimeContext,\n dateFrom: chartDateFrom,\n dateTo: chartDateTo\n },\n realtime: isRealtimeEnabled\n };\n return;\n }\n\n this.displayConfig = {\n ...this.displayConfig,\n ...structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval,\n realtime: isRealtimeEnabled\n };\n\n if (this.isSliderBeingDragged$.value === true) {\n this.isSliderBeingDragged$.next(false);\n return;\n }\n\n this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);\n return;\n }\n\n if (this.displayConfig?.realtime !== isRealtimeEnabled) {\n // Sync dates to avoid jumps in the chart\n this.displayConfig = merge(this.displayConfig, {\n dateTimeContext: structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval\n });\n\n this.displayConfig = {\n ...this.displayConfig,\n realtime: isRealtimeEnabled\n };\n }\n\n // Realtime is a special case, we need to block \"automatic\" emissions from the global context\n // GC in auto mode emits every 5 seconds. We only want to react to user changes.\n if (\n isRealtimeEnabled &&\n diff?.dateTimeContext &&\n Object.keys(diff).length === 1 &&\n Object.keys(diff.dateTimeContext).length === 2\n ) {\n // Sync dates to avoid jumps in the chart\n this.displayConfig = merge(this.displayConfig, {\n dateTimeContext: structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval\n });\n return;\n }\n\n this.displayConfig = {\n ...this.displayConfig,\n ...structuredClone(context),\n dateFrom: new Date(dateFrom),\n dateTo: new Date(dateTo),\n interval\n };\n\n if (\n context.source === GLOBAL_CONTEXT_SOURCE.DASHBOARD &&\n this.displayConfig.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD\n ) {\n this.widgetTimeContextDateRangeService.updateInitialTimeRange(null);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n updateDashboardTimeContext(timeProps: DatapointsGraphWidgetTimeProps): void {\n const chartOptions = this.chartComponent?.echartsInstance?.getOption();\n const isEndZoomChanged = chartOptions?.dataZoom[0]?.end !== 100;\n\n // Check if widget is linked to global context\n const linkStatus = this.wrapper?.globalContextInlineComponent?.controlLinkStatus();\n const isLinked = !linkStatus || Object.values(linkStatus).every(v => v !== false);\n\n if (this.displayConfig.displayMode === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && isLinked) {\n const dateTimeContext = isEndZoomChanged\n ? {\n dateFrom: new Date(timeProps.dateFrom).toISOString(),\n dateTo: new Date(timeProps.dateTo).toISOString(),\n interval: timeProps.interval\n }\n : { dateFrom: new Date(timeProps.dateFrom).toISOString(), interval: timeProps.interval };\n\n window.dispatchEvent(\n new CustomEvent(GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY, {\n detail: {\n type: GLOBAL_CONTEXT_EVENTS.UPDATE_GLOBAL_CONTEXT_HISTORY,\n payload: {\n dateTimeContext,\n isAutoRefreshEnabled: false,\n aggregation: this.displayConfig.aggregation,\n source: GLOBAL_CONTEXT_SOURCE.WIDGET,\n eventSourceId: this.widgetInstanceId\n },\n timestamp: Date.now()\n }\n })\n );\n } else {\n this.isSliderBeingDragged$.next(true);\n const dateTimeContext = {\n dateFrom: new Date(timeProps.dateFrom),\n dateTo: new Date(timeProps.dateTo),\n interval: timeProps.interval\n };\n\n // Update displayConfig for internal state\n this.displayConfig = {\n ...this.displayConfig,\n dateTimeContext: structuredClone(dateTimeContext) as any,\n dateFrom: new Date(timeProps.dateFrom),\n dateTo: new Date(timeProps.dateTo),\n interval: timeProps.interval,\n realtime: false,\n isAutoRefreshEnabled: false\n };\n\n // Trigger wrapper to update its internal state\n this.wrapper.pauseAutoRefresh();\n this.wrapper.updateDateTimeContext(dateTimeContext);\n }\n }\n\n buildSelectableItems(): SelectableItem<SelectableDatapoint>[] {\n const dpItems: SelectableItem<SelectableDatapoint>[] = (\n this.displayConfig.datapoints || []\n ).map(dp => {\n return {\n label: dp.label,\n value: {\n type: 'DATAPOINT',\n original: dp\n }\n };\n });\n\n const alarmItems: SelectableItem<SelectableDatapoint>[] = (\n this.displayConfig.alarmsEventsConfigs || []\n )\n .filter(ae => ae.timelineType === 'ALARM')\n .map(alarm => {\n return {\n label: alarm.label,\n value: {\n type: 'ALARM',\n original: alarm\n }\n };\n });\n\n const eventItems: SelectableItem<SelectableDatapoint>[] = (\n this.displayConfig.alarmsEventsConfigs || []\n )\n .filter(ae => ae.timelineType === 'EVENT')\n .map(event => {\n return {\n label: event.label,\n value: {\n type: 'EVENT',\n original: event\n }\n };\n });\n\n return [...dpItems, ...alarmItems, ...eventItems];\n }\n\n onItemSelected(item: SelectableItem<SelectableDatapoint>): void {\n if (item.value.type === 'DATAPOINT') {\n this.toggleChart(item.value.original as DatapointsGraphKPIDetails);\n } else {\n this.toggleAlarmEventType(item.value.original as AlarmOrEventExtended);\n }\n }\n\n onItemDeselected(item: SelectableItem<SelectableDatapoint>): void {\n if (item.value.type === 'DATAPOINT') {\n this.toggleChart(item.value.original as DatapointsGraphKPIDetails);\n } else {\n this.toggleAlarmEventType(item.value.original as AlarmOrEventExtended);\n }\n }\n\n toggleChart(datapoint: DatapointsGraphKPIDetails): void {\n if (\n this.displayConfig?.datapoints?.filter(dp => dp.__active).length === 1 &&\n datapoint.__active\n ) {\n // at least 1 datapoint should be active\n this.hasAtLeastOneDatapointActive = false;\n this.updateSelectedItems();\n return;\n }\n datapoint.__active = !datapoint.__active;\n this.hasAtLeastOneDatapointActive = true;\n\n this.updateSelectedItems();\n\n const getDatapointId = (dp: DatapointsGraphKPIDetails) =>\n `${dp.__target?.id}${dp.fragment}${dp.series}`;\n const isLoaded = this.loadedDatapoints.find(\n dp => getDatapointId(dp) === getDatapointId(datapoint)\n );\n\n if (datapoint.__active && !isLoaded) {\n // Datapoint being shown but not loaded (or data is stale) - trigger full reload\n this.loadedDatapoints.push(datapoint);\n this.displayConfig = { ...this.displayConfig };\n } else {\n // Datapoint already loaded with fresh data OR being hidden - just toggle visibility in echarts\n this.chartComponent.toggleDatapointSeriesVisibility(datapoint);\n }\n }\n\n handleDatapointOutOfSync(dpOutOfSync: DatapointsGraphKPIDetails): void {\n const key = (dp: KPIDetails) => dp.__target?.id + dp.fragment + dp.series;\n const dpMatch = this.displayConfig?.datapoints?.find(dp => key(dp) === key(dpOutOfSync));\n if (!dpMatch) {\n return;\n }\n this.datapointsOutOfSync.set(dpMatch, true);\n }\n\n toggleMarkedArea(alarm: AlarmDetailsExtended): void {\n this.enabledMarkedAreaAlarmType = alarm.filters.type;\n const params = {\n data: {\n itemType: alarm.filters.type\n }\n };\n this.chartComponent.onChartClick(params);\n }\n\n toggleAlarmEventType(alarmOrEvent: AlarmOrEventExtended): void {\n const type = alarmOrEvent.filters.type;\n const deviceId = alarmOrEvent.__target?.id;\n const newHiddenState = !alarmOrEvent.__hidden;\n const isBeingShown = !newHiddenState;\n\n // Match by both type AND device to distinguish alarms from different devices\n const isSameAlarmConfig = (ae: AlarmOrEventExtended) =>\n ae.filters.type === type && ae.__target?.id === deviceId;\n\n // Update __hidden in all locations\n alarmOrEvent.__hidden = newHiddenState;\n this.displayConfig.alarmsEventsConfigs?.forEach(ae => {\n if (isSameAlarmConfig(ae)) {\n ae.__hidden = newHiddenState;\n }\n });\n this.alarms.forEach(alarm => {\n if (isSameAlarmConfig(alarm)) {\n alarm.__hidden = newHiddenState;\n }\n });\n this.events.forEach(event => {\n if (isSameAlarmConfig(event)) {\n event.__hidden = newHiddenState;\n }\n });\n\n this.updateSelectedItems();\n\n const isLoaded = this.loadedAlarmsOrEvents.find(aOrE => isSameAlarmConfig(aOrE));\n\n if (isBeingShown && !isLoaded) {\n // Showing but not loaded - trigger pipeline to fetch data\n this.loadedAlarmsOrEvents.push(alarmOrEvent);\n this.displayConfig = { ...this.displayConfig };\n } else {\n // Hiding OR showing already-loaded - just toggle visibility in echarts\n this.chartComponent.toggleAlarmEventSeriesVisibility(alarmOrEvent);\n }\n }\n\n updateAlarmsAndEvents(alarmsEventsConfigs: AlarmOrEventExtended[]): void {\n this.alarms = alarmsEventsConfigs.filter(\n alarm => alarm.timelineType === 'ALARM'\n ) as AlarmDetailsExtended[];\n this.events = alarmsEventsConfigs.filter(\n event => event.timelineType === 'EVENT'\n ) as EventDetailsExtended[];\n if (this.alarms.length === 0 || !this.alarms.find(alarm => alarm.__active)) {\n this.hasAtLeastOneAlarmActive = false;\n }\n }\n\n filterSeverity(eventTarget: any): void {\n this.alarms = this.alarms.map(alarm => {\n if (!alarm.__severity) {\n alarm.__severity = [];\n }\n alarm.__severity = Object.keys(eventTarget.severityOptions).filter(\n (severity): severity is keyof SeveritySettings =>\n eventTarget.severityOptions[severity as keyof SeveritySettings]\n ) as SeverityType[];\n\n if (!alarm.__status) {\n alarm.__status = [];\n }\n const statuses = Object.keys(ALARM_STATUS_LABELS) as AlarmStatusType[];\n const filteredStatuses = eventTarget.showCleared\n ? statuses\n : statuses.filter(status => status !== 'CLEARED');\n alarm.__status = filteredStatuses;\n return alarm;\n });\n this.displayConfig = { ...this.displayConfig };\n }\n\n isLastActiveDatapoint(selectedItem: SelectableItem<SelectableDatapoint>): boolean {\n if (!selectedItem) {\n return false;\n }\n\n if (!selectedItem?.value || selectedItem.value.type !== 'DATAPOINT') {\n return false;\n }\n // Check if this is the last active datapoint\n return !this.hasAtLeastOneDatapointActive && selectedItem.value.original.__active;\n }\n\n private updateSelectedItems(): void {\n const filtered = this.selectableItems.filter(item => {\n if (item.value.type === 'DATAPOINT') {\n return !!item.value.original.__active;\n } else {\n return item.value.original.__active && !item.value.original.__hidden;\n }\n });\n this.selectedItems = [...filtered];\n this.cdr.detectChanges();\n }\n\n private assignContextFromContextDashboard(\n dpOrAlarmOrEvent: KPIDetails | AlarmOrEventExtended\n ): void {\n if (!this.dashboardContextComponent?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.dashboardContextComponent?.context;\n if (context?.id) {\n const { name, id } = context;\n dpOrAlarmOrEvent.__target = { name, id };\n }\n }\n\n /**\n * Remove hidden items from loaded cache so they will be reloaded when toggled visible.\n * Called when context changes (time range, aggregation, etc.) to mark hidden items data as stale.\n */\n private invalidateHiddenItemsCache(): void {\n this.loadedDatapoints = this.loadedDatapoints.filter(dp => dp.__active);\n this.loadedAlarmsOrEvents = this.loadedAlarmsOrEvents.filter(\n aOrE => aOrE.__active && !aOrE.__hidden\n );\n }\n}\n","@if (widgetControls) {\n <c8y-global-context-widget-wrapper\n [widgetControls]=\"widgetControls\"\n [isLoading]=\"isLoading$ | async\"\n [config]=\"displayConfig\"\n [disableRefreshEmits]=\"true\"\n (globalContextChange)=\"onGlobalContextChange($event)\"\n ></c8y-global-context-widget-wrapper>\n}\n<div\n class=\"p-l-16 p-r-16\"\n style=\"min-height: 34px\"\n>\n <div class=\"d-flex gap-16 a-i-center\">\n @if (hasAtLeastOneAlarmActive) {\n <c8y-alarms-filter\n class=\"d-contents form-group-sm min-width-0\"\n (onFilterApplied)=\"filterSeverity($event)\"\n ></c8y-alarms-filter>\n }\n @if (displayConfig?.datapoints.length > 0) {\n <div class=\"d-flex a-i-center min-width-0\">\n @if (\n displayConfig.dataPointLegendDisplay === 'dropdown' ||\n (displayConfig.dataPointLegendDisplay === 'auto' && totalLegendItems > 5)\n ) {\n <c8y-select\n class=\"min-width-0 c8y-select-v2--sm\"\n aria-label=\"Select datapoints, alarms or events\"\n [placeholder]=\"'Select datapoints, alarms or events' | translate\"\n [multi]=\"true\"\n [filterItems]=\"true\"\n [(ngModel)]=\"selectedItems\"\n (onSelect)=\"onItemSelected($event)\"\n (onDeselect)=\"onItemDeselected($event)\"\n >\n @for (item of selectableItems; track item.value) {\n <div\n class=\"d-flex a-i-center gap-4\"\n *c8ySelectItem=\"item.value; label: item.label\"\n >\n @if (\n !hasAtLeastOneDatapointActive &&\n item.value.type === 'DATAPOINT' &&\n item.value.original.__active\n ) {\n <i\n class=\"text-warning m-r-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 data point must be active.' | translate\"\n container=\"body\"\n data-cy=\"datapoint-warning-icon\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n @if (item.value.type === 'DATAPOINT') {\n <span\n class=\"circle-icon-wrapper a-s-start circle-icon-wrapper--small\"\n [style.background-color]=\"item.value.original.color\"\n ></span>\n }\n @if (item.value.type === 'ALARM') {\n <span\n class=\"circle-icon-wrapper a-s-start circle-icon-wrapper--small\"\n [style.background-color]=\"item.value.original.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n }\n @if (item.value.type === 'EVENT') {\n <span\n class=\"circle-icon-wrapper a-s-start circle-icon-wrapper--small\"\n [ngStyle]=\"{ 'background-color': item.value.original.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"online1\"\n ></i>\n </span>\n }\n <span class=\"text-truncate d-col\">\n <small class=\"text-truncate\">{{ item.value.original.label }}</small>\n <span class=\"text-muted text-10\">{{ item.value.original.__target?.name }}</span>\n </span>\n </div>\n }\n <span\n class=\"tag tag--info chip\"\n title=\"{{ selectedItem.label }}\"\n *c8ySelectedItems=\"let selectedItem\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ selectedItem.label }}\"\n type=\"button\"\n (click)=\"\n $event.preventDefault(); $event.stopPropagation(); onItemDeselected(selectedItem)\n \"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n @if (isLastActiveDatapoint(selectedItem)) {\n <i\n class=\"text-warning a-s-start\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 data point must be active.' | translate\"\n container=\"body\"\n data-cy=\"datapoint-warning-icon\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n @if (selectedItem.value.type === 'DATAPOINT') {\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [style.background-color]=\"selectedItem.value?.original.color || ''\"\n ></span>\n }\n @if (selectedItem.value?.type === 'ALARM') {\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [style.background-color]=\"selectedItem.value?.original.color || ''\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n }\n @if (selectedItem.value?.type === 'EVENT') {\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small\"\n [ngStyle]=\"{\n 'background-color': selectedItem.value?.original.color || ''\n }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"online1\"\n ></i>\n </span>\n }\n </span>\n </c8y-select>\n } @else {\n <div class=\"inner-scroll\">\n <div class=\"p-t-4 d-flex a-i-start gap-8\">\n @for (datapoint of displayConfig.datapoints; track datapoint) {\n @if (datapoint.retrievalError) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'Data point no longer exists.' | translate\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></i>\n } @else {\n <div\n class=\"c8y-datapoint-pill pill--sm flex-no-shrink\"\n title=\"{{ datapoint.label }} - {{ datapoint.__target.name }}\"\n [ngClass]=\"{ active: datapoint.__active }\"\n >\n @if (!hasAtLeastOneDatapointActive && datapoint.__active) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"'At least 1 data point must be active.' | translate\"\n container=\"body\"\n data-cy=\"datapoint-warning-icon\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n <button\n class=\"c8y-datapoint-pill__btn\"\n title=\"{{\n (datapoint.__active ? hideDatapointLabel : showDatapointLabel) | translate\n }} \"\n type=\"button\"\n data-cy=\"datapoint-toggle-visibility-btn\"\n (click)=\"toggleChart(datapoint)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"datapoint.__active ? 'eye text-primary' : 'eye-slash text-muted'\"\n ></i>\n </button>\n <div class=\"c8y-datapoint-pill__label c8y-datapoint-pill__btn\">\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [ngStyle]=\"{\n color: datapoint.color\n }\"\n ></i>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': !datapoint.__active }\"\n >\n <span class=\"text-truncate text-bold\">\n {{ datapoint.label }}\n </span>\n <small class=\"text-muted text-10\">\n {{ datapoint.__target.name }}\n </small>\n </span>\n @if (datapointsOutOfSync.get(datapoint)) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Measurements received for this data point may be out of sync.'\n | translate\n \"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n </div>\n </div>\n }\n }\n\n @for (alarm of alarms; track alarm) {\n <div\n class=\"c8y-alarm-pill pill--sm flex-no-shrink\"\n title=\"{{ alarm.filters.type }} \"\n >\n @if (displayConfig?.activeAlarmTypesOutOfRange?.includes(alarm.filters.type)) {\n <i\n class=\"text-warning m-l-4\"\n c8yIcon=\"exclamation-triangle\"\n [tooltip]=\"\n 'Alarm of this type is currently active and outside of the selected time range'\n | translate\n \"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></i>\n }\n <button\n class=\"c8y-alarm-pill__btn\"\n title=\"{{ alarm.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(alarm)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n alarm.__hidden || !alarm.__active\n ? 'eye-slash text-muted'\n : 'eye text-primary'\n \"\n ></i>\n </button>\n <button\n class=\"c8y-alarm-pill__label c8y-alarm-pill__btn\"\n (click)=\"toggleMarkedArea(alarm)\"\n [ngClass]=\"{\n active:\n !isMarkedAreaEnabled && alarm.filters.type === enabledMarkedAreaAlarmType\n }\"\n >\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [style.background-color]=\"alarm.color\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n <span\n class=\"text-truncate\"\n [ngClass]=\"{ 'text-muted': alarm.__hidden }\"\n >\n <span class=\"text-truncate text-bold\">\n {{ alarm.label || alarm.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ alarm.__target.name }}\n </small>\n </span>\n </button>\n </div>\n }\n\n @for (event of events; track event) {\n <div\n class=\"c8y-event-pill pill--sm flex-no-shrink\"\n title=\"{{ event.filters.type }}\"\n >\n <button\n class=\"c8y-event-pill__btn\"\n title=\"{{ event.filters.type }} \"\n type=\"button\"\n (click)=\"toggleAlarmEventType(event)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n event.__hidden || !event.__active\n ? 'eye-slash text-muted'\n : 'eye text-primary'\n \"\n ></i>\n </button>\n <div class=\"c8y-event-pill__label c8y-event-pill__btn\">\n <span\n class=\"circle-icon-wrapper circle-icon-wrapper--small m-r-4\"\n [ngStyle]=\"{ 'background-color': event.color }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"online1\"\n ></i>\n </span>\n <span\n class=\"text-truncate text-bold\"\n [ngClass]=\"{ 'text-muted': event.__hidden }\"\n >\n <span class=\"text-truncate\">\n {{ event.label || event.filters.type }}\n </span>\n <small class=\"text-muted text-10\">\n {{ event.__target.name }}\n </small>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n <button\n class=\"btn-help btn-help--sm m-r-8\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"legendHelpTemplate\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"true\"\n ></button>\n }\n </div>\n }\n <button\n class=\"btn btn-default btn-sm flex-no-shrink m-l-auto\"\n [attr.aria-label]=\"'Save as image' | translate\"\n tooltip=\"{{ 'Save as image' | translate }}\"\n container=\"body\"\n type=\"button\"\n (click)=\"chartComponent.saveAsImage()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"image-file-checked\"\n ></i>\n </button>\n </div>\n</div>\n\n@if (displayConfig !== null) {\n <c8y-charts\n #chart\n [config]=\"displayConfig\"\n [alerts]=\"alerts\"\n [chartViewContext]=\"chartViewContext\"\n (updateAlarmsAndEvents)=\"updateAlarmsAndEvents($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n (datapointOutOfSync)=\"handleDatapointOutOfSync($event)\"\n (finishLoading)=\"this.isLoading$.next($event)\"\n (isMarkedAreaEnabled)=\"isMarkedAreaEnabled = $event\"\n ></c8y-charts>\n}\n\n<ng-template #legendHelpTemplate>\n <div [innerHTML]=\"legendHelp\"></div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i4","CommonModule","i5","i6","i7","i8"],"mappings":"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"}
@@ -21684,6 +21684,7 @@ class PlatformDetailsService {
21684
21684
  // self link should still allow to identify the actual environment of the tenant
21685
21685
  const tenantSelfLink = this.appState.currentTenant.value?.self;
21686
21686
  const tenantDomainName = this.appState.currentTenant.value?.domainName;
21687
+ const parentTenantId = this.appState.currentTenant.value?.parent;
21687
21688
  const applicationKey = this.appState.currentApplication.value?.key;
21688
21689
  const applicationId = this.appState.currentApplication.value?.id;
21689
21690
  const time = new Date().toISOString();
@@ -21693,6 +21694,7 @@ class PlatformDetailsService {
21693
21694
  tenantId,
21694
21695
  tenantSelfLink,
21695
21696
  tenantDomainName,
21697
+ parentTenantId,
21696
21698
  url,
21697
21699
  userId,
21698
21700
  userPermissions,
@@ -21703,9 +21705,7 @@ class PlatformDetailsService {
21703
21705
  return obj;
21704
21706
  }
21705
21707
  async getVersions() {
21706
- const versions = await this.version.items$
21707
- .pipe(take(1), map(versions => this.version.cleanUpVersions(versions)))
21708
- .toPromise();
21708
+ const versions = await firstValueFrom(this.version.items$.pipe(take(1), map(versions => this.version.cleanUpVersions(versions))));
21709
21709
  return versions;
21710
21710
  }
21711
21711
  async getMicroserviceVersions(userId) {
@@ -21720,7 +21720,7 @@ class PlatformDetailsService {
21720
21720
  .map(app => {
21721
21721
  return {
21722
21722
  label: app.name,
21723
- version: app.manifest.version,
21723
+ version: app.manifest?.version,
21724
21724
  type: app.type,
21725
21725
  custom: {
21726
21726
  owner: app.owner?.tenant?.id,