@c8y/ngx-components 1024.1.6 → 1024.2.4

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 (53) hide show
  1. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +18 -16
  2. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +64 -25
  4. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +363 -38
  6. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  8. package/fesm2022/c8y-ngx-components-echart.mjs +796 -123
  9. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  10. package/fesm2022/c8y-ngx-components-global-context.mjs +391 -54
  11. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  12. package/fesm2022/c8y-ngx-components-time-context.mjs +146 -20
  13. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +198 -24
  15. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components.mjs +100 -32
  17. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  18. package/locales/de.po +80 -8
  19. package/locales/es.po +80 -8
  20. package/locales/fr.po +80 -8
  21. package/locales/ja_JP.po +80 -8
  22. package/locales/ko.po +80 -8
  23. package/locales/locales.pot +79 -7
  24. package/locales/nl.po +80 -8
  25. package/locales/pl.po +80 -8
  26. package/locales/pt_BR.po +80 -8
  27. package/locales/zh_CN.po +80 -8
  28. package/locales/zh_TW.po +80 -8
  29. package/package.json +1 -1
  30. package/types/c8y-ngx-components-auth-configuration.d.ts +3 -3
  31. package/types/c8y-ngx-components-auth-configuration.d.ts.map +1 -1
  32. package/types/c8y-ngx-components-datapoint-explorer-view.d.ts +4 -1
  33. package/types/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -1
  34. package/types/c8y-ngx-components-datapoint-selector.d.ts +93 -5
  35. package/types/c8y-ngx-components-datapoint-selector.d.ts.map +1 -1
  36. package/types/c8y-ngx-components-echart-models.d.ts +25 -3
  37. package/types/c8y-ngx-components-echart-models.d.ts.map +1 -1
  38. package/types/c8y-ngx-components-echart.d.ts +65 -5
  39. package/types/c8y-ngx-components-echart.d.ts.map +1 -1
  40. package/types/c8y-ngx-components-global-context.d.ts +187 -7
  41. package/types/c8y-ngx-components-global-context.d.ts.map +1 -1
  42. package/types/c8y-ngx-components-time-context.d.ts +50 -8
  43. package/types/c8y-ngx-components-time-context.d.ts.map +1 -1
  44. package/types/c8y-ngx-components-widgets-implementations-alarms.d.ts +1 -0
  45. package/types/c8y-ngx-components-widgets-implementations-alarms.d.ts.map +1 -1
  46. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts +25 -0
  47. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -1
  48. package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts +1 -0
  49. package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts.map +1 -1
  50. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts +2 -0
  51. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts.map +1 -1
  52. package/types/c8y-ngx-components.d.ts +50 -11
  53. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -1,27 +1,29 @@
1
1
  import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle, DragDropModule } from '@angular/cdk/drag-drop';
2
2
  import * as i0 from '@angular/core';
3
- import { Injectable, forwardRef, Input, Component, EventEmitter, ContentChild, Output, Pipe, Optional, NgModule, signal, computed, inject, DestroyRef } from '@angular/core';
4
- import * as i2$1 from '@c8y/ngx-components';
5
- import { C8yValidators, C8yTranslateDirective, FormGroupComponent, RequiredInputPlaceholderDirective, MessagesComponent, MessageDirective, C8yTranslatePipe, MAX_PAGE_SIZE, IconDirective, ListItemComponent, ListItemDragHandleComponent, ListItemCheckboxComponent, HighlightComponent, ListItemActionComponent, ListItemCollapseComponent, TypeaheadComponent, ForOfDirective, ListItemIconComponent, EmptyStateComponent, LoadingComponent, ListGroupComponent, CoreModule, FormsModule as FormsModule$1 } from '@c8y/ngx-components';
3
+ import { Input, ChangeDetectionStrategy, Component, Injectable, inject, DestroyRef, forwardRef, EventEmitter, ContentChild, Output, Pipe, Optional, NgModule, signal, computed } from '@angular/core';
4
+ import * as i2 from '@c8y/ngx-components';
5
+ import { C8yTranslateDirective, C8yTranslatePipe, C8yValidators, FormGroupComponent, RequiredInputPlaceholderDirective, MessagesComponent, MessageDirective, MAX_PAGE_SIZE, IconDirective, ListItemComponent, ListItemDragHandleComponent, ListItemCheckboxComponent, HighlightComponent, ListItemActionComponent, ListItemCollapseComponent, TypeaheadComponent, ForOfDirective, ListItemIconComponent, EmptyStateComponent, LoadingComponent, ListGroupComponent, CoreModule, FormsModule as FormsModule$1 } from '@c8y/ngx-components';
6
6
  import { MillerViewComponent, AssetSelectorModule } from '@c8y/ngx-components/assets-navigator';
7
7
  import { CollapseModule } from 'ngx-bootstrap/collapse';
8
8
  import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
9
- import * as i1$1 from 'ngx-bootstrap/modal';
9
+ import * as i1$2 from 'ngx-bootstrap/modal';
10
10
  import { ModalModule } from 'ngx-bootstrap/modal';
11
+ import * as i5 from 'ngx-bootstrap/popover';
11
12
  import { PopoverDirective, PopoverModule } from 'ngx-bootstrap/popover';
12
13
  import { TooltipDirective, TooltipModule } from 'ngx-bootstrap/tooltip';
13
- import * as i2 from '@angular/forms';
14
- import { Validators, FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS, NgForm, ControlContainer } from '@angular/forms';
15
- import { map, take, filter, startWith, tap, switchMap, shareReplay, distinctUntilChanged, debounceTime } from 'rxjs/operators';
14
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
15
+ import * as i1 from '@angular/forms';
16
+ import { ReactiveFormsModule, Validators, FormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS, NgForm, ControlContainer } from '@angular/forms';
16
17
  import { gettext } from '@c8y/ngx-components/gettext';
18
+ import { map, take, filter, startWith, tap, switchMap, shareReplay, distinctUntilChanged, debounceTime } from 'rxjs/operators';
17
19
  import { NgClass, NgTemplateOutlet, KeyValuePipe, AsyncPipe, NgIf, NgFor } from '@angular/common';
20
+ import chroma from 'chroma-js';
18
21
  import * as i4 from '@c8y/ngx-components/context-dashboard';
19
22
  import { WidgetConfigService, WidgetConfigComponent, ContextDashboardComponent, WidgetConfigFeedbackComponent } from '@c8y/ngx-components/context-dashboard';
20
23
  import { pipe, BehaviorSubject, from, combineLatest, filter as filter$1, take as take$1, map as map$1, switchMap as switchMap$1 } from 'rxjs';
21
- import * as i1 from '@c8y/client';
24
+ import * as i1$1 from '@c8y/client';
22
25
  import { MeasurementService } from '@c8y/client';
23
26
  import { sortBy, get, uniq } from 'lodash-es';
24
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
25
27
 
26
28
  const AXIS_TYPES = [
27
29
  { val: null, text: gettext('Auto') },
@@ -30,6 +32,8 @@ const AXIS_TYPES = [
30
32
  ];
31
33
  const CHART_LINE_TYPES = [
32
34
  { val: 'line', text: gettext('Line') },
35
+ { val: 'dashed', text: gettext('Dashed line') },
36
+ { val: 'dotted', text: gettext('Dotted line') },
33
37
  { val: 'points', text: gettext('Points') },
34
38
  { val: 'linePoints', text: gettext('Line and points') },
35
39
  { val: 'bars', text: gettext('Bars') },
@@ -37,13 +41,65 @@ const CHART_LINE_TYPES = [
37
41
  { val: 'step-after', text: gettext('Step after') }
38
42
  ];
39
43
  const CHART_RENDER_TYPES = [
44
+ { val: 'avg', text: gettext('Average') },
40
45
  { val: 'min', text: gettext('Minimum') },
41
46
  { val: 'max', text: gettext('Maximum') },
42
47
  { val: 'area', text: gettext('Minimum and maximum') },
43
- { val: 'avg', text: gettext('Average') },
44
48
  { val: 'count', text: gettext('Count') },
45
49
  { val: 'sum', text: gettext('Sum') }
46
50
  ];
51
+ const DATA_POINT_VALUE_TYPES = ['avg', 'min', 'max'];
52
+ const DATA_POINT_TOTAL_TYPES = ['count', 'sum'];
53
+ const DEFAULT_RENDER_TYPE_LINE_TYPES = {
54
+ avg: 'line',
55
+ min: 'dashed',
56
+ max: 'dotted',
57
+ count: 'bars',
58
+ sum: 'bars'
59
+ };
60
+
61
+ class DatapointChartAdvancedOptionsComponent {
62
+ constructor() {
63
+ this.defaultColors = {};
64
+ this.renderAsBandDisabledTooltip = gettext('Both minimum and maximum must be enabled to use this option.');
65
+ this.CHART_LINE_TYPES = Array.from(CHART_LINE_TYPES);
66
+ this.AXIS_TYPES = Array.from(AXIS_TYPES);
67
+ this.DATA_POINT_VALUE_TYPES = DATA_POINT_VALUE_TYPES;
68
+ this.DATA_POINT_TOTAL_TYPES = DATA_POINT_TOTAL_TYPES;
69
+ }
70
+ getConfigColor(rtKey) {
71
+ const configColor = this.chartFormGroup?.get('renderTypeConfigs')
72
+ ?.get(rtKey)
73
+ ?.get('color')?.value;
74
+ return configColor || this.defaultColors[rtKey];
75
+ }
76
+ setConfigColor(rtKey, color) {
77
+ this.chartFormGroup?.get('renderTypeConfigs')
78
+ ?.get(rtKey)
79
+ ?.get('color')
80
+ ?.setValue(color);
81
+ }
82
+ getRenderTypeLabel(rtKey) {
83
+ const found = CHART_RENDER_TYPES.find(rt => rt.val === rtKey);
84
+ return found?.text || rtKey;
85
+ }
86
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointChartAdvancedOptionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
87
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DatapointChartAdvancedOptionsComponent, isStandalone: true, selector: "c8y-datapoint-chart-advanced-options", inputs: { chartFormGroup: "chartFormGroup", defaultColors: "defaultColors" }, ngImport: i0, template: "<ng-container [formGroup]=\"chartFormGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Data point values' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Statistics that describe the spread of values within each time bucket. These share the same unit and scale as the original measurement'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </legend>\n <div class=\"table-responsive\">\n <table class=\"table table-condensed m-b-0 bg-inherit\">\n <thead>\n <tr>\n <th translate>Display</th>\n <th translate>Range min</th>\n <th translate>Range max</th>\n <th translate>Chart type</th>\n <th translate>Y-axis</th>\n </tr>\n </thead>\n <tbody>\n <ng-container formGroupName=\"renderTypeConfigs\">\n @for (rtKey of DATA_POINT_VALUE_TYPES; track rtKey) {\n @let configColor = getConfigColor(rtKey);\n <ng-container [formGroupName]=\"rtKey\">\n <tr>\n <td class=\"text-no-wrap\">\n <div class=\"d-inline-flex a-i-center\">\n <label class=\"c8y-checkbox c8y-checkbox--inline m-b-0 m-r-4\">\n <input\n type=\"checkbox\"\n formControlName=\"enabled\"\n />\n <span></span>\n <span></span>\n </label>\n <div\n class=\"c8y-colorpicker m-r-4\"\n (click)=\"$event.stopPropagation()\"\n >\n <input\n [attr.aria-label]=\"rtKey + ' color'\"\n type=\"color\"\n [value]=\"configColor\"\n (input)=\"setConfigColor(rtKey, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"configColor\"></span>\n </div>\n <span>{{ getRenderTypeLabel(rtKey) | translate }}</span>\n </div>\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMin\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMax\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n </tr>\n </ng-container>\n }\n </ng-container>\n <tr>\n <td colspan=\"5\">\n <div\n class=\"d-flex a-i-center\"\n [tooltip]=\"\n chartFormGroup?.get('renderAsBand')?.disabled\n ? (renderAsBandDisabledTooltip | translate)\n : null\n \"\n container=\"body\"\n >\n <label\n class=\"c8y-checkbox m-b-0 m-r-4\"\n [class.disabled]=\"chartFormGroup?.get('renderAsBand')?.disabled\"\n >\n <input\n [attr.aria-label]=\"'Render as band' | translate\"\n type=\"checkbox\"\n formControlName=\"renderAsBand\"\n />\n <span></span>\n </label>\n <div\n class=\"c8y-colorpicker m-l-8 m-r-4\"\n [class.invisible]=\"!chartFormGroup?.get('renderAsBand')?.value\"\n (click)=\"$event.stopPropagation()\"\n >\n <input\n [attr.aria-label]=\"'Band color' | translate\"\n type=\"color\"\n [value]=\"chartFormGroup?.get('bandColor')?.value || defaultColors['avg']\"\n (input)=\"chartFormGroup?.get('bandColor')?.setValue($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n <span\n [style.background-color]=\"\n chartFormGroup?.get('bandColor')?.value || defaultColors['avg']\n \"\n ></span>\n </div>\n <span class=\"text-12\">\n {{ 'Render as band' | translate }}\n <small class=\"text-muted\">\n <em> &mdash; {{ 'replaces min/max lines with a shaded area' | translate }} </em>\n </small>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Data point totals' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Metrics that quantify the time bucket itself \u2014 how many readings the bucket captured, or their totals. These typically use a different scale.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </legend>\n <ng-container formGroupName=\"renderTypeConfigs\">\n <div class=\"table-responsive\">\n <table class=\"table table-condensed m-b-0 bg-inherit\">\n <thead>\n <tr>\n <th translate>Display</th>\n <th translate>Range min</th>\n <th translate>Range max</th>\n <th translate>Chart type</th>\n <th translate>Y-axis</th>\n </tr>\n </thead>\n <tbody>\n @for (rtKey of DATA_POINT_TOTAL_TYPES; track rtKey) {\n @let configColor = getConfigColor(rtKey);\n <ng-container [formGroupName]=\"rtKey\">\n <tr>\n <td class=\"text-no-wrap\">\n <div class=\"d-inline-flex a-i-center\">\n <label class=\"c8y-checkbox c8y-checkbox--inline m-b-0 m-r-4\">\n <input\n type=\"checkbox\"\n formControlName=\"enabled\"\n />\n <span></span>\n <span></span>\n </label>\n <div\n class=\"c8y-colorpicker m-r-4\"\n (click)=\"$event.stopPropagation()\"\n >\n <input\n [attr.aria-label]=\"rtKey + ' color'\"\n type=\"color\"\n [value]=\"configColor\"\n (input)=\"setConfigColor(rtKey, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"configColor\"></span>\n </div>\n <span>{{ getRenderTypeLabel(rtKey) | translate }}</span>\n </div>\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMin\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMax\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n </tr>\n </ng-container>\n }\n </tbody>\n </table>\n </div>\n </ng-container>\n </fieldset>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointChartAdvancedOptionsComponent, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: 'c8y-datapoint-chart-advanced-options', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
92
+ ReactiveFormsModule,
93
+ C8yTranslateDirective,
94
+ C8yTranslatePipe,
95
+ PopoverDirective,
96
+ TooltipDirective
97
+ ], template: "<ng-container [formGroup]=\"chartFormGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Data point values' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Statistics that describe the spread of values within each time bucket. These share the same unit and scale as the original measurement'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </legend>\n <div class=\"table-responsive\">\n <table class=\"table table-condensed m-b-0 bg-inherit\">\n <thead>\n <tr>\n <th translate>Display</th>\n <th translate>Range min</th>\n <th translate>Range max</th>\n <th translate>Chart type</th>\n <th translate>Y-axis</th>\n </tr>\n </thead>\n <tbody>\n <ng-container formGroupName=\"renderTypeConfigs\">\n @for (rtKey of DATA_POINT_VALUE_TYPES; track rtKey) {\n @let configColor = getConfigColor(rtKey);\n <ng-container [formGroupName]=\"rtKey\">\n <tr>\n <td class=\"text-no-wrap\">\n <div class=\"d-inline-flex a-i-center\">\n <label class=\"c8y-checkbox c8y-checkbox--inline m-b-0 m-r-4\">\n <input\n type=\"checkbox\"\n formControlName=\"enabled\"\n />\n <span></span>\n <span></span>\n </label>\n <div\n class=\"c8y-colorpicker m-r-4\"\n (click)=\"$event.stopPropagation()\"\n >\n <input\n [attr.aria-label]=\"rtKey + ' color'\"\n type=\"color\"\n [value]=\"configColor\"\n (input)=\"setConfigColor(rtKey, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"configColor\"></span>\n </div>\n <span>{{ getRenderTypeLabel(rtKey) | translate }}</span>\n </div>\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMin\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMax\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n </tr>\n </ng-container>\n }\n </ng-container>\n <tr>\n <td colspan=\"5\">\n <div\n class=\"d-flex a-i-center\"\n [tooltip]=\"\n chartFormGroup?.get('renderAsBand')?.disabled\n ? (renderAsBandDisabledTooltip | translate)\n : null\n \"\n container=\"body\"\n >\n <label\n class=\"c8y-checkbox m-b-0 m-r-4\"\n [class.disabled]=\"chartFormGroup?.get('renderAsBand')?.disabled\"\n >\n <input\n [attr.aria-label]=\"'Render as band' | translate\"\n type=\"checkbox\"\n formControlName=\"renderAsBand\"\n />\n <span></span>\n </label>\n <div\n class=\"c8y-colorpicker m-l-8 m-r-4\"\n [class.invisible]=\"!chartFormGroup?.get('renderAsBand')?.value\"\n (click)=\"$event.stopPropagation()\"\n >\n <input\n [attr.aria-label]=\"'Band color' | translate\"\n type=\"color\"\n [value]=\"chartFormGroup?.get('bandColor')?.value || defaultColors['avg']\"\n (input)=\"chartFormGroup?.get('bandColor')?.setValue($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n <span\n [style.background-color]=\"\n chartFormGroup?.get('bandColor')?.value || defaultColors['avg']\n \"\n ></span>\n </div>\n <span class=\"text-12\">\n {{ 'Render as band' | translate }}\n <small class=\"text-muted\">\n <em> &mdash; {{ 'replaces min/max lines with a shaded area' | translate }} </em>\n </small>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Data point totals' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Metrics that quantify the time bucket itself \u2014 how many readings the bucket captured, or their totals. These typically use a different scale.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </legend>\n <ng-container formGroupName=\"renderTypeConfigs\">\n <div class=\"table-responsive\">\n <table class=\"table table-condensed m-b-0 bg-inherit\">\n <thead>\n <tr>\n <th translate>Display</th>\n <th translate>Range min</th>\n <th translate>Range max</th>\n <th translate>Chart type</th>\n <th translate>Y-axis</th>\n </tr>\n </thead>\n <tbody>\n @for (rtKey of DATA_POINT_TOTAL_TYPES; track rtKey) {\n @let configColor = getConfigColor(rtKey);\n <ng-container [formGroupName]=\"rtKey\">\n <tr>\n <td class=\"text-no-wrap\">\n <div class=\"d-inline-flex a-i-center\">\n <label class=\"c8y-checkbox c8y-checkbox--inline m-b-0 m-r-4\">\n <input\n type=\"checkbox\"\n formControlName=\"enabled\"\n />\n <span></span>\n <span></span>\n </label>\n <div\n class=\"c8y-colorpicker m-r-4\"\n (click)=\"$event.stopPropagation()\"\n >\n <input\n [attr.aria-label]=\"rtKey + ' color'\"\n type=\"color\"\n [value]=\"configColor\"\n (input)=\"setConfigColor(rtKey, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"configColor\"></span>\n </div>\n <span>{{ getRenderTypeLabel(rtKey) | translate }}</span>\n </div>\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMin\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n </td>\n <td>\n <input\n class=\"form-control input-sm\"\n type=\"number\"\n formControlName=\"rangeMax\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n <td>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">{{ type.text | translate }}</option>\n }\n </select>\n </div>\n </td>\n </tr>\n </ng-container>\n }\n </tbody>\n </table>\n </div>\n </ng-container>\n </fieldset>\n</ng-container>\n" }]
98
+ }], propDecorators: { chartFormGroup: [{
99
+ type: Input
100
+ }], defaultColors: [{
101
+ type: Input
102
+ }] } });
47
103
 
48
104
  class DatapointAttributesFormValidationService {
49
105
  constructor(formBuilder) {
@@ -98,7 +154,12 @@ class DatapointAttributesFormValidationService {
98
154
  redRangeMax: redRange?.max,
99
155
  yellowRangeMin: yellowRange?.min,
100
156
  yellowRangeMax: yellowRange?.max,
101
- renderType: showChart ? chart?.renderType : display?.renderType,
157
+ renderType: showChart ? this.deriveRenderTypeFromConfigs(chart) : display?.renderType,
158
+ renderTypes: showChart ? this.deriveRenderTypesFromConfigs(chart) : undefined,
159
+ renderTypeColors: showChart ? this.deriveRenderTypeColorsFromConfigs(chart) : undefined,
160
+ renderAsBand: showChart ? chart?.renderAsBand : undefined,
161
+ bandColor: showChart ? chart?.bandColor : undefined,
162
+ renderTypeConfigs: showChart ? chart?.renderTypeConfigs : undefined,
102
163
  lineType: chart?.lineType,
103
164
  yAxisType: chart?.yAxisType
104
165
  };
@@ -108,7 +169,7 @@ class DatapointAttributesFormValidationService {
108
169
  if (!backendDataStructure) {
109
170
  return {};
110
171
  }
111
- const { __active, __target, __template, color, label, description, fragment, series, min, max, unit, target, redRangeMin, redRangeMax, yellowRangeMin, yellowRangeMax, renderType, lineType, yAxisType } = backendDataStructure;
172
+ const { __active, __target, __template, color, label, description, fragment, series, min, max, unit, target, redRangeMin, redRangeMax, yellowRangeMin, yellowRangeMax, renderType, renderTypes, lineType, yAxisType } = backendDataStructure;
112
173
  const obj = {
113
174
  __active,
114
175
  __target,
@@ -132,7 +193,18 @@ class DatapointAttributesFormValidationService {
132
193
  min: this.convertStringToNumber(yellowRangeMin),
133
194
  max: this.convertStringToNumber(yellowRangeMax)
134
195
  },
135
- chart: renderType || lineType || yAxisType ? { renderType, lineType, yAxisType } : undefined,
196
+ chart: renderType || lineType || yAxisType
197
+ ? {
198
+ renderType,
199
+ renderTypes: renderTypes || null,
200
+ renderTypeColors: backendDataStructure.renderTypeColors || null,
201
+ renderAsBand: backendDataStructure.renderAsBand || false,
202
+ bandColor: backendDataStructure.bandColor || null,
203
+ renderTypeConfigs: this.buildRenderTypeConfigs(backendDataStructure),
204
+ lineType,
205
+ yAxisType
206
+ }
207
+ : undefined,
136
208
  display: renderType ? { renderType } : undefined
137
209
  };
138
210
  return obj;
@@ -185,8 +257,30 @@ class DatapointAttributesFormValidationService {
185
257
  getChartFormGroup() {
186
258
  return this.formBuilder.group({
187
259
  renderType: [CHART_RENDER_TYPES[0].val, []],
260
+ renderTypes: [null, []],
261
+ renderTypeColors: [null, []],
262
+ renderAsBand: [false, []],
263
+ bandColor: [null, []],
188
264
  lineType: [CHART_LINE_TYPES[0].val, []],
189
- yAxisType: [AXIS_TYPES[0].val, []]
265
+ yAxisType: [AXIS_TYPES[0].val, []],
266
+ renderTypeConfigs: this.getRenderTypeConfigsFormGroup()
267
+ });
268
+ }
269
+ getRenderTypeConfigsFormGroup() {
270
+ const group = {};
271
+ for (const rt of CHART_RENDER_TYPES) {
272
+ group[rt.val] = this.getRenderTypeConfigFormGroup(rt.val === 'avg', DEFAULT_RENDER_TYPE_LINE_TYPES[rt.val] || 'line');
273
+ }
274
+ return this.formBuilder.group(group);
275
+ }
276
+ getRenderTypeConfigFormGroup(enabled, lineType) {
277
+ return this.formBuilder.group({
278
+ enabled: [enabled, []],
279
+ color: [null, []],
280
+ rangeMin: [null, []],
281
+ rangeMax: [null, []],
282
+ lineType: [lineType, []],
283
+ yAxisType: [null, []]
190
284
  });
191
285
  }
192
286
  getDisplayFormGroup() {
@@ -213,14 +307,84 @@ class DatapointAttributesFormValidationService {
213
307
  return possibleString;
214
308
  }
215
309
  }
216
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointAttributesFormValidationService, deps: [{ token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); }
310
+ /**
311
+ * Derives the primary `renderType` from `renderTypeConfigs`.
312
+ * Returns the first enabled type, or falls back to `chart.renderType`.
313
+ */
314
+ deriveRenderTypeFromConfigs(chart) {
315
+ const configs = chart?.renderTypeConfigs;
316
+ if (!configs) {
317
+ return chart?.renderType;
318
+ }
319
+ const firstEnabled = Object.keys(configs).find(key => configs[key]?.enabled);
320
+ return firstEnabled || chart?.renderType || 'avg';
321
+ }
322
+ /**
323
+ * Builds `renderTypeConfigs` from backend data, supporting both new format (already has configs)
324
+ * and legacy format (only has renderType/renderTypes/renderTypeColors).
325
+ */
326
+ buildRenderTypeConfigs(backend) {
327
+ if (backend.renderTypeConfigs) {
328
+ return backend.renderTypeConfigs;
329
+ }
330
+ // Reconstruct from legacy renderTypes / renderType / renderTypeColors
331
+ const enabledTypes = backend.renderTypes?.length
332
+ ? backend.renderTypes
333
+ : backend.renderType
334
+ ? [backend.renderType]
335
+ : ['avg'];
336
+ const colors = backend.renderTypeColors || {};
337
+ const configs = {};
338
+ for (const rt of CHART_RENDER_TYPES) {
339
+ configs[rt.val] = {
340
+ enabled: enabledTypes.includes(rt.val),
341
+ color: colors[rt.val] || null,
342
+ rangeMin: null,
343
+ rangeMax: null,
344
+ lineType: DEFAULT_RENDER_TYPE_LINE_TYPES[rt.val] || 'line',
345
+ yAxisType: null
346
+ };
347
+ }
348
+ return configs;
349
+ }
350
+ /**
351
+ * Derives the `renderTypes` array from `renderTypeConfigs`.
352
+ * If configs exist, returns enabled types; otherwise falls back to `chart.renderTypes`.
353
+ */
354
+ deriveRenderTypesFromConfigs(chart) {
355
+ const configs = chart?.renderTypeConfigs;
356
+ if (!configs) {
357
+ return chart?.renderTypes || null;
358
+ }
359
+ const enabled = Object.keys(configs).filter(key => configs[key]?.enabled);
360
+ return enabled.length ? enabled : null;
361
+ }
362
+ /**
363
+ * Derives the `renderTypeColors` map from `renderTypeConfigs`.
364
+ * If configs exist, builds a color map from types that have a custom color set.
365
+ */
366
+ deriveRenderTypeColorsFromConfigs(chart) {
367
+ const configs = chart?.renderTypeConfigs;
368
+ if (!configs) {
369
+ return chart?.renderTypeColors || null;
370
+ }
371
+ const colors = {};
372
+ for (const key of Object.keys(configs)) {
373
+ if (configs[key]?.enabled && configs[key]?.color) {
374
+ colors[key] = configs[key].color;
375
+ }
376
+ }
377
+ return Object.keys(colors).length ? colors : null;
378
+ }
379
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointAttributesFormValidationService, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); }
217
380
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointAttributesFormValidationService, providedIn: 'root' }); }
218
381
  }
219
382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointAttributesFormValidationService, decorators: [{
220
383
  type: Injectable,
221
384
  args: [{ providedIn: 'root' }]
222
- }], ctorParameters: () => [{ type: i2.FormBuilder }] });
385
+ }], ctorParameters: () => [{ type: i1.FormBuilder }] });
223
386
 
387
+ const DEFAULT_DATAPOINT_COLOR = '#1776bf';
224
388
  class DatapointAttributesFormComponent {
225
389
  constructor(formValidations) {
226
390
  this.formValidations = formValidations;
@@ -241,6 +405,7 @@ class DatapointAttributesFormComponent {
241
405
  this.CHART_LINE_TYPES = Array.from(CHART_LINE_TYPES);
242
406
  this.AXIS_TYPES = Array.from(AXIS_TYPES);
243
407
  this.DEFAULT_RENDER_TYPES = ['min', 'max', 'area'];
408
+ this.destroyRef = inject(DestroyRef);
244
409
  this.customValidationErrorMessages = {};
245
410
  this.shouldForceInitialValidation = true;
246
411
  this.formGroup = this.formValidations.getDefaultFormGroup();
@@ -249,6 +414,8 @@ class DatapointAttributesFormComponent {
249
414
  ngOnInit() {
250
415
  this.initializeFormVisibility();
251
416
  this.filterChartTypes();
417
+ this.syncLastEnabledRenderType();
418
+ this.syncRenderAsBandWithMinMax();
252
419
  }
253
420
  ngOnChanges(changes) {
254
421
  if (changes.showAdvancedChartOptions) {
@@ -273,6 +440,7 @@ class DatapointAttributesFormComponent {
273
440
  emitEvent: false
274
441
  });
275
442
  }
443
+ this.updateRenderAsBandState();
276
444
  if (this.shouldForceInitialValidation) {
277
445
  queueMicrotask(() => {
278
446
  this.formGroup.updateValueAndValidity();
@@ -292,7 +460,105 @@ class DatapointAttributesFormComponent {
292
460
  if (this.formGroup?.disabled === isDisabled) {
293
461
  return;
294
462
  }
295
- isDisabled ? this.formGroup.disable() : this.formGroup.enable();
463
+ if (isDisabled) {
464
+ this.formGroup.disable();
465
+ }
466
+ else {
467
+ this.formGroup.enable();
468
+ }
469
+ }
470
+ /** Precomputed default shade colors for each render type, passed to the advanced options component. */
471
+ get renderTypeDefaultColors() {
472
+ const result = {};
473
+ for (const rt of CHART_RENDER_TYPES) {
474
+ if (rt.val !== 'area') {
475
+ result[rt.val] = this.getRenderTypeColor(rt.val);
476
+ }
477
+ }
478
+ return result;
479
+ }
480
+ /** Get the current custom color for a specific render type, or an auto-generated shade of the main color. */
481
+ getRenderTypeColor(renderType) {
482
+ const colors = this.chart?.get('renderTypeColors')?.value;
483
+ if (colors?.[renderType]) {
484
+ return colors[renderType];
485
+ }
486
+ const baseColor = this.formGroup?.get('color')?.value || DEFAULT_DATAPOINT_COLOR;
487
+ return this.getRenderTypeColorFromBase(baseColor, renderType);
488
+ }
489
+ /**
490
+ * Generates a shade of `baseColor` for the given render type using luminance offsets
491
+ * matching the Cumulocity brand palette: avg = base, min/count darker, max/sum lighter.
492
+ */
493
+ getRenderTypeColorFromBase(baseColor, renderType) {
494
+ const SHADE_OFFSETS = { count: -2, min: -1, avg: 0, max: 1, sum: 2 };
495
+ const offset = SHADE_OFFSETS[renderType];
496
+ if (offset === undefined || offset === 0) {
497
+ return baseColor;
498
+ }
499
+ try {
500
+ const referenceShades = [
501
+ '#134158',
502
+ '#1C5569',
503
+ '#058192', // primary color
504
+ '#22A6AA',
505
+ '#3CC1B7',
506
+ '#8ADBD5',
507
+ '#C5EDEA',
508
+ '#EBF9F8'
509
+ ];
510
+ // Calculate the luminance of the reference shades
511
+ const referenceLuminances = referenceShades.map(color => chroma(color).luminance());
512
+ const targetIndex = 2 + offset;
513
+ if (targetIndex < 0 || targetIndex >= referenceLuminances.length) {
514
+ return baseColor;
515
+ }
516
+ const luminanceDelta = referenceLuminances[targetIndex] - referenceLuminances[2];
517
+ const targetLuminance = Math.max(0, Math.min(1, chroma(baseColor).luminance() + luminanceDelta));
518
+ return chroma(baseColor).luminance(targetLuminance).hex();
519
+ }
520
+ catch {
521
+ return baseColor;
522
+ }
523
+ }
524
+ syncLastEnabledRenderType() {
525
+ const renderTypeConfigs = this.chart?.get('renderTypeConfigs');
526
+ if (!renderTypeConfigs)
527
+ return;
528
+ const allKeys = [...DATA_POINT_VALUE_TYPES, ...DATA_POINT_TOTAL_TYPES];
529
+ allKeys.forEach(key => {
530
+ renderTypeConfigs
531
+ .get(`${key}.enabled`)
532
+ ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
533
+ .subscribe((enabled) => {
534
+ if (!enabled && allKeys.every(k => !renderTypeConfigs.get(`${k}.enabled`)?.value)) {
535
+ renderTypeConfigs.get(`${key}.enabled`)?.setValue(true);
536
+ }
537
+ });
538
+ });
539
+ }
540
+ syncRenderAsBandWithMinMax() {
541
+ const renderTypeConfigs = this.chart?.get('renderTypeConfigs');
542
+ if (!renderTypeConfigs)
543
+ return;
544
+ renderTypeConfigs.valueChanges
545
+ .pipe(takeUntilDestroyed(this.destroyRef))
546
+ .subscribe(() => this.updateRenderAsBandState());
547
+ }
548
+ updateRenderAsBandState() {
549
+ const renderTypeConfigs = this.chart?.get('renderTypeConfigs');
550
+ const renderAsBand = this.chart?.get('renderAsBand');
551
+ if (!renderTypeConfigs || !renderAsBand)
552
+ return;
553
+ const canUseBand = renderTypeConfigs.get('min.enabled')?.value && renderTypeConfigs.get('max.enabled')?.value;
554
+ if (!canUseBand) {
555
+ if (renderAsBand.value)
556
+ renderAsBand.setValue(false, { emitEvent: true });
557
+ renderAsBand.disable({ emitEvent: false });
558
+ }
559
+ else {
560
+ renderAsBand.enable({ emitEvent: false });
561
+ }
296
562
  }
297
563
  setSubForms() {
298
564
  if (!this.formGroup) {
@@ -350,7 +616,7 @@ class DatapointAttributesFormComponent {
350
616
  useExisting: forwardRef(() => DatapointAttributesFormComponent),
351
617
  multi: true
352
618
  }
353
- ], usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n @if (!rawValue?.__template || showFormIfTemplateWasSelected) {\n @if (formGroup.controls?.label || formGroup.controls?.unit || formGroup.controls?.target) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Details</legend>\n <div class=\"row\">\n @if (formGroup.controls?.label) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Temperature' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.label.touched && formGroup.controls.label.errors\"\n >\n @for (item of customValidationErrorMessages['label'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.unit) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.unit.touched && formGroup.controls.unit.errors\"\n >\n @for (item of customValidationErrorMessages['unit'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.target && showTarget) {\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n class=\"form-control\"\n name=\"target\"\n type=\"number\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls.target.errors\n \"\n >\n @for (\n item of customValidationErrorMessages['target'] | keyvalue;\n track item.key\n ) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (range && showRange) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div\n class=\"row\"\n formGroupName=\"range\"\n >\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\">\n @for (item of customValidationErrorMessages['max'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (yellowRange && showYellowRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"yellowRange\"\n >\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (redRange && showRedRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"redRange\"\n >\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n }\n\n @if (showChartForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"chart\"\n >\n <legend translate>Chart</legend>\n <div class=\"tight-grid\">\n @if (selectableChartRenderTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableChartLineTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"chartType\"\n translate\n >\n Chart type\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableAxisTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"yAxis\"\n translate\n >\n Y-axis\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (showOnlyDisplayForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"display\"\n >\n <legend>\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n </legend>\n <div class=\"tight-grid\">\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm m-b-16\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n</div>\n\n<ng-template #displayHelpButton>\n <label>\n {{ 'Display' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'Value displayed when data is aggregated' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </label>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] }); }
619
+ ], usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n @if (!rawValue?.__template || showFormIfTemplateWasSelected) {\n @if (formGroup.controls?.label || formGroup.controls?.unit || formGroup.controls?.target) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Details</legend>\n <div class=\"row\">\n @if (formGroup.controls?.label) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Temperature' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.label.touched && formGroup.controls.label.errors\"\n >\n @for (item of customValidationErrorMessages['label'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.unit) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.unit.touched && formGroup.controls.unit.errors\"\n >\n @for (item of customValidationErrorMessages['unit'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.target && showTarget) {\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n class=\"form-control\"\n name=\"target\"\n type=\"number\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls.target.errors\n \"\n >\n @for (\n item of customValidationErrorMessages['target'] | keyvalue;\n track item.key\n ) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (range && showRange) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div\n class=\"row\"\n formGroupName=\"range\"\n >\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\">\n @for (item of customValidationErrorMessages['max'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (yellowRange && showYellowRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"yellowRange\"\n >\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (redRange && showRedRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"redRange\"\n >\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n }\n\n @if (showChartForm && showAdvancedChartOptions) {\n <c8y-datapoint-chart-advanced-options\n [chartFormGroup]=\"chart\"\n [defaultColors]=\"renderTypeDefaultColors\"\n ></c8y-datapoint-chart-advanced-options>\n }\n @if (showChartForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"chart\"\n >\n <legend translate>Chart</legend>\n <div class=\"tight-grid\">\n @if (!showAdvancedChartOptions && selectableChartRenderTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableChartLineTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"chartType\"\n translate\n >\n Chart type\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableAxisTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"yAxis\"\n translate\n >\n Y-axis\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (showOnlyDisplayForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"display\"\n >\n <legend>\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n </legend>\n <div class=\"tight-grid\">\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm m-b-16\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n</div>\n\n<ng-template #displayHelpButton>\n <label>\n {{ 'Display' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'Value displayed when data is aggregated' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </label>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: DatapointChartAdvancedOptionsComponent, selector: "c8y-datapoint-chart-advanced-options", inputs: ["chartFormGroup", "defaultColors"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] }); }
354
620
  }
355
621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointAttributesFormComponent, decorators: [{
356
622
  type: Component,
@@ -377,8 +643,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
377
643
  NgTemplateOutlet,
378
644
  PopoverDirective,
379
645
  C8yTranslatePipe,
646
+ DatapointChartAdvancedOptionsComponent,
380
647
  KeyValuePipe
381
- ], template: "<div [formGroup]=\"formGroup\">\n @if (!rawValue?.__template || showFormIfTemplateWasSelected) {\n @if (formGroup.controls?.label || formGroup.controls?.unit || formGroup.controls?.target) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Details</legend>\n <div class=\"row\">\n @if (formGroup.controls?.label) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Temperature' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.label.touched && formGroup.controls.label.errors\"\n >\n @for (item of customValidationErrorMessages['label'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.unit) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.unit.touched && formGroup.controls.unit.errors\"\n >\n @for (item of customValidationErrorMessages['unit'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.target && showTarget) {\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n class=\"form-control\"\n name=\"target\"\n type=\"number\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls.target.errors\n \"\n >\n @for (\n item of customValidationErrorMessages['target'] | keyvalue;\n track item.key\n ) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (range && showRange) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div\n class=\"row\"\n formGroupName=\"range\"\n >\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\">\n @for (item of customValidationErrorMessages['max'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (yellowRange && showYellowRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"yellowRange\"\n >\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (redRange && showRedRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"redRange\"\n >\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n }\n\n @if (showChartForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"chart\"\n >\n <legend translate>Chart</legend>\n <div class=\"tight-grid\">\n @if (selectableChartRenderTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableChartLineTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"chartType\"\n translate\n >\n Chart type\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableAxisTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"yAxis\"\n translate\n >\n Y-axis\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (showOnlyDisplayForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"display\"\n >\n <legend>\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n </legend>\n <div class=\"tight-grid\">\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm m-b-16\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n</div>\n\n<ng-template #displayHelpButton>\n <label>\n {{ 'Display' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'Value displayed when data is aggregated' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </label>\n</ng-template>\n" }]
648
+ ], template: "<div [formGroup]=\"formGroup\">\n @if (!rawValue?.__template || showFormIfTemplateWasSelected) {\n @if (formGroup.controls?.label || formGroup.controls?.unit || formGroup.controls?.target) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Details</legend>\n <div class=\"row\">\n @if (formGroup.controls?.label) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'Temperature' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.label.touched && formGroup.controls.label.errors\"\n >\n @for (item of customValidationErrorMessages['label'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.unit) {\n <div class=\"col-md-6\">\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls.unit.touched && formGroup.controls.unit.errors\"\n >\n @for (item of customValidationErrorMessages['unit'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n @if (formGroup.controls?.target && showTarget) {\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n class=\"form-control\"\n name=\"target\"\n type=\"number\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls.target.touched) &&\n formGroup.controls.target.errors\n \"\n >\n @for (\n item of customValidationErrorMessages['target'] | keyvalue;\n track item.key\n ) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (range && showRange) {\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div\n class=\"row\"\n formGroupName=\"range\"\n >\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\">\n @for (item of customValidationErrorMessages['max'] | keyvalue; track item.key) {\n <c8y-message\n [name]=\"item.key\"\n [text]=\"item.value\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (yellowRange && showYellowRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"yellowRange\"\n >\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n @if (redRange && showRedRange) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"redRange\"\n >\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n class=\"form-control\"\n name=\"min\"\n type=\"number\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n class=\"form-group-sm\"\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n class=\"form-control\"\n name=\"max\"\n type=\"number\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n }\n\n @if (showChartForm && showAdvancedChartOptions) {\n <c8y-datapoint-chart-advanced-options\n [chartFormGroup]=\"chart\"\n [defaultColors]=\"renderTypeDefaultColors\"\n ></c8y-datapoint-chart-advanced-options>\n }\n @if (showChartForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"chart\"\n >\n <legend translate>Chart</legend>\n <div class=\"tight-grid\">\n @if (!showAdvancedChartOptions && selectableChartRenderTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableChartLineTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"chartType\"\n translate\n >\n Chart type\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"lineType\"\n >\n @for (type of CHART_LINE_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n @if (selectableAxisTypes?.length !== 0) {\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm\">\n <label\n for=\"yAxis\"\n translate\n >\n Y-axis\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"yAxisType\"\n >\n @for (type of AXIS_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n </fieldset>\n }\n @if (showOnlyDisplayForm) {\n <fieldset\n class=\"c8y-fieldset\"\n formGroupName=\"display\"\n >\n <legend>\n <ng-container *ngTemplateOutlet=\"displayHelpButton\"></ng-container>\n </legend>\n <div class=\"tight-grid\">\n <div class=\"col-xs-6 col-sm-4\">\n <c8y-form-group class=\"form-group-sm m-b-16\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"renderType\"\n >\n @for (type of CHART_RENDER_TYPES; track type.val) {\n <option [ngValue]=\"type.val\">\n {{ type.text | translate }}\n </option>\n }\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n }\n</div>\n\n<ng-template #displayHelpButton>\n <label>\n {{ 'Display' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'Value displayed when data is aggregated' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n ></button>\n </label>\n</ng-template>\n" }]
382
649
  }], ctorParameters: () => [{ type: DatapointAttributesFormValidationService }], propDecorators: { selectableChartRenderTypes: [{
383
650
  type: Input
384
651
  }], selectableChartLineTypes: [{
@@ -607,13 +874,13 @@ class DatapointLibraryService {
607
874
  return [];
608
875
  }
609
876
  }
610
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointLibraryService, deps: [{ token: i1.InventoryService }, { token: i2$1.AppStateService }, { token: i1.MeasurementService }, { token: i2$1.ColorService }], target: i0.ɵɵFactoryTarget.Injectable }); }
877
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointLibraryService, deps: [{ token: i1$1.InventoryService }, { token: i2.AppStateService }, { token: i1$1.MeasurementService }, { token: i2.ColorService }], target: i0.ɵɵFactoryTarget.Injectable }); }
611
878
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointLibraryService, providedIn: 'root' }); }
612
879
  }
613
880
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointLibraryService, decorators: [{
614
881
  type: Injectable,
615
882
  args: [{ providedIn: 'root' }]
616
- }], ctorParameters: () => [{ type: i1.InventoryService }, { type: i2$1.AppStateService }, { type: i1.MeasurementService }, { type: i2$1.ColorService }] });
883
+ }], ctorParameters: () => [{ type: i1$1.InventoryService }, { type: i2.AppStateService }, { type: i1$1.MeasurementService }, { type: i2.ColorService }] });
617
884
 
618
885
  class DatapointTemplatePopoverComponent {
619
886
  constructor() {
@@ -800,7 +1067,7 @@ class DatapointSelectorListItemComponent {
800
1067
  delete obj.details;
801
1068
  return obj;
802
1069
  }
803
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorListItemComponent, deps: [{ token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
1070
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorListItemComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
804
1071
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DatapointSelectorListItemComponent, isStandalone: true, selector: "c8y-datapoint-selector-list-item", inputs: { defaultFormOptions: "defaultFormOptions", isSelected: "isSelected", isCollapsed: "isCollapsed", addButtonType: "addButtonType", editable: "editable", showActiveToggle: "showActiveToggle", activeToggleDisabled: "activeToggleDisabled", showOptions: "showOptions", datapointLibraryEntries: "datapointLibraryEntries", actions: "actions", optionToRemove: "optionToRemove", hasUnlinkTemplateOption: "hasUnlinkTemplateOption", colorPickerDisabled: "colorPickerDisabled", disableTypeaheadIfSelected: "disableTypeaheadIfSelected", highlightText: "highlightText" }, outputs: { added: "added", removed: "removed" }, providers: [
805
1072
  {
806
1073
  provide: NG_VALUE_ACCESSOR,
@@ -812,7 +1079,7 @@ class DatapointSelectorListItemComponent {
812
1079
  useExisting: forwardRef(() => DatapointSelectorListItemComponent),
813
1080
  multi: true
814
1081
  }
815
- ], queries: [{ propertyName: "dragHandle", first: true, predicate: ListItemDragHandleComponent, descendants: true }], ngImport: i0, template: "<c8y-li\n class=\"c8y-list__item__collapse--container-small\"\n [formGroup]=\"formGroup\"\n #li\n>\n <c8y-li-drag-handle><ng-content select=\"c8y-li-drag-handle\"></ng-content></c8y-li-drag-handle>\n @if (showActiveToggle) {\n <c8y-li-checkbox\n class=\"a-s-center p-r-0\"\n [displayAsSwitch]=\"true\"\n formControlName=\"__active\"\n (click)=\"$event.stopPropagation()\"\n ></c8y-li-checkbox>\n }\n\n <div class=\"d-flex a-i-center\">\n <div\n class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-16\"\n [title]=\"'Change color' | translate\"\n >\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color' | translate\"\n type=\"color\"\n formControlName=\"color\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"formGroup.value.color\"></span>\n </div>\n </div>\n <button\n class=\"btn-clean data-point-label text-truncate\"\n [attr.aria-expanded]=\"!li.collapsed\"\n type=\"button\"\n (click)=\"li.collapsed = !li.collapsed\"\n >\n <span\n class=\"text-truncate\"\n [title]=\"formGroup.value.details?.label\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.details?.label\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n @if (formGroup.value.__target) {\n <small class=\"text-truncate text-muted icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n <span class=\"text-truncate\">{{ formGroup.value.__target.name }}</span>\n </small>\n }\n </button>\n\n @if (!(isValid$ | async)) {\n @let defaultErrorMessage =\n 'Some entries are invalid. Check the input fields with red borders.' | translate;\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto m-r-4\"\n [attr.aria-label]=\"'Invalid' | translate\"\n [popover]=\"errorMessage ? errorMessage : defaultErrorMessage\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"exclamation-circle\"></i>\n </button>\n }\n @if (addButtonType === AddButtonTypes.addRemove) {\n <div class=\"m-l-auto a-s-center p-r-4\">\n @if (isSelected) {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n [tooltip]=\"'Remove from selected data points' | translate\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"addOrRemoveItem()\"\n [attr.data-cy]=\"'datapoint-selector-list-item--remove-datapoint-button'\"\n >\n <i\n class=\"icon-20\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n }\n @if (!isSelected) {\n <button\n class=\"btn btn-dot text-primary\"\n [attr.aria-label]=\"'Add to selected data points' | translate\"\n [tooltip]=\"'Add to selected data points' | translate\"\n type=\"button\"\n [delay]=\"500\"\n [disabled]=\"!(isValid$ | async)\"\n (click)=\"addOrRemoveItem()\"\n [attr.data-cy]=\"'datapoint-selector-list-item--add-datapoint-button'\"\n >\n <i\n class=\"text-primary icon-20\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n }\n </div>\n }\n @if (addButtonType === AddButtonTypes.select) {\n <button\n class=\"btn btn-default btn-sm m-l-auto\"\n [attr.aria-label]=\"'Select' | translate\"\n [tooltip]=\"'Select data point' | translate\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"addOrRemoveItem()\"\n >\n {{ 'Select' | translate }}\n </button>\n }\n\n @if (optionToRemove && !actions?.length) {\n <button\n class=\"m-l-auto showOnHover btn btn-dot btn-dot--danger m-r-4\"\n [attr.aria-label]=\"'Remove from list' | translate\"\n [tooltip]=\"'Remove from list' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"remove()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n }\n </div>\n\n @if (optionToRemove && actions?.length) {\n <c8y-li-action\n [icon]=\"'minus-circle'\"\n [label]=\"'Remove from list' | translate\"\n (click)=\"remove()\"\n ></c8y-li-action>\n }\n @for (action of actions; track action) {\n <c8y-li-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n (click)=\"action.callback(formGroup.value)\"\n ></c8y-li-action>\n }\n @if (editable) {\n <c8y-li-collapse>\n <div class=\"data-point-details\">\n <ul class=\"list-unstyled small m-b-16\">\n <li class=\"p-t-4 p-b-4 d-flex separator-top-bottom\">\n <label\n class=\"small m-b-0 m-r-8 a-s-start text-muted\"\n translate\n >\n Fragment\n </label>\n <span\n class=\"m-l-auto text-truncate\"\n title=\"{{ formGroup.value.fragment }}\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.fragment\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom\">\n <label\n class=\"small m-b-0 m-r-8 a-s-start text-muted\"\n translate\n >\n Series\n </label>\n <span\n class=\"m-l-auto text-truncate\"\n title=\"{{ formGroup.value.series }}\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.series\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n </li>\n </ul>\n @if (datapointLibraryEntries && datapointLibraryEntries | async; as libraryEntries) {\n <div class=\"form-group form-group-sm\">\n <label>\n {{ 'Data point template' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"datapointHintPopoverTemplate\"\n placement=\"top\"\n triggers=\"focus\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </label>\n\n <ng-template #datapointHintPopoverTemplate>\n {{\n 'Using a data point template sets color, label, unit and ranges. Removing the template allows you to set the values manually.'\n | translate\n }}\n </ng-template>\n <div class=\"input-group input-group-sm\">\n @if (datapointLibraryEntries) {\n <c8y-typeahead\n class=\"flex-grow\"\n [placeholder]=\"'No template' | translate\"\n [ngModel]=\"formGroup.value.__template ? formGroup.value.details : undefined\"\n [ngModelOptions]=\"{ standalone: true }\"\n (onSearch)=\"setPipe($event)\"\n [displayProperty]=\"'label'\"\n [hideNew]=\"true\"\n [disabled]=\"isSelected && disableTypeaheadIfSelected\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link interact\"\n *c8yFor=\"\n let item of datapointLibraryEntries;\n loadMore: 'auto';\n pipe: filterPipe;\n notFound: notFoundTemplate\n \"\n (click)=\"dataPointTemplateSelected(item)\"\n [active]=\"formGroup.value.__template === item.id\"\n [attr.role]=\"'menuitem'\"\n >\n <c8y-highlight\n [text]=\"item.c8y_Kpi?.label\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n <c8y-li-icon\n icon=\"circle\"\n [style.color]=\"item.c8y_Kpi?.color\"\n ></c8y-li-icon>\n </c8y-li>\n <ng-template #notFoundTemplate>\n @if (pattern.length > 0) {\n <c8y-li class=\"bg-level-2 p-8\">\n <span>{{ 'No match found.' | translate }}</span>\n </c8y-li>\n }\n </ng-template>\n </c8y-typeahead>\n }\n <div class=\"input-group-btn\">\n @if (formGroup.value.__template) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Info' | translate\"\n [popover]=\"datapointOverviewPopoverTemplate\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n }\n </div>\n <div class=\"input-group-btn\">\n @if (formGroup.value.__template && hasUnlinkTemplateOption) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Unlink data point template' | translate\"\n tooltip=\"{{ 'Unlink data point template' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"unlinkDatapointTemplate()\"\n >\n <i c8yIcon=\"unlink\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n }\n <ng-template #datapointOverviewPopoverTemplate>\n <c8y-datapoint-template-popover\n [datapoint]=\"formGroup.value.details\"\n ></c8y-datapoint-template-popover>\n </ng-template>\n @if (defaultFormOptions) {\n <c8y-datapoint-attributes-form\n [showTarget]=\"defaultFormOptions.showTarget\"\n [showRange]=\"defaultFormOptions.showRange\"\n [showYellowRange]=\"defaultFormOptions.showYellowRange\"\n [showRedRange]=\"defaultFormOptions.showRedRange\"\n [showChart]=\"defaultFormOptions.showChart\"\n [showFormIfTemplateWasSelected]=\"defaultFormOptions.showFormIfTemplateWasSelected\"\n [selectableChartRenderTypes]=\"defaultFormOptions.selectableChartRenderTypes\"\n [selectableChartLineTypes]=\"defaultFormOptions.selectableChartLineTypes\"\n [selectableAxisTypes]=\"defaultFormOptions.selectableAxisTypes\"\n [showAdvancedChartOptions]=\"defaultFormOptions.showAdvancedChartOptions\"\n [showErrorsImmediately]=\"true\"\n formControlName=\"details\"\n ></c8y-datapoint-attributes-form>\n }\n </div>\n </c8y-li-collapse>\n }\n</c8y-li>\n", dependencies: [{ kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "component", type: ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: ListItemActionComponent, selector: "c8y-list-item-action, c8y-li-action", inputs: ["label", "icon", "disabled"], outputs: ["click"] }, { kind: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "title", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: DatapointTemplatePopoverComponent, selector: "c8y-datapoint-template-popover", inputs: ["datapoint", "attributes"] }, { kind: "component", type: DatapointAttributesFormComponent, selector: "c8y-datapoint-attributes-form", inputs: ["selectableChartRenderTypes", "selectableChartLineTypes", "selectableAxisTypes", "showTarget", "showRange", "showYellowRange", "showRedRange", "showChart", "showFormIfTemplateWasSelected", "showAdvancedChartOptions", "showErrorsImmediately"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
1082
+ ], queries: [{ propertyName: "dragHandle", first: true, predicate: ListItemDragHandleComponent, descendants: true }], ngImport: i0, template: "<c8y-li\n class=\"c8y-list__item__collapse--container-small\"\n [formGroup]=\"formGroup\"\n #li\n>\n <c8y-li-drag-handle><ng-content select=\"c8y-li-drag-handle\"></ng-content></c8y-li-drag-handle>\n @if (showActiveToggle) {\n <c8y-li-checkbox\n class=\"a-s-center p-r-0\"\n [displayAsSwitch]=\"true\"\n formControlName=\"__active\"\n (click)=\"$event.stopPropagation()\"\n ></c8y-li-checkbox>\n }\n\n <div class=\"d-flex a-i-center\">\n <div\n class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-16\"\n [title]=\"'Change color' | translate\"\n >\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color' | translate\"\n type=\"color\"\n formControlName=\"color\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"formGroup.value.color\"></span>\n </div>\n </div>\n <button\n class=\"btn-clean data-point-label text-truncate\"\n [attr.aria-expanded]=\"!li.collapsed\"\n type=\"button\"\n (click)=\"li.collapsed = !li.collapsed\"\n >\n <span\n class=\"text-truncate\"\n [title]=\"formGroup.value.details?.label\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.details?.label\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n @if (formGroup.value.__target) {\n <small class=\"text-truncate text-muted icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n <span class=\"text-truncate\">{{ formGroup.value.__target.name }}</span>\n </small>\n }\n </button>\n\n @if (!(isValid$ | async)) {\n @let defaultErrorMessage =\n 'Some entries are invalid. Check the input fields with red borders.' | translate;\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto m-r-4\"\n [attr.aria-label]=\"'Invalid' | translate\"\n [popover]=\"errorMessage ? errorMessage : defaultErrorMessage\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"exclamation-circle\"></i>\n </button>\n }\n @if (addButtonType === AddButtonTypes.addRemove) {\n <div class=\"m-l-auto a-s-center p-r-4\">\n @if (isSelected) {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n [tooltip]=\"'Remove from selected data points' | translate\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"addOrRemoveItem()\"\n [attr.data-cy]=\"'datapoint-selector-list-item--remove-datapoint-button'\"\n >\n <i\n class=\"icon-20\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n }\n @if (!isSelected) {\n <button\n class=\"btn btn-dot text-primary\"\n [attr.aria-label]=\"'Add to selected data points' | translate\"\n [tooltip]=\"'Add to selected data points' | translate\"\n type=\"button\"\n [delay]=\"500\"\n [disabled]=\"!(isValid$ | async)\"\n (click)=\"addOrRemoveItem()\"\n [attr.data-cy]=\"'datapoint-selector-list-item--add-datapoint-button'\"\n >\n <i\n class=\"text-primary icon-20\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n }\n </div>\n }\n @if (addButtonType === AddButtonTypes.select) {\n <button\n class=\"btn btn-default btn-sm m-l-auto\"\n [attr.aria-label]=\"'Select' | translate\"\n [tooltip]=\"'Select data point' | translate\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"addOrRemoveItem()\"\n >\n {{ 'Select' | translate }}\n </button>\n }\n\n @if (optionToRemove && !actions?.length) {\n <button\n class=\"m-l-auto showOnHover btn btn-dot btn-dot--danger m-r-4\"\n [attr.aria-label]=\"'Remove from list' | translate\"\n [tooltip]=\"'Remove from list' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"remove()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n }\n </div>\n\n @if (optionToRemove && actions?.length) {\n <c8y-li-action\n [icon]=\"'minus-circle'\"\n [label]=\"'Remove from list' | translate\"\n (click)=\"remove()\"\n ></c8y-li-action>\n }\n @for (action of actions; track action) {\n <c8y-li-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n (click)=\"action.callback(formGroup.value)\"\n ></c8y-li-action>\n }\n @if (editable) {\n <c8y-li-collapse>\n <div class=\"data-point-details\">\n <ul class=\"list-unstyled small m-b-16\">\n <li class=\"p-t-4 p-b-4 d-flex separator-top-bottom\">\n <label\n class=\"small m-b-0 m-r-8 a-s-start text-muted\"\n translate\n >\n Fragment\n </label>\n <span\n class=\"m-l-auto text-truncate\"\n title=\"{{ formGroup.value.fragment }}\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.fragment\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom\">\n <label\n class=\"small m-b-0 m-r-8 a-s-start text-muted\"\n translate\n >\n Series\n </label>\n <span\n class=\"m-l-auto text-truncate\"\n title=\"{{ formGroup.value.series }}\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.series\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n </li>\n </ul>\n @if (datapointLibraryEntries && datapointLibraryEntries | async; as libraryEntries) {\n <div class=\"form-group form-group-sm\">\n <label>\n {{ 'Data point template' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"datapointHintPopoverTemplate\"\n placement=\"top\"\n triggers=\"focus\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </label>\n\n <ng-template #datapointHintPopoverTemplate>\n {{\n 'Using a data point template sets color, label, unit and ranges. Removing the template allows you to set the values manually.'\n | translate\n }}\n </ng-template>\n <div class=\"input-group input-group-sm\">\n @if (datapointLibraryEntries) {\n <c8y-typeahead\n class=\"flex-grow\"\n [placeholder]=\"'No template' | translate\"\n [ngModel]=\"formGroup.value.__template ? formGroup.value.details : undefined\"\n [ngModelOptions]=\"{ standalone: true }\"\n (onSearch)=\"setPipe($event)\"\n [displayProperty]=\"'label'\"\n [hideNew]=\"true\"\n [disabled]=\"isSelected && disableTypeaheadIfSelected\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link interact\"\n *c8yFor=\"\n let item of datapointLibraryEntries;\n loadMore: 'auto';\n pipe: filterPipe;\n notFound: notFoundTemplate\n \"\n (click)=\"dataPointTemplateSelected(item)\"\n [active]=\"formGroup.value.__template === item.id\"\n [attr.role]=\"'menuitem'\"\n >\n <c8y-highlight\n [text]=\"item.c8y_Kpi?.label\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n <c8y-li-icon\n icon=\"circle\"\n [style.color]=\"item.c8y_Kpi?.color\"\n ></c8y-li-icon>\n </c8y-li>\n <ng-template #notFoundTemplate>\n @if (pattern.length > 0) {\n <c8y-li class=\"bg-level-2 p-8\">\n <span>{{ 'No match found.' | translate }}</span>\n </c8y-li>\n }\n </ng-template>\n </c8y-typeahead>\n }\n <div class=\"input-group-btn\">\n @if (formGroup.value.__template) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Info' | translate\"\n [popover]=\"datapointOverviewPopoverTemplate\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n }\n </div>\n <div class=\"input-group-btn\">\n @if (formGroup.value.__template && hasUnlinkTemplateOption) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Unlink data point template' | translate\"\n tooltip=\"{{ 'Unlink data point template' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"unlinkDatapointTemplate()\"\n >\n <i c8yIcon=\"unlink\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n }\n <ng-template #datapointOverviewPopoverTemplate>\n <c8y-datapoint-template-popover\n [datapoint]=\"formGroup.value.details\"\n ></c8y-datapoint-template-popover>\n </ng-template>\n @if (defaultFormOptions) {\n <c8y-datapoint-attributes-form\n [showTarget]=\"defaultFormOptions.showTarget\"\n [showRange]=\"defaultFormOptions.showRange\"\n [showYellowRange]=\"defaultFormOptions.showYellowRange\"\n [showRedRange]=\"defaultFormOptions.showRedRange\"\n [showChart]=\"defaultFormOptions.showChart\"\n [showFormIfTemplateWasSelected]=\"defaultFormOptions.showFormIfTemplateWasSelected\"\n [selectableChartRenderTypes]=\"defaultFormOptions.selectableChartRenderTypes\"\n [selectableChartLineTypes]=\"defaultFormOptions.selectableChartLineTypes\"\n [selectableAxisTypes]=\"defaultFormOptions.selectableAxisTypes\"\n [showAdvancedChartOptions]=\"defaultFormOptions.showAdvancedChartOptions\"\n [showErrorsImmediately]=\"true\"\n formControlName=\"details\"\n ></c8y-datapoint-attributes-form>\n }\n </div>\n </c8y-li-collapse>\n }\n</c8y-li>\n", dependencies: [{ kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "component", type: ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: ListItemActionComponent, selector: "c8y-list-item-action, c8y-li-action", inputs: ["label", "icon", "disabled"], outputs: ["click"] }, { kind: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "title", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: DatapointTemplatePopoverComponent, selector: "c8y-datapoint-template-popover", inputs: ["datapoint", "attributes"] }, { kind: "component", type: DatapointAttributesFormComponent, selector: "c8y-datapoint-attributes-form", inputs: ["selectableChartRenderTypes", "selectableChartLineTypes", "selectableAxisTypes", "showTarget", "showRange", "showYellowRange", "showRedRange", "showChart", "showFormIfTemplateWasSelected", "showAdvancedChartOptions", "showErrorsImmediately"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
816
1083
  }
817
1084
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorListItemComponent, decorators: [{
818
1085
  type: Component,
@@ -849,7 +1116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
849
1116
  C8yTranslatePipe,
850
1117
  AsyncPipe
851
1118
  ], template: "<c8y-li\n class=\"c8y-list__item__collapse--container-small\"\n [formGroup]=\"formGroup\"\n #li\n>\n <c8y-li-drag-handle><ng-content select=\"c8y-li-drag-handle\"></ng-content></c8y-li-drag-handle>\n @if (showActiveToggle) {\n <c8y-li-checkbox\n class=\"a-s-center p-r-0\"\n [displayAsSwitch]=\"true\"\n formControlName=\"__active\"\n (click)=\"$event.stopPropagation()\"\n ></c8y-li-checkbox>\n }\n\n <div class=\"d-flex a-i-center\">\n <div\n class=\"c8y-list__item__colorpicker p-t-0 p-b-0 p-l-16\"\n [title]=\"'Change color' | translate\"\n >\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color' | translate\"\n type=\"color\"\n formControlName=\"color\"\n (click)=\"$event.stopPropagation()\"\n />\n <span [style.background-color]=\"formGroup.value.color\"></span>\n </div>\n </div>\n <button\n class=\"btn-clean data-point-label text-truncate\"\n [attr.aria-expanded]=\"!li.collapsed\"\n type=\"button\"\n (click)=\"li.collapsed = !li.collapsed\"\n >\n <span\n class=\"text-truncate\"\n [title]=\"formGroup.value.details?.label\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.details?.label\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n @if (formGroup.value.__target) {\n <small class=\"text-truncate text-muted icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n <span class=\"text-truncate\">{{ formGroup.value.__target.name }}</span>\n </small>\n }\n </button>\n\n @if (!(isValid$ | async)) {\n @let defaultErrorMessage =\n 'Some entries are invalid. Check the input fields with red borders.' | translate;\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto m-r-4\"\n [attr.aria-label]=\"'Invalid' | translate\"\n [popover]=\"errorMessage ? errorMessage : defaultErrorMessage\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"exclamation-circle\"></i>\n </button>\n }\n @if (addButtonType === AddButtonTypes.addRemove) {\n <div class=\"m-l-auto a-s-center p-r-4\">\n @if (isSelected) {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove' | translate\"\n [tooltip]=\"'Remove from selected data points' | translate\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"addOrRemoveItem()\"\n [attr.data-cy]=\"'datapoint-selector-list-item--remove-datapoint-button'\"\n >\n <i\n class=\"icon-20\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n }\n @if (!isSelected) {\n <button\n class=\"btn btn-dot text-primary\"\n [attr.aria-label]=\"'Add to selected data points' | translate\"\n [tooltip]=\"'Add to selected data points' | translate\"\n type=\"button\"\n [delay]=\"500\"\n [disabled]=\"!(isValid$ | async)\"\n (click)=\"addOrRemoveItem()\"\n [attr.data-cy]=\"'datapoint-selector-list-item--add-datapoint-button'\"\n >\n <i\n class=\"text-primary icon-20\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n }\n </div>\n }\n @if (addButtonType === AddButtonTypes.select) {\n <button\n class=\"btn btn-default btn-sm m-l-auto\"\n [attr.aria-label]=\"'Select' | translate\"\n [tooltip]=\"'Select data point' | translate\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"addOrRemoveItem()\"\n >\n {{ 'Select' | translate }}\n </button>\n }\n\n @if (optionToRemove && !actions?.length) {\n <button\n class=\"m-l-auto showOnHover btn btn-dot btn-dot--danger m-r-4\"\n [attr.aria-label]=\"'Remove from list' | translate\"\n [tooltip]=\"'Remove from list' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"remove()\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n }\n </div>\n\n @if (optionToRemove && actions?.length) {\n <c8y-li-action\n [icon]=\"'minus-circle'\"\n [label]=\"'Remove from list' | translate\"\n (click)=\"remove()\"\n ></c8y-li-action>\n }\n @for (action of actions; track action) {\n <c8y-li-action\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n (click)=\"action.callback(formGroup.value)\"\n ></c8y-li-action>\n }\n @if (editable) {\n <c8y-li-collapse>\n <div class=\"data-point-details\">\n <ul class=\"list-unstyled small m-b-16\">\n <li class=\"p-t-4 p-b-4 d-flex separator-top-bottom\">\n <label\n class=\"small m-b-0 m-r-8 a-s-start text-muted\"\n translate\n >\n Fragment\n </label>\n <span\n class=\"m-l-auto text-truncate\"\n title=\"{{ formGroup.value.fragment }}\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.fragment\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom\">\n <label\n class=\"small m-b-0 m-r-8 a-s-start text-muted\"\n translate\n >\n Series\n </label>\n <span\n class=\"m-l-auto text-truncate\"\n title=\"{{ formGroup.value.series }}\"\n >\n <c8y-highlight\n [text]=\"formGroup.value.series\"\n [pattern]=\"highlightText\"\n [shouldTrimPattern]=\"true\"\n ></c8y-highlight>\n </span>\n </li>\n </ul>\n @if (datapointLibraryEntries && datapointLibraryEntries | async; as libraryEntries) {\n <div class=\"form-group form-group-sm\">\n <label>\n {{ 'Data point template' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"datapointHintPopoverTemplate\"\n placement=\"top\"\n triggers=\"focus\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n ></button>\n </label>\n\n <ng-template #datapointHintPopoverTemplate>\n {{\n 'Using a data point template sets color, label, unit and ranges. Removing the template allows you to set the values manually.'\n | translate\n }}\n </ng-template>\n <div class=\"input-group input-group-sm\">\n @if (datapointLibraryEntries) {\n <c8y-typeahead\n class=\"flex-grow\"\n [placeholder]=\"'No template' | translate\"\n [ngModel]=\"formGroup.value.__template ? formGroup.value.details : undefined\"\n [ngModelOptions]=\"{ standalone: true }\"\n (onSearch)=\"setPipe($event)\"\n [displayProperty]=\"'label'\"\n [hideNew]=\"true\"\n [disabled]=\"isSelected && disableTypeaheadIfSelected\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link interact\"\n *c8yFor=\"\n let item of datapointLibraryEntries;\n loadMore: 'auto';\n pipe: filterPipe;\n notFound: notFoundTemplate\n \"\n (click)=\"dataPointTemplateSelected(item)\"\n [active]=\"formGroup.value.__template === item.id\"\n [attr.role]=\"'menuitem'\"\n >\n <c8y-highlight\n [text]=\"item.c8y_Kpi?.label\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n <c8y-li-icon\n icon=\"circle\"\n [style.color]=\"item.c8y_Kpi?.color\"\n ></c8y-li-icon>\n </c8y-li>\n <ng-template #notFoundTemplate>\n @if (pattern.length > 0) {\n <c8y-li class=\"bg-level-2 p-8\">\n <span>{{ 'No match found.' | translate }}</span>\n </c8y-li>\n }\n </ng-template>\n </c8y-typeahead>\n }\n <div class=\"input-group-btn\">\n @if (formGroup.value.__template) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Info' | translate\"\n [popover]=\"datapointOverviewPopoverTemplate\"\n placement=\"left\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n }\n </div>\n <div class=\"input-group-btn\">\n @if (formGroup.value.__template && hasUnlinkTemplateOption) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Unlink data point template' | translate\"\n tooltip=\"{{ 'Unlink data point template' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"unlinkDatapointTemplate()\"\n >\n <i c8yIcon=\"unlink\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n }\n <ng-template #datapointOverviewPopoverTemplate>\n <c8y-datapoint-template-popover\n [datapoint]=\"formGroup.value.details\"\n ></c8y-datapoint-template-popover>\n </ng-template>\n @if (defaultFormOptions) {\n <c8y-datapoint-attributes-form\n [showTarget]=\"defaultFormOptions.showTarget\"\n [showRange]=\"defaultFormOptions.showRange\"\n [showYellowRange]=\"defaultFormOptions.showYellowRange\"\n [showRedRange]=\"defaultFormOptions.showRedRange\"\n [showChart]=\"defaultFormOptions.showChart\"\n [showFormIfTemplateWasSelected]=\"defaultFormOptions.showFormIfTemplateWasSelected\"\n [selectableChartRenderTypes]=\"defaultFormOptions.selectableChartRenderTypes\"\n [selectableChartLineTypes]=\"defaultFormOptions.selectableChartLineTypes\"\n [selectableAxisTypes]=\"defaultFormOptions.selectableAxisTypes\"\n [showAdvancedChartOptions]=\"defaultFormOptions.showAdvancedChartOptions\"\n [showErrorsImmediately]=\"true\"\n formControlName=\"details\"\n ></c8y-datapoint-attributes-form>\n }\n </div>\n </c8y-li-collapse>\n }\n</c8y-li>\n" }]
852
- }], ctorParameters: () => [{ type: i2.FormBuilder }], propDecorators: { defaultFormOptions: [{
1119
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { defaultFormOptions: [{
853
1120
  type: Input
854
1121
  }], isSelected: [{
855
1122
  type: Input
@@ -1077,7 +1344,7 @@ class DatapointSelectorComponent {
1077
1344
  multi: true,
1078
1345
  useExisting: forwardRef(() => DatapointSelectorComponent)
1079
1346
  }
1080
- ], ngImport: i0, template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div\n class=\"d-flex d-col p-relative bg-level-1\"\n *ngIf=\"allowChangingContext\"\n >\n <c8y-asset-selector-miller\n class=\"d-contents\"\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch,\n showFilter: true\n }\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"emptyStateTitle | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div\n class=\"bg-inherit\"\n *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\"\n >\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p\n class=\"text-medium text-truncate\"\n [title]=\"selectorTitle | translate\"\n >\n {{ selectorTitle | translate }}\n </p>\n <div\n class=\"input-group input-group-search m-t-4\"\n id=\"search\"\n *ngIf=\"!loadingDatapoints\"\n >\n <input\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n type=\"search\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"!searchString; else clearSearchString\"\n ></i>\n <ng-template #clearSearchString>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n (click)=\"searchStringChanged()\"\n ></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div\n class=\"p-16\"\n *ngIf=\"!filteredDatapoints.length\"\n >\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"emptyStateTitle | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n class=\"sticky-top\"\n style=\"top: 72px\"\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n class=\"d-contents\"\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n [addButtonType]=\"hideSelection ? AddButtonTypes.select : AddButtonTypes.addRemove\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n [editable]=\"itemsEditable\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div\n class=\"inner-scroll bg-level-1\"\n *ngIf=\"!hideSelection\"\n >\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"selectedListTitle | translate\"\n >\n {{ selectedListTitle | translate }}\n </p>\n <div\n class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\"\n *ngIf=\"selectedDatapoints?.length\"\n >\n <div\n class=\"c8y-datapoint-pill\"\n *ngFor=\"let selectedDp of selectedDatapoints\"\n >\n <button\n class=\"c8y-datapoint-pill__btn\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"remove\"\n ></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [style.color]=\"selectedDp.color\"\n ></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small\n class=\"text-muted text-10\"\n *ngIf=\"selectedDp?.__target?.name\"\n >\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div\n class=\"p-r-8\"\n *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\"\n >\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"emptyStateTitle | translate\"\n [subtitle]=\"\n 'Select the asset, then on the available data points list, click on the plus button on the desired data point.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "addButtonType", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: IncludesDatapointPipe, name: "includesDatapoint" }, { kind: "pipe", type: DatapointLabelPipe, name: "datapointLabel" }] }); }
1347
+ ], ngImport: i0, template: "<div\n class=\"d-grid grid__row--1 fit-h\"\n [ngClass]=\"{\n 'grid__col--3-6-3--md': allowChangingContext && !hideSelection,\n 'grid__col--8-4--md': !allowChangingContext && !hideSelection,\n 'grid__col--4-8--md': allowChangingContext && hideSelection\n }\"\n>\n <div\n class=\"d-flex d-col p-relative bg-level-1\"\n *ngIf=\"allowChangingContext\"\n >\n <c8y-asset-selector-miller\n class=\"d-contents\"\n [(ngModel)]=\"contextAsset\"\n [asset]=\"contextAsset\"\n (onSelected)=\"selectionChanged($event)\"\n [container]=\"''\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: true,\n columnHeaders: true,\n showChildDevices: true,\n showUnassignedDevices: true,\n singleColumn: true,\n search: allowSearch,\n showFilter: true\n }\"\n ></c8y-asset-selector-miller>\n </div>\n <!-- center column -->\n <div class=\"inner-scroll bg-component\">\n <ng-template #noDeviceEmptyState>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"emptyStateTitle | translate\"\n [subtitle]=\"'Select an asset from the list.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </ng-template>\n <ng-template #loadingData>\n <div class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <div\n class=\"bg-inherit\"\n *ngIf=\"assetSelection | async as asset; else noDeviceEmptyState\"\n >\n <div class=\"p-l-16 p-r-16 p-t-8 p-b-8 sticky-top bg-inherit separator-bottom\">\n <p\n class=\"text-medium text-truncate\"\n [title]=\"selectorTitle | translate\"\n >\n {{ selectorTitle | translate }}\n </p>\n <div\n class=\"input-group input-group-search m-t-4\"\n id=\"search\"\n *ngIf=\"!loadingDatapoints\"\n >\n <input\n class=\"form-control\"\n placeholder=\"Search\u2026\"\n type=\"search\"\n [ngModel]=\"searchString\"\n (ngModelChange)=\"searchStringChanged($event)\"\n />\n <span class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"!searchString; else clearSearchString\"\n ></i>\n <ng-template #clearSearchString>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n (click)=\"searchStringChanged()\"\n ></i>\n </ng-template>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"filteredDatapoints$ | async as filteredDatapoints; else loadingData\">\n <ng-container *ngIf=\"!loadingDatapoints; else loadingData\">\n <ng-container *ngIf=\"datapoints$ | async as datapoints\">\n <div\n class=\"p-16\"\n *ngIf=\"!filteredDatapoints.length\"\n >\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"emptyStateTitle | translate\"\n [subtitle]=\"\n datapoints.length\n ? (emptyStateSubtitleWhenNoMatchingDataPoints | translate)\n : (emptyStateSubtitleWhenNoDataPointsInAsset | translate)\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n\n <c8y-list-group>\n <c8y-list-item\n class=\"sticky-top\"\n style=\"top: 72px\"\n *ngIf=\"\n datapoints.length > maxNumberOfDatapoints &&\n filteredDatapoints.length >= maxNumberOfDatapoints\n \"\n >\n <div class=\"alert alert-warning m-b-0\">\n {{\n 'Due to the large number, only a subset of data points is displayed. Use search to narrow down the number of results.'\n | translate\n }}\n </div>\n </c8y-list-item>\n <c8y-datapoint-selector-list-item\n class=\"d-contents\"\n [ngModel]=\"dp\"\n [isSelected]=\"selectedDatapoints | includesDatapoint: dp\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [disableTypeaheadIfSelected]=\"true\"\n [addButtonType]=\"hideSelection ? AddButtonTypes.select : AddButtonTypes.addRemove\"\n (added)=\"datapointAdded($event)\"\n (removed)=\"datapointRemoved($event)\"\n [highlightText]=\"searchStringChanges$ | async\"\n *ngFor=\"let dp of filteredDatapoints; trackBy: trackByFn\"\n [editable]=\"itemsEditable\"\n ></c8y-datapoint-selector-list-item>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <!-- last column -->\n <div\n class=\"inner-scroll bg-level-1\"\n *ngIf=\"!hideSelection\"\n >\n <p\n class=\"text-medium p-l-16 p-r-16 p-t-8 p-b-8 separator-bottom sticky-top text-truncate\"\n [title]=\"selectedListTitle | translate\"\n >\n {{ selectedListTitle | translate }}\n </p>\n <div\n class=\"d-flex flex-wrap gap-8 p-l-16 p-r-16 p-t-8 p-b-16\"\n *ngIf=\"selectedDatapoints?.length\"\n >\n <div\n class=\"c8y-datapoint-pill\"\n *ngFor=\"let selectedDp of selectedDatapoints\"\n >\n <button\n class=\"c8y-datapoint-pill__btn\"\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"datapointRemoved(selectedDp)\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"remove\"\n ></i>\n </button>\n <div\n class=\"c8y-datapoint-pill__label\"\n [title]=\"selectedDp | datapointLabel: { doNotUseLabel: true, includeDevice: true }\"\n >\n <i\n class=\"m-r-4 icon-14\"\n c8yIcon=\"circle\"\n [style.color]=\"selectedDp.color\"\n ></i>\n <span class=\"text-truncate\">\n <span class=\"text-truncate\">{{ selectedDp | datapointLabel }}</span>\n <small\n class=\"text-muted text-10\"\n *ngIf=\"selectedDp?.__target?.name\"\n >\n {{ selectedDp?.__target?.name }}\n </small>\n </span>\n </div>\n </div>\n </div>\n <div\n class=\"p-r-8\"\n *ngIf=\"!selectedDatapoints || !selectedDatapoints.length\"\n >\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"emptyStateTitle | translate\"\n [subtitle]=\"\n 'Select the asset, then on the available data points list, click on the plus button on the desired data point.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "addButtonType", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: IncludesDatapointPipe, name: "includesDatapoint" }, { kind: "pipe", type: DatapointLabelPipe, name: "datapointLabel" }] }); }
1081
1348
  }
1082
1349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorComponent, decorators: [{
1083
1350
  type: Component,
@@ -1174,13 +1441,13 @@ class DatapointSelectorModalComponent {
1174
1441
  const modalContainer = get(this.elementRef, 'nativeElement.parentElement.parentElement.parentElement');
1175
1442
  modalContainer.style.zIndex = '1060';
1176
1443
  }
1177
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorModalComponent, deps: [{ token: i1$1.BsModalRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
1178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: DatapointSelectorModalComponent, isStandalone: true, selector: "c8y-datapoint-selector-modal", ngImport: i0, template: "<div class=\"modal-header separator\">\n <h4 id=\"modal-title\" class=\"text-medium\">{{ title | translate }}</h4>\n</div>\n<div class=\"modal-inner-scroll modal-inner-scroll--fixed\" id=\"modal-body\">\n <c8y-datapoint-selector\n [contextAsset]=\"contextAsset\"\n [guessDatapointUnit]=\"guessDatapointUnit\"\n [allowDatapointsFromMultipleAssets]=\"allowDatapointsFromMultipleAssets\"\n [allowChangingContext]=\"allowChangingContext\"\n [defaultActiveState]=\"defaultActiveState\"\n [allowSearch]=\"allowSearch\"\n [hideSelection]=\"finishWithFirstSelection\"\n [ignoreDatapointTemplates]=\"ignoreDatapointTemplates\"\n [datapointTemplatesOnly]=\"datapointTemplatesOnly\"\n [itemsEditable]=\"itemsEditable\"\n [ngModel]=\"selectedDatapoints\"\n (ngModelChange)=\"selectionChange($event)\"\n ></c8y-datapoint-selector>\n</div>\n<div class=\"modal-footer\">\n <button\n type=\"button\"\n [title]=\"'Cancel' | translate\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n translate\n >\n Cancel\n </button>\n <button\n [title]=\"saveButtonLabel | translate\"\n class=\"btn btn-primary\"\n [disabled]=\"!selectedDatapoints?.length\"\n (click)=\"saveChanges()\"\n *ngIf=\"!finishWithFirstSelection\"\n >\n {{ saveButtonLabel | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "component", type: DatapointSelectorComponent, selector: "c8y-datapoint-selector", inputs: ["contextAsset", "allowChangingContext", "allowDatapointsFromMultipleAssets", "defaultActiveState", "ignoreDatapointTemplates", "datapointTemplatesOnly", "guessDatapointUnit", "allowSearch", "hideSelection", "itemsEditable"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
1444
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorModalComponent, deps: [{ token: i1$2.BsModalRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
1445
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: DatapointSelectorModalComponent, isStandalone: true, selector: "c8y-datapoint-selector-modal", ngImport: i0, template: "<div class=\"modal-header separator\">\n <h4 id=\"modal-title\" class=\"text-medium\">{{ title | translate }}</h4>\n</div>\n<div class=\"modal-inner-scroll modal-inner-scroll--fixed\" id=\"modal-body\">\n <c8y-datapoint-selector\n [contextAsset]=\"contextAsset\"\n [guessDatapointUnit]=\"guessDatapointUnit\"\n [allowDatapointsFromMultipleAssets]=\"allowDatapointsFromMultipleAssets\"\n [allowChangingContext]=\"allowChangingContext\"\n [defaultActiveState]=\"defaultActiveState\"\n [allowSearch]=\"allowSearch\"\n [hideSelection]=\"finishWithFirstSelection\"\n [ignoreDatapointTemplates]=\"ignoreDatapointTemplates\"\n [datapointTemplatesOnly]=\"datapointTemplatesOnly\"\n [itemsEditable]=\"itemsEditable\"\n [ngModel]=\"selectedDatapoints\"\n (ngModelChange)=\"selectionChange($event)\"\n ></c8y-datapoint-selector>\n</div>\n<div class=\"modal-footer\">\n <button\n type=\"button\"\n [title]=\"'Cancel' | translate\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n translate\n >\n Cancel\n </button>\n <button\n [title]=\"saveButtonLabel | translate\"\n class=\"btn btn-primary\"\n [disabled]=\"!selectedDatapoints?.length\"\n (click)=\"saveChanges()\"\n *ngIf=\"!finishWithFirstSelection\"\n >\n {{ saveButtonLabel | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "component", type: DatapointSelectorComponent, selector: "c8y-datapoint-selector", inputs: ["contextAsset", "allowChangingContext", "allowDatapointsFromMultipleAssets", "defaultActiveState", "ignoreDatapointTemplates", "datapointTemplatesOnly", "guessDatapointUnit", "allowSearch", "hideSelection", "itemsEditable"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
1179
1446
  }
1180
1447
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorModalComponent, decorators: [{
1181
1448
  type: Component,
1182
1449
  args: [{ selector: 'c8y-datapoint-selector-modal', imports: [DatapointSelectorComponent, FormsModule, C8yTranslateDirective, NgIf, C8yTranslatePipe], template: "<div class=\"modal-header separator\">\n <h4 id=\"modal-title\" class=\"text-medium\">{{ title | translate }}</h4>\n</div>\n<div class=\"modal-inner-scroll modal-inner-scroll--fixed\" id=\"modal-body\">\n <c8y-datapoint-selector\n [contextAsset]=\"contextAsset\"\n [guessDatapointUnit]=\"guessDatapointUnit\"\n [allowDatapointsFromMultipleAssets]=\"allowDatapointsFromMultipleAssets\"\n [allowChangingContext]=\"allowChangingContext\"\n [defaultActiveState]=\"defaultActiveState\"\n [allowSearch]=\"allowSearch\"\n [hideSelection]=\"finishWithFirstSelection\"\n [ignoreDatapointTemplates]=\"ignoreDatapointTemplates\"\n [datapointTemplatesOnly]=\"datapointTemplatesOnly\"\n [itemsEditable]=\"itemsEditable\"\n [ngModel]=\"selectedDatapoints\"\n (ngModelChange)=\"selectionChange($event)\"\n ></c8y-datapoint-selector>\n</div>\n<div class=\"modal-footer\">\n <button\n type=\"button\"\n [title]=\"'Cancel' | translate\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n translate\n >\n Cancel\n </button>\n <button\n [title]=\"saveButtonLabel | translate\"\n class=\"btn btn-primary\"\n [disabled]=\"!selectedDatapoints?.length\"\n (click)=\"saveChanges()\"\n *ngIf=\"!finishWithFirstSelection\"\n >\n {{ saveButtonLabel | translate }}\n </button>\n</div>\n" }]
1183
- }], ctorParameters: () => [{ type: i1$1.BsModalRef }, { type: i0.ElementRef }] });
1450
+ }], ctorParameters: () => [{ type: i1$2.BsModalRef }, { type: i0.ElementRef }] });
1184
1451
 
1185
1452
  class DatapointSelectorService {
1186
1453
  constructor(modal) {
@@ -1198,13 +1465,13 @@ class DatapointSelectorService {
1198
1465
  const content = modal.content;
1199
1466
  return content.result;
1200
1467
  }
1201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorService, deps: [{ token: i1$1.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorService, deps: [{ token: i1$2.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1202
1469
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorService, providedIn: 'root' }); }
1203
1470
  }
1204
1471
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectorService, decorators: [{
1205
1472
  type: Injectable,
1206
1473
  args: [{ providedIn: 'root' }]
1207
- }], ctorParameters: () => [{ type: i1$1.BsModalService }] });
1474
+ }], ctorParameters: () => [{ type: i1$2.BsModalService }] });
1208
1475
 
1209
1476
  class DatapointSelectionListComponent {
1210
1477
  constructor(datapointSelector, datapointLibrary, formBuilder, widgetComponent) {
@@ -1231,6 +1498,7 @@ class DatapointSelectionListComponent {
1231
1498
  this.minActiveErrorMessage = gettext('At least {{ minActive }} data point(s) must be selected and active.');
1232
1499
  this.maxActiveErrorMessage = gettext('At maximum {{ maxActive }} data point(s) can be selected and active.');
1233
1500
  this.DATA_POINTS_LABEL = gettext('Data points`display`');
1501
+ this.GLOBAL_AGGREGATION_TYPES = CHART_RENDER_TYPES.filter(rt => rt.val !== 'area');
1234
1502
  this.usedValidators = {};
1235
1503
  this.formArray = this.formBuilder.array([]);
1236
1504
  this.isValid = this.formArray.statusChanges.pipe(map(status => status === 'VALID'));
@@ -1302,6 +1570,56 @@ class DatapointSelectionListComponent {
1302
1570
  onItemRemoved(index) {
1303
1571
  this.formArray.removeAt(index);
1304
1572
  }
1573
+ /**
1574
+ *
1575
+ * @param rtKey render type key
1576
+ * @returns state of the aggregation for the given render type across all datapoints:
1577
+ * 'all' if enabled for all, 'none' if disabled for all, 'mixed' if some datapoints have it enabled and others disabled
1578
+ */
1579
+ getAggregationState(rtKey) {
1580
+ const controls = this.formArray.controls;
1581
+ if (!controls.length)
1582
+ return 'none';
1583
+ let enabledCount = 0;
1584
+ for (const ctrl of controls) {
1585
+ const details = ctrl.get('details')?.value;
1586
+ if (details?.renderTypeConfigs?.[rtKey]?.enabled) {
1587
+ enabledCount++;
1588
+ }
1589
+ }
1590
+ if (enabledCount === 0)
1591
+ return 'none';
1592
+ if (enabledCount === controls.length)
1593
+ return 'all';
1594
+ return 'mixed';
1595
+ }
1596
+ /** Returns true if disabling `rtKey` globally would leave any datapoint with no enabled aggregation. */
1597
+ wouldLeaveAnyEmpty(rtKey) {
1598
+ return this.formArray.controls.some(ctrl => {
1599
+ const configs = ctrl.get('details')?.value?.renderTypeConfigs;
1600
+ if (!configs?.[rtKey]?.enabled)
1601
+ return false;
1602
+ return Object.entries(configs).every(([k, c]) => k === rtKey || !c?.enabled);
1603
+ });
1604
+ }
1605
+ toggleGlobalAggregation(rtKey) {
1606
+ const newEnabled = this.getAggregationState(rtKey) !== 'all';
1607
+ for (const ctrl of this.formArray.controls) {
1608
+ const fg = ctrl;
1609
+ const details = fg.get('details')?.value;
1610
+ if (details?.renderTypeConfigs?.[rtKey]) {
1611
+ const updatedConfigs = { ...details.renderTypeConfigs };
1612
+ updatedConfigs[rtKey] = { ...updatedConfigs[rtKey], enabled: newEnabled };
1613
+ const enabledRenderTypes = Object.keys(updatedConfigs).filter(k => updatedConfigs[k]?.enabled);
1614
+ fg.get('details')?.setValue({
1615
+ ...details,
1616
+ renderTypeConfigs: updatedConfigs,
1617
+ renderTypes: enabledRenderTypes,
1618
+ renderType: enabledRenderTypes[0] ?? details.renderType
1619
+ });
1620
+ }
1621
+ }
1622
+ }
1305
1623
  get formGroups() {
1306
1624
  return this.formArray.controls;
1307
1625
  }
@@ -1335,7 +1653,7 @@ class DatapointSelectionListComponent {
1335
1653
  this.formArray.setValidators(validators);
1336
1654
  this.formArray.updateValueAndValidity();
1337
1655
  }
1338
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectionListComponent, deps: [{ token: DatapointSelectorService }, { token: DatapointLibraryService }, { token: i2.FormBuilder }, { token: i4.WidgetConfigComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1656
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectionListComponent, deps: [{ token: DatapointSelectorService }, { token: DatapointLibraryService }, { token: i1.FormBuilder }, { token: i4.WidgetConfigComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1339
1657
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DatapointSelectionListComponent, isStandalone: true, selector: "c8y-datapoint-selection-list", inputs: { actions: "actions", allowDragAndDrop: "allowDragAndDrop", config: "config", defaultFormOptions: "defaultFormOptions", maxActiveCount: "maxActiveCount", minActiveCount: "minActiveCount", resolveContext: "resolveContext", listTitle: "listTitle", removeTitle: "removeTitle" }, outputs: { isValid: "isValid", change: "change" }, providers: [
1340
1658
  {
1341
1659
  provide: NG_VALUE_ACCESSOR,
@@ -1347,7 +1665,7 @@ class DatapointSelectionListComponent {
1347
1665
  useExisting: forwardRef(() => DatapointSelectionListComponent),
1348
1666
  multi: true
1349
1667
  }
1350
- ], usesOnChanges: true, ngImport: i0, template: "@if (!removeTitle) {\n <div class=\"card-header separator sticky-top bg-inherit\">\n <span class=\"card-title h4\">\n {{ (listTitle ? listTitle : DATA_POINTS_LABEL) | translate }}\n </span>\n </div>\n}\n\n<c8y-list-group\n class=\"flex-grow ff-scroll-fix cdk-droplist\"\n [class.separator-top]=\"formArray.controls?.length\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"!allowDragAndDrop || formArray.controls?.length < 2\"\n>\n @if (formArray.errors?.minActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ minActiveErrorMessage | translate: { minActive: minActiveCount } }}\n </div>\n }\n\n @if (formArray.errors?.maxActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ maxActiveErrorMessage | translate: { maxActive: maxActiveCount } }}\n </div>\n }\n\n <ng-content select=\".alert\"></ng-content>\n\n @if (!formArray.controls?.length) {\n <div class=\"p-t-8\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Add your first data point.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n }\n\n @for (formGroup of formGroups; track formGroup; let index = $index) {\n <div [formGroup]=\"formGroup\">\n <c8y-datapoint-selector-list-item\n class=\"d-block\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [activeToggleDisabled]=\"maxActiveCountReached\"\n [showActiveToggle]=\"true\"\n [addButtonType]=\"AddButtonTypes.none\"\n [showOptions]=\"true\"\n [editable]=\"true\"\n [colorPickerDisabled]=\"false\"\n [actions]=\"actions\"\n [optionToRemove]=\"true\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [hasUnlinkTemplateOption]=\"true\"\n formControlName=\"details\"\n (removed)=\"onItemRemoved(index)\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Click and drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n </c8y-datapoint-selector-list-item>\n </div>\n }\n\n <div class=\"card-footer bg-inherit\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Add data point' | translate\"\n type=\"button\"\n data-cy=\"c8y-datapoint-selection-list--add-datapoint-button\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n </div>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "addButtonType", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
1668
+ ], usesOnChanges: true, ngImport: i0, template: "@if (!removeTitle) {\n <div class=\"card-header separator sticky-top bg-inherit\">\n <span class=\"card-title h4\">\n {{ (listTitle ? listTitle : DATA_POINTS_LABEL) | translate }}\n </span>\n </div>\n}\n\n<c8y-list-group\n class=\"flex-grow ff-scroll-fix cdk-droplist\"\n [class.separator-top]=\"formArray.controls?.length\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"!allowDragAndDrop || formArray.controls?.length < 2\"\n>\n @if (formArray.errors?.minActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ minActiveErrorMessage | translate: { minActive: minActiveCount } }}\n </div>\n }\n\n @if (formArray.errors?.maxActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ maxActiveErrorMessage | translate: { maxActive: maxActiveCount } }}\n </div>\n }\n\n <ng-content select=\".alert\"></ng-content>\n\n @if (defaultFormOptions?.showAdvancedChartOptions && formArray.controls?.length) {\n <fieldset class=\"c8y-fieldset m-t-0 m-b-16\">\n <legend>\n {{ 'Aggregation display' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"\n 'Select which aggregations to display for all data points. These options apply to every data point in the list.'\n | translate\n \"\n popover=\"{{\n 'Select which aggregations to display for all data points. These options apply to every data point in the list.'\n | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </legend>\n <div class=\"m-b-8\">\n @for (rt of GLOBAL_AGGREGATION_TYPES; track rt.val) {\n @let aggregationState = getAggregationState(rt.val);\n <label\n class=\"c8y-checkbox checkbox-inline\"\n [title]=\"rt.text | translate\"\n [attr.aria-label]=\"rt.text | translate\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"aggregationState === 'all'\"\n [indeterminate]=\"aggregationState === 'mixed'\"\n [disabled]=\"wouldLeaveAnyEmpty(rt.val)\"\n (change)=\"toggleGlobalAggregation(rt.val)\"\n />\n <span></span>\n <span>{{ rt.text | translate }}</span>\n </label>\n }\n </div>\n </fieldset>\n }\n\n @if (!formArray.controls?.length) {\n <div class=\"p-t-8\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Add your first data point.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n }\n\n @for (formGroup of formGroups; track formGroup; let index = $index) {\n <div [formGroup]=\"formGroup\">\n <c8y-datapoint-selector-list-item\n class=\"d-block\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [activeToggleDisabled]=\"maxActiveCountReached\"\n [showActiveToggle]=\"true\"\n [addButtonType]=\"AddButtonTypes.none\"\n [showOptions]=\"true\"\n [editable]=\"true\"\n [colorPickerDisabled]=\"false\"\n [actions]=\"actions\"\n [optionToRemove]=\"true\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [hasUnlinkTemplateOption]=\"true\"\n formControlName=\"details\"\n (removed)=\"onItemRemoved(index)\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Click and drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n </c8y-datapoint-selector-list-item>\n </div>\n }\n\n <div class=\"card-footer bg-inherit\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Add data point' | translate\"\n type=\"button\"\n data-cy=\"c8y-datapoint-selection-list--add-datapoint-button\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n </div>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DatapointSelectorListItemComponent, selector: "c8y-datapoint-selector-list-item", inputs: ["defaultFormOptions", "isSelected", "isCollapsed", "addButtonType", "editable", "showActiveToggle", "activeToggleDisabled", "showOptions", "datapointLibraryEntries", "actions", "optionToRemove", "hasUnlinkTemplateOption", "colorPickerDisabled", "disableTypeaheadIfSelected", "highlightText"], outputs: ["added", "removed"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i5.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
1351
1669
  }
1352
1670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DatapointSelectionListComponent, decorators: [{
1353
1671
  type: Component,
@@ -1373,9 +1691,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1373
1691
  ListItemDragHandleComponent,
1374
1692
  CdkDragHandle,
1375
1693
  IconDirective,
1376
- C8yTranslatePipe
1377
- ], template: "@if (!removeTitle) {\n <div class=\"card-header separator sticky-top bg-inherit\">\n <span class=\"card-title h4\">\n {{ (listTitle ? listTitle : DATA_POINTS_LABEL) | translate }}\n </span>\n </div>\n}\n\n<c8y-list-group\n class=\"flex-grow ff-scroll-fix cdk-droplist\"\n [class.separator-top]=\"formArray.controls?.length\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"!allowDragAndDrop || formArray.controls?.length < 2\"\n>\n @if (formArray.errors?.minActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ minActiveErrorMessage | translate: { minActive: minActiveCount } }}\n </div>\n }\n\n @if (formArray.errors?.maxActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ maxActiveErrorMessage | translate: { maxActive: maxActiveCount } }}\n </div>\n }\n\n <ng-content select=\".alert\"></ng-content>\n\n @if (!formArray.controls?.length) {\n <div class=\"p-t-8\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Add your first data point.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n }\n\n @for (formGroup of formGroups; track formGroup; let index = $index) {\n <div [formGroup]=\"formGroup\">\n <c8y-datapoint-selector-list-item\n class=\"d-block\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [activeToggleDisabled]=\"maxActiveCountReached\"\n [showActiveToggle]=\"true\"\n [addButtonType]=\"AddButtonTypes.none\"\n [showOptions]=\"true\"\n [editable]=\"true\"\n [colorPickerDisabled]=\"false\"\n [actions]=\"actions\"\n [optionToRemove]=\"true\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [hasUnlinkTemplateOption]=\"true\"\n formControlName=\"details\"\n (removed)=\"onItemRemoved(index)\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Click and drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n </c8y-datapoint-selector-list-item>\n </div>\n }\n\n <div class=\"card-footer bg-inherit\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Add data point' | translate\"\n type=\"button\"\n data-cy=\"c8y-datapoint-selection-list--add-datapoint-button\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n </div>\n</c8y-list-group>\n" }]
1378
- }], ctorParameters: () => [{ type: DatapointSelectorService }, { type: DatapointLibraryService }, { type: i2.FormBuilder }, { type: i4.WidgetConfigComponent, decorators: [{
1694
+ C8yTranslatePipe,
1695
+ PopoverModule
1696
+ ], template: "@if (!removeTitle) {\n <div class=\"card-header separator sticky-top bg-inherit\">\n <span class=\"card-title h4\">\n {{ (listTitle ? listTitle : DATA_POINTS_LABEL) | translate }}\n </span>\n </div>\n}\n\n<c8y-list-group\n class=\"flex-grow ff-scroll-fix cdk-droplist\"\n [class.separator-top]=\"formArray.controls?.length\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"!allowDragAndDrop || formArray.controls?.length < 2\"\n>\n @if (formArray.errors?.minActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ minActiveErrorMessage | translate: { minActive: minActiveCount } }}\n </div>\n }\n\n @if (formArray.errors?.maxActiveCount && formArray.touched) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ maxActiveErrorMessage | translate: { maxActive: maxActiveCount } }}\n </div>\n }\n\n <ng-content select=\".alert\"></ng-content>\n\n @if (defaultFormOptions?.showAdvancedChartOptions && formArray.controls?.length) {\n <fieldset class=\"c8y-fieldset m-t-0 m-b-16\">\n <legend>\n {{ 'Aggregation display' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"\n 'Select which aggregations to display for all data points. These options apply to every data point in the list.'\n | translate\n \"\n popover=\"{{\n 'Select which aggregations to display for all data points. These options apply to every data point in the list.'\n | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </legend>\n <div class=\"m-b-8\">\n @for (rt of GLOBAL_AGGREGATION_TYPES; track rt.val) {\n @let aggregationState = getAggregationState(rt.val);\n <label\n class=\"c8y-checkbox checkbox-inline\"\n [title]=\"rt.text | translate\"\n [attr.aria-label]=\"rt.text | translate\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"aggregationState === 'all'\"\n [indeterminate]=\"aggregationState === 'mixed'\"\n [disabled]=\"wouldLeaveAnyEmpty(rt.val)\"\n (change)=\"toggleGlobalAggregation(rt.val)\"\n />\n <span></span>\n <span>{{ rt.text | translate }}</span>\n </label>\n }\n </div>\n </fieldset>\n }\n\n @if (!formArray.controls?.length) {\n <div class=\"p-t-8\">\n <c8y-ui-empty-state\n class=\"p-t-8\"\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Add your first data point.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n }\n\n @for (formGroup of formGroups; track formGroup; let index = $index) {\n <div [formGroup]=\"formGroup\">\n <c8y-datapoint-selector-list-item\n class=\"d-block\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [activeToggleDisabled]=\"maxActiveCountReached\"\n [showActiveToggle]=\"true\"\n [addButtonType]=\"AddButtonTypes.none\"\n [showOptions]=\"true\"\n [editable]=\"true\"\n [colorPickerDisabled]=\"false\"\n [actions]=\"actions\"\n [optionToRemove]=\"true\"\n [datapointLibraryEntries]=\"datapointLibraryEntries\"\n [hasUnlinkTemplateOption]=\"true\"\n formControlName=\"details\"\n (removed)=\"onItemRemoved(index)\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Click and drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n </c8y-datapoint-selector-list-item>\n </div>\n }\n\n <div class=\"card-footer bg-inherit\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Add data point' | translate\"\n type=\"button\"\n data-cy=\"c8y-datapoint-selection-list--add-datapoint-button\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n </div>\n</c8y-list-group>\n" }]
1697
+ }], ctorParameters: () => [{ type: DatapointSelectorService }, { type: DatapointLibraryService }, { type: i1.FormBuilder }, { type: i4.WidgetConfigComponent, decorators: [{
1379
1698
  type: Optional
1380
1699
  }] }], propDecorators: { actions: [{
1381
1700
  type: Input
@@ -1583,7 +1902,13 @@ class WidgetDatapointsSelectorComponent {
1583
1902
  });
1584
1903
  this.widgetConfigService.currentConfig$
1585
1904
  .pipe(takeUntilDestroyed(this.destroyRef))
1586
- .subscribe(({ showAdvancedChartOptions }) => (this.defaultFormOptions = { ...this.defaultFormOptions, showAdvancedChartOptions }));
1905
+ .subscribe(config => {
1906
+ const hasAggregation = !!(config.aggregation || config.autoAggregation);
1907
+ this.defaultFormOptions = {
1908
+ ...this.defaultFormOptions,
1909
+ showAdvancedChartOptions: config.showAdvancedChartOptions && hasAggregation
1910
+ };
1911
+ });
1587
1912
  }
1588
1913
  }
1589
1914
  onDatapointsChange(datapoints) {
@@ -1650,7 +1975,7 @@ class WidgetDatapointsSelectorComponent {
1650
1975
  this.differentUnits = units.some(unit => unit !== firstUnit);
1651
1976
  }
1652
1977
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: WidgetDatapointsSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1653
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: WidgetDatapointsSelectorComponent, isStandalone: true, selector: "c8y-widget-datapoints-selector", inputs: { minActiveCount: "minActiveCount", maxActiveCount: "maxActiveCount", showDifferentUnitsAlert: "showDifferentUnitsAlert", listTitle: "listTitle", defaultFormOptions: "defaultFormOptions", config: "config", controlName: "controlName", removeTitle: "removeTitle", useAdvancedChartOptions: "useAdvancedChartOptions" }, host: { classAttribute: "bg-level-1" }, ngImport: i0, template: "@let hasDifferentUnits = showDifferentUnitsAlert && differentUnits;\n\n<c8y-datapoint-selection-list\n class=\"bg-inherit\"\n [removeTitle]=\"removeTitle\"\n [listTitle]=\"listTitle\"\n [name]=\"controlName\"\n [config]=\"config\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [minActiveCount]=\"minActiveCount\"\n [maxActiveCount]=\"maxActiveCount\"\n [ngModel]=\"datapoints()\"\n (ngModelChange)=\"onDatapointsChange($event)\"\n #dpSelection\n #dpModel=\"ngModel\"\n>\n @if (hasDifferentUnits) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ differentUnitsMessageError | translate }}\n </div>\n }\n</c8y-datapoint-selection-list>\n\n<c8y-widget-config-feedback>\n @let activeCount = activeDatapointsCount();\n @let hasError = dpModel?.errors?.minActiveCount || dpModel?.errors?.maxActiveCount;\n <span\n class=\"tag chip text-12\"\n [class.tag--danger]=\"hasError\"\n [class.tag--info]=\"!hasError\"\n >\n @if (activeCount === 0) {\n {{ 'None selected`data point`' | translate }}\n } @else if (activeCount === 1) {\n {{ '1 data point' | translate }}\n } @else {\n {{ '{{ count }} data points' | translate: { count: activeCount } }}\n }\n </span>\n\n @let minActiveError = dpModel?.errors?.minActiveCount;\n @let maxActiveError = dpModel?.errors?.maxActiveCount;\n\n @if ((minActiveError || maxActiveError) && dpModel.touched) {\n <button\n class=\"btn-clean\"\n [attr.aria-label]=\"\n minActiveError\n ? (dpSelection.minActiveErrorMessage | translate: { minActive: minActiveCount })\n : maxActiveError\n ? (dpSelection.maxActiveErrorMessage | translate: { maxActive: maxActiveCount })\n : null\n \"\n [tooltip]=\"\n minActiveError\n ? (dpSelection.minActiveErrorMessage | translate: { minActive: minActiveCount })\n : maxActiveError\n ? (dpSelection.maxActiveErrorMessage | translate: { maxActive: maxActiveCount })\n : null\n \"\n type=\"button\"\n [delay]=\"500\"\n >\n <i\n class=\"status major\"\n [c8yIcon]=\"'warning'\"\n ></i>\n </button>\n }\n\n @if (hasDifferentUnits) {\n <button\n class=\"btn-clean\"\n [attr.aria-label]=\"differentUnitsMessageError | translate\"\n [tooltip]=\"differentUnitsMessageError | translate\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i\n class=\"text-warning\"\n [c8yIcon]=\"'warning'\"\n ></i>\n </button>\n }\n</c8y-widget-config-feedback>\n", dependencies: [{ kind: "component", type: DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle", "removeTitle"], outputs: ["isValid", "change"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: WidgetConfigFeedbackComponent, selector: "c8y-widget-config-feedback" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
1978
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: WidgetDatapointsSelectorComponent, isStandalone: true, selector: "c8y-widget-datapoints-selector", inputs: { minActiveCount: "minActiveCount", maxActiveCount: "maxActiveCount", showDifferentUnitsAlert: "showDifferentUnitsAlert", listTitle: "listTitle", defaultFormOptions: "defaultFormOptions", config: "config", controlName: "controlName", removeTitle: "removeTitle", useAdvancedChartOptions: "useAdvancedChartOptions" }, host: { classAttribute: "bg-level-1" }, ngImport: i0, template: "@let hasDifferentUnits = showDifferentUnitsAlert && differentUnits;\n\n<c8y-datapoint-selection-list\n class=\"bg-inherit\"\n [removeTitle]=\"removeTitle\"\n [listTitle]=\"listTitle\"\n [name]=\"controlName\"\n [config]=\"config\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [minActiveCount]=\"minActiveCount\"\n [maxActiveCount]=\"maxActiveCount\"\n [ngModel]=\"datapoints()\"\n (ngModelChange)=\"onDatapointsChange($event)\"\n #dpSelection\n #dpModel=\"ngModel\"\n>\n @if (hasDifferentUnits) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n {{ differentUnitsMessageError | translate }}\n </div>\n }\n</c8y-datapoint-selection-list>\n\n<c8y-widget-config-feedback>\n @let activeCount = activeDatapointsCount();\n @let hasError = dpModel?.errors?.minActiveCount || dpModel?.errors?.maxActiveCount;\n <span\n class=\"tag chip text-12\"\n [class.tag--danger]=\"hasError\"\n [class.tag--info]=\"!hasError\"\n >\n @if (activeCount === 0) {\n {{ 'None selected`data point`' | translate }}\n } @else if (activeCount === 1) {\n {{ '1 data point' | translate }}\n } @else {\n {{ '{{ count }} data points' | translate: { count: activeCount } }}\n }\n </span>\n\n @let minActiveError = dpModel?.errors?.minActiveCount;\n @let maxActiveError = dpModel?.errors?.maxActiveCount;\n\n @if ((minActiveError || maxActiveError) && dpModel.touched) {\n <button\n class=\"btn-clean\"\n [attr.aria-label]=\"\n minActiveError\n ? (dpSelection.minActiveErrorMessage | translate: { minActive: minActiveCount })\n : maxActiveError\n ? (dpSelection.maxActiveErrorMessage | translate: { maxActive: maxActiveCount })\n : null\n \"\n [tooltip]=\"\n minActiveError\n ? (dpSelection.minActiveErrorMessage | translate: { minActive: minActiveCount })\n : maxActiveError\n ? (dpSelection.maxActiveErrorMessage | translate: { maxActive: maxActiveCount })\n : null\n \"\n type=\"button\"\n [delay]=\"500\"\n >\n <i\n class=\"status major\"\n [c8yIcon]=\"'warning'\"\n ></i>\n </button>\n }\n\n @if (hasDifferentUnits) {\n <button\n class=\"btn-clean\"\n [attr.aria-label]=\"differentUnitsMessageError | translate\"\n [tooltip]=\"differentUnitsMessageError | translate\"\n type=\"button\"\n [delay]=\"500\"\n >\n <i\n class=\"text-warning\"\n [c8yIcon]=\"'warning'\"\n ></i>\n </button>\n }\n</c8y-widget-config-feedback>\n", dependencies: [{ kind: "component", type: DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle", "removeTitle"], outputs: ["isValid", "change"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: WidgetConfigFeedbackComponent, selector: "c8y-widget-config-feedback" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
1654
1979
  }
1655
1980
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: WidgetDatapointsSelectorComponent, decorators: [{
1656
1981
  type: Component,
@@ -1686,5 +2011,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1686
2011
  * Generated bundle index. Do not edit.
1687
2012
  */
1688
2013
 
1689
- export { AXIS_TYPES, AddButtonTypes, CHART_LINE_TYPES, CHART_RENDER_TYPES, DATAPOINT_LIBRARY_FRAGMENT, DatapointAttributesFormComponent, DatapointAttributesFormValidationService, DatapointLabelPipe, DatapointLibraryService, DatapointSelectionListComponent, DatapointSelectorComponent, DatapointSelectorListItemComponent, DatapointSelectorModalComponent, DatapointSelectorModule, DatapointSelectorService, DatapointTemplatePopoverComponent, IncludesDatapointPipe, WidgetDatapointsSelectorComponent };
2014
+ export { AXIS_TYPES, AddButtonTypes, CHART_LINE_TYPES, CHART_RENDER_TYPES, DATAPOINT_LIBRARY_FRAGMENT, DATA_POINT_TOTAL_TYPES, DATA_POINT_VALUE_TYPES, DEFAULT_RENDER_TYPE_LINE_TYPES, DatapointAttributesFormComponent, DatapointAttributesFormValidationService, DatapointLabelPipe, DatapointLibraryService, DatapointSelectionListComponent, DatapointSelectorComponent, DatapointSelectorListItemComponent, DatapointSelectorModalComponent, DatapointSelectorModule, DatapointSelectorService, DatapointTemplatePopoverComponent, IncludesDatapointPipe, WidgetDatapointsSelectorComponent };
1690
2015
  //# sourceMappingURL=c8y-ngx-components-datapoint-selector.mjs.map