@c8y/ngx-components 1024.1.8 → 1024.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/fesm2022/c8y-ngx-components-bookmarks.mjs +33 -23
  2. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -2
  4. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +65 -25
  6. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +363 -38
  8. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
  10. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  12. package/fesm2022/c8y-ngx-components-echart.mjs +796 -123
  13. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-global-context.mjs +391 -54
  15. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
  17. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +43 -0
  19. package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
  21. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +179 -41
  23. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
  25. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
  27. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-time-context.mjs +146 -20
  29. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
  31. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
  33. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +198 -24
  35. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components.mjs +109 -36
  37. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  38. package/locales/de.po +141 -13
  39. package/locales/es.po +141 -13
  40. package/locales/fr.po +141 -13
  41. package/locales/ja_JP.po +140 -14
  42. package/locales/ko.po +141 -13
  43. package/locales/locales.pot +139 -11
  44. package/locales/nl.po +141 -13
  45. package/locales/pl.po +141 -13
  46. package/locales/pt_BR.po +141 -13
  47. package/locales/zh_CN.po +141 -13
  48. package/locales/zh_TW.po +141 -13
  49. package/package.json +1 -1
  50. package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
  51. package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
  52. package/types/c8y-ngx-components-datapoint-explorer-view.d.ts +4 -1
  53. package/types/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -1
  54. package/types/c8y-ngx-components-datapoint-selector.d.ts +93 -5
  55. package/types/c8y-ngx-components-datapoint-selector.d.ts.map +1 -1
  56. package/types/c8y-ngx-components-device-profile.d.ts +5 -2
  57. package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
  58. package/types/c8y-ngx-components-echart-models.d.ts +25 -3
  59. package/types/c8y-ngx-components-echart-models.d.ts.map +1 -1
  60. package/types/c8y-ngx-components-echart.d.ts +65 -5
  61. package/types/c8y-ngx-components-echart.d.ts.map +1 -1
  62. package/types/c8y-ngx-components-global-context.d.ts +187 -7
  63. package/types/c8y-ngx-components-global-context.d.ts.map +1 -1
  64. package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
  65. package/types/c8y-ngx-components-remote-access-data.d.ts +19 -0
  66. package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
  67. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
  68. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
  69. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
  70. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
  71. package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
  72. package/types/c8y-ngx-components-repository-software.d.ts +2 -0
  73. package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
  74. package/types/c8y-ngx-components-time-context.d.ts +50 -8
  75. package/types/c8y-ngx-components-time-context.d.ts.map +1 -1
  76. package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
  77. package/types/c8y-ngx-components-widgets-implementations-alarms.d.ts +1 -0
  78. package/types/c8y-ngx-components-widgets-implementations-alarms.d.ts.map +1 -1
  79. package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
  80. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts +25 -0
  81. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -1
  82. package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts +1 -0
  83. package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts.map +1 -1
  84. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts +2 -0
  85. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts.map +1 -1
  86. package/types/c8y-ngx-components.d.ts +55 -12
  87. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, input, effect, Directive, Pipe, createEnvironmentInjector, InjectionToken, Optional, Inject, EventEmitter, NgModule, LOCALE_ID, NgModuleRef, createNgModule, isDevMode, inject, DOCUMENT, EnvironmentInjector, Injector, Input, HostListener, Component, HostBinding, Output, forwardRef, DestroyRef, ViewChild, signal, viewChild, ChangeDetectionStrategy, contentChildren, untracked, SecurityContext, TemplateRef, ElementRef, provideAppInitializer, Self, SkipSelf, Attribute, ContentChild, ContentChildren, ViewContainerRef, output, ChangeDetectorRef, ViewChildren, createComponent, runInInjectionContext, importProvidersFrom, SimpleChange, reflectComponentType, ViewEncapsulation, computed, Type } from '@angular/core';
3
3
  import * as i1$2 from 'ngx-bootstrap/dropdown';
4
4
  import { BsDropdownDirective, BsDropdownModule } from 'ngx-bootstrap/dropdown';
5
+ import * as i4$2 from '@angular/cdk/a11y';
5
6
  import { ConfigurableFocusTrapFactory, CdkTrapFocus, A11yModule } from '@angular/cdk/a11y';
6
7
  import { of, Observable, map, startWith, distinctUntilChanged, shareReplay, merge, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, ReplaySubject, firstValueFrom, lastValueFrom, NEVER, filter as filter$1, tap as tap$1, mergeMap, fromEvent, pipe, throwError, interval, take as take$1, takeUntil as takeUntil$1, concat, fromEventPattern, withLatestFrom, catchError as catchError$1, empty, timer, forkJoin, debounceTime as debounceTime$1, switchMap as switchMap$1, skip as skip$1 } from 'rxjs';
7
8
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -19440,6 +19441,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
19440
19441
  * control only when the user confirms an edit (save), not on every keystroke.
19441
19442
  * When `noSaveButton` is `true`, every keystroke propagates instead.
19442
19443
  *
19444
+ * The model update (`onChange`) happens before the `(save)` event fires, so
19445
+ * `(save)` handlers can read the committed value directly from the bound form
19446
+ * control or `ngModel`.
19447
+ *
19443
19448
  * Supports synchronous and asynchronous validators via the `validators` and
19444
19449
  * `asyncValidators` inputs. Validation errors are shown while the user is
19445
19450
  * editing; saving is blocked when the typed value is invalid or a validator
@@ -19597,9 +19602,9 @@ class InputGroupEditableComponent {
19597
19602
  const value = this.internalControl.value ?? '';
19598
19603
  this.committedValue = value;
19599
19604
  this.errors = null;
19600
- this.save.emit(value);
19601
19605
  this.onChange?.(value);
19602
19606
  this.onTouched?.();
19607
+ this.save.emit(value);
19603
19608
  this.internalControl.reset(value, { emitEvent: false });
19604
19609
  this.notifyAutoresize();
19605
19610
  this.announce(gettext$1('Saved'));
@@ -19616,7 +19621,8 @@ class InputGroupEditableComponent {
19616
19621
  this.cancel.emit();
19617
19622
  this.announce(gettext$1('Cancelled'));
19618
19623
  }
19619
- onEscape() {
19624
+ onEscape(event) {
19625
+ event.stopPropagation();
19620
19626
  this.onCancel();
19621
19627
  this.inputEl()?.nativeElement.blur();
19622
19628
  }
@@ -19640,7 +19646,7 @@ class InputGroupEditableComponent {
19640
19646
  useExisting: forwardRef(() => InputGroupEditableComponent),
19641
19647
  multi: true
19642
19648
  }
19643
- ], queries: [{ propertyName: "customErrorMessages", predicate: MessageDirective }], viewQueries: [{ propertyName: "autoresizeDir", first: true, predicate: TextareaAutoresizeDirective, descendants: true, isSignal: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.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$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19649
+ ], queries: [{ propertyName: "customErrorMessages", predicate: MessageDirective }], viewQueries: [{ propertyName: "autoresizeDir", first: true, predicate: TextareaAutoresizeDirective, descendants: true, isSignal: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n data-1p-ignore\n data-lpignore=\"true\"\n data-bwignore\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.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$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19644
19650
  }
19645
19651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: InputGroupEditableComponent, decorators: [{
19646
19652
  type: Component,
@@ -19657,7 +19663,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
19657
19663
  useExisting: forwardRef(() => InputGroupEditableComponent),
19658
19664
  multi: true
19659
19665
  }
19660
- ], template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n" }]
19666
+ ], template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n data-1p-ignore\n data-lpignore=\"true\"\n data-bwignore\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n" }]
19661
19667
  }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], noSaveButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "noSaveButton", required: false }] }], formGroupClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "formGroupClass", required: false }] }], validators: [{ type: i0.Input, args: [{ isSignal: true, alias: "validators", required: false }] }], asyncValidators: [{ type: i0.Input, args: [{ isSignal: true, alias: "asyncValidators", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], save: [{ type: i0.Output, args: ["save"] }], cancel: [{ type: i0.Output, args: ["cancel"] }], customErrorMessages: [{
19662
19668
  type: ContentChildren,
19663
19669
  args: [MessageDirective]
@@ -30907,8 +30913,12 @@ const AGGREGATION_ICONS = {
30907
30913
  HOURLY: 'clock-o',
30908
30914
  DAILY: 'calendar-o'
30909
30915
  };
30916
+ const AUTO_AGGREGATION_ICON = 'automation';
30917
+ /** Toggle/display tooltip for auto mode, with the current aggregation-point count. */
30918
+ const AUTO_POINTS_TOOLTIP = gettext$1('Auto — {{ points }} points per chart');
30919
+ const AUTO_POINTS_TOOLTIP_KEPT = gettext$1('Auto — {{ points }} points per chart, kept on zoom');
30910
30920
  const AGGREGATION_TEXTS = {
30911
- disabled: gettext$1('No aggregation with real-time or auto-refresh enabled'),
30921
+ disabled: gettext$1('Unavailable while real-time or auto-refresh is on.'),
30912
30922
  undefined: gettext$1('No aggregation'),
30913
30923
  MINUTELY: gettext$1('Minutely aggregation'),
30914
30924
  HOURLY: gettext$1('Hourly aggregation'),
@@ -31374,6 +31384,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
31374
31384
  ], standalone: true, imports: [TooltipModule, NgClass, C8yTranslatePipe], template: " <button\n class=\"btn btn-icon c8y-realtime\"\n [attr.aria-label]=\"(value ? disableRealtimeLabel : enableRealtimeLabel) | translate\"\n tooltip=\"{{ (value ? disableRealtimeLabel : enableRealtimeLabel) | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n (click)=\"onChange(!value)\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n [disabled]=\"disabled\"\n>\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: value, inactive: !value }\"\n ></span>\n</button>\n" }]
31375
31385
  }] });
31376
31386
 
31387
+ const AUTO_AGGREGATION_ID = 'AUTO';
31377
31388
  class AggregationPickerComponent {
31378
31389
  constructor() {
31379
31390
  /**
@@ -31381,9 +31392,33 @@ class AggregationPickerComponent {
31381
31392
  * By default no aggregation type is disabled.
31382
31393
  */
31383
31394
  this.disabledAggregations = {};
31395
+ /** Emits `true` when the user selects "Auto", `false` when switching away from it. */
31396
+ this.autoModeChange = output();
31397
+ this.AUTO_ITEM_ID = AUTO_AGGREGATION_ID;
31398
+ this.AUTO_LABEL = gettext$1('Auto');
31399
+ this.AUTO_ICON = AUTO_AGGREGATION_ICON;
31384
31400
  this.AGGREGATIONS = AGGREGATIONS;
31385
31401
  this.AGGREGATION_ICONS = AGGREGATION_ICONS;
31402
+ this.AGGREGATION_LABELS = AGGREGATION_LABELS;
31386
31403
  this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
31404
+ /** Number of aggregation points shown in the toggle badge while auto mode is active. */
31405
+ this.autoPoints = input(null, ...(ngDevMode ? [{ debugName: "autoPoints" }] : /* istanbul ignore next */ []));
31406
+ /** Whether the point count is kept on zoom; surfaced in the toggle tooltip in auto mode. */
31407
+ this.autoKeepPointCount = input(null, ...(ngDevMode ? [{ debugName: "autoKeepPointCount" }] : /* istanbul ignore next */ []));
31408
+ /** Toggle tooltip/aria text for auto mode, with the current point count. */
31409
+ this.AUTO_POINTS_TOOLTIP = AUTO_POINTS_TOOLTIP;
31410
+ this.AUTO_POINTS_TOOLTIP_KEPT = AUTO_POINTS_TOOLTIP_KEPT;
31411
+ /**
31412
+ * When true, appends an "Auto" option to the radio group that signals automatic
31413
+ * aggregation selection. Use together with `autoModeActive` and `(autoModeChange)`.
31414
+ * Only meaningful in radio layout.
31415
+ */
31416
+ this.showAutoMode = input(false, ...(ngDevMode ? [{ debugName: "showAutoMode" }] : /* istanbul ignore next */ []));
31417
+ /**
31418
+ * Controls whether the "Auto" radio option appears checked.
31419
+ * Bind to your form's auto-mode boolean so the picker reflects external state.
31420
+ */
31421
+ this.autoModeActive = input(false, ...(ngDevMode ? [{ debugName: "autoModeActive" }] : /* istanbul ignore next */ []));
31387
31422
  this.touched = false;
31388
31423
  this.disabled = false;
31389
31424
  // eslint-disable-next-line @typescript-eslint/no-empty-function
@@ -31409,14 +31444,37 @@ class AggregationPickerComponent {
31409
31444
  setDisabledState(disabled) {
31410
31445
  this.disabled = disabled;
31411
31446
  }
31447
+ selectAggregation(aggregation) {
31448
+ const isAuto = aggregation === AUTO_AGGREGATION_ID;
31449
+ if (isAuto && this.autoModeActive()) {
31450
+ return;
31451
+ }
31452
+ if (!isAuto && !this.autoModeActive() && aggregation === this.value) {
31453
+ return;
31454
+ }
31455
+ this.markAsTouched();
31456
+ const wasAuto = this.autoModeActive();
31457
+ if (isAuto) {
31458
+ this.value = null;
31459
+ this.onChange(null);
31460
+ this.autoModeChange.emit(true);
31461
+ }
31462
+ else {
31463
+ this.value = aggregation;
31464
+ this.onChange(aggregation);
31465
+ if (wasAuto) {
31466
+ this.autoModeChange.emit(false);
31467
+ }
31468
+ }
31469
+ }
31412
31470
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AggregationPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31413
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: AggregationPickerComponent, isStandalone: true, selector: "c8y-aggregation-picker", inputs: { disabledAggregations: "disabledAggregations" }, providers: [
31471
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: AggregationPickerComponent, isStandalone: true, selector: "c8y-aggregation-picker", inputs: { disabledAggregations: { classPropertyName: "disabledAggregations", publicName: "disabledAggregations", isSignal: false, isRequired: false, transformFunction: null }, autoPoints: { classPropertyName: "autoPoints", publicName: "autoPoints", isSignal: true, isRequired: false, transformFunction: null }, autoKeepPointCount: { classPropertyName: "autoKeepPointCount", publicName: "autoKeepPointCount", isSignal: true, isRequired: false, transformFunction: null }, showAutoMode: { classPropertyName: "showAutoMode", publicName: "showAutoMode", isSignal: true, isRequired: false, transformFunction: null }, autoModeActive: { classPropertyName: "autoModeActive", publicName: "autoModeActive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { autoModeChange: "autoModeChange" }, providers: [
31414
31472
  {
31415
31473
  provide: NG_VALUE_ACCESSOR,
31416
31474
  useExisting: forwardRef(() => AggregationPickerComponent),
31417
31475
  multi: true
31418
31476
  }
31419
- ], ngImport: i0, template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"(value ? AGGREGATION_TEXTS[value] : AGGREGATION_TEXTS.undefined) | translate\"\n tooltip=\"{{\n (value\n ? AGGREGATION_TEXTS[value]\n : disabled\n ? AGGREGATION_TEXTS.disabled\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"value ? AGGREGATION_ICONS[value] : AGGREGATION_ICONS.undefined\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n >\n @for (aggregation of AGGREGATIONS; track aggregation.id) {\n <li\n [ngClass]=\"{\n active: aggregation.id === value,\n disabled: disabledAggregations[aggregation.id]\n }\"\n >\n <button\n class=\"\"\n (click)=\"onChange(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"disabledAggregations[aggregation.id]\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</div>\n", dependencies: [{ kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1$2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$4.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: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
31477
+ ], ngImport: i0, template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n @let toggleText =\n autoModeActive()\n ? autoPoints() != null\n ? ((autoKeepPointCount() ? AUTO_POINTS_TOOLTIP_KEPT : AUTO_POINTS_TOOLTIP)\n | translate: { points: autoPoints() })\n : (AUTO_LABEL | translate)\n : value\n ? (AGGREGATION_TEXTS[value] | translate)\n : (AGGREGATION_TEXTS.undefined | translate);\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"toggleText\"\n [tooltip]=\"disabled ? (AGGREGATION_TEXTS.disabled | translate) : toggleText\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-8\"\n [c8yIcon]=\"\n autoModeActive()\n ? AUTO_ICON\n : value\n ? AGGREGATION_ICONS[value]\n : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span class=\"text-muted fit-w text-10 l-h-1\">\n {{ 'Aggregation' | translate }}\n </span>\n <span class=\"text-bold text-12 fit-w l-h-1 d-flex a-i-center gap-4\">\n @if (autoModeActive()) {\n <span class=\"text-truncate\">{{ AUTO_LABEL | translate }}</span>\n @if (autoPoints() != null) {\n <span\n class=\"m-l-auto badge badge-info flex-no-shrink l-h-1 text-10\"\n style=\"min-height: 12px\"\n >\n {{ autoPoints() }}\n </span>\n }\n } @else {\n <span class=\"text-truncate\">\n {{ (value ? AGGREGATION_LABELS[value] : AGGREGATION_LABELS.NONE) | translate }}\n </span>\n }\n </span>\n </div>\n <span class=\"caret m-r-8 m-l-4 flex-no-shrink\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n >\n @for (aggregation of AGGREGATIONS; track aggregation.id) {\n <li\n [ngClass]=\"{\n active: !autoModeActive() && aggregation.id === value,\n disabled: aggregation.id ? disabledAggregations[aggregation.id] : false\n }\"\n >\n <button\n class=\"\"\n (click)=\"selectAggregation(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"aggregation.id ? disabledAggregations[aggregation.id] : false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n }\n\n @if (showAutoMode()) {\n <li [class.active]=\"autoModeActive()\">\n <button\n class=\"\"\n (click)=\"selectAggregation(AUTO_ITEM_ID)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"AUTO_ICON\"\n ></i>\n <span>{{ AUTO_LABEL | translate }}</span>\n </button>\n </li>\n\n <div\n class=\"p-t-8 p-b-8 p-l-16 p-r-16 separator-top\"\n [collapse]=\"!autoModeActive()\"\n [isAnimated]=\"true\"\n >\n <ng-content select=\"[autoAggregationOptions]\"></ng-content>\n </div>\n }\n </ul>\n</div>\n", dependencies: [{ kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1$2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i2$3.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$4.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: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i4$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
31420
31478
  }
31421
31479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AggregationPickerComponent, decorators: [{
31422
31480
  type: Component,
@@ -31426,10 +31484,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
31426
31484
  useExisting: forwardRef(() => AggregationPickerComponent),
31427
31485
  multi: true
31428
31486
  }
31429
- ], standalone: true, imports: [BsDropdownModule, TooltipModule, IconDirective, NgFor, NgClass, C8yTranslatePipe], template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"(value ? AGGREGATION_TEXTS[value] : AGGREGATION_TEXTS.undefined) | translate\"\n tooltip=\"{{\n (value\n ? AGGREGATION_TEXTS[value]\n : disabled\n ? AGGREGATION_TEXTS.disabled\n : AGGREGATION_TEXTS.undefined\n ) | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"value ? AGGREGATION_ICONS[value] : AGGREGATION_ICONS.undefined\"\n ></i>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n >\n @for (aggregation of AGGREGATIONS; track aggregation.id) {\n <li\n [ngClass]=\"{\n active: aggregation.id === value,\n disabled: disabledAggregations[aggregation.id]\n }\"\n >\n <button\n class=\"\"\n (click)=\"onChange(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"disabledAggregations[aggregation.id]\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</div>\n" }]
31487
+ ], standalone: true, imports: [
31488
+ BsDropdownModule,
31489
+ CollapseModule,
31490
+ TooltipModule,
31491
+ IconDirective,
31492
+ NgClass,
31493
+ A11yModule,
31494
+ C8yTranslatePipe
31495
+ ], template: "<div\n class=\"dropdown\"\n style=\"border: 0; margin-left: -1px\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n [isDisabled]=\"disabled\"\n>\n @let toggleText =\n autoModeActive()\n ? autoPoints() != null\n ? ((autoKeepPointCount() ? AUTO_POINTS_TOOLTIP_KEPT : AUTO_POINTS_TOOLTIP)\n | translate: { points: autoPoints() })\n : (AUTO_LABEL | translate)\n : value\n ? (AGGREGATION_TEXTS[value] | translate)\n : (AGGREGATION_TEXTS.undefined | translate);\n <button\n class=\"dropdown-toggle form-control p-t-0 p-b-0 l-h-1 d-flex a-i-center\"\n [attr.aria-label]=\"toggleText\"\n [tooltip]=\"disabled ? (AGGREGATION_TEXTS.disabled | translate) : toggleText\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-8\"\n [c8yIcon]=\"\n autoModeActive()\n ? AUTO_ICON\n : value\n ? AGGREGATION_ICONS[value]\n : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span class=\"text-muted fit-w text-10 l-h-1\">\n {{ 'Aggregation' | translate }}\n </span>\n <span class=\"text-bold text-12 fit-w l-h-1 d-flex a-i-center gap-4\">\n @if (autoModeActive()) {\n <span class=\"text-truncate\">{{ AUTO_LABEL | translate }}</span>\n @if (autoPoints() != null) {\n <span\n class=\"m-l-auto badge badge-info flex-no-shrink l-h-1 text-10\"\n style=\"min-height: 12px\"\n >\n {{ autoPoints() }}\n </span>\n }\n } @else {\n <span class=\"text-truncate\">\n {{ (value ? AGGREGATION_LABELS[value] : AGGREGATION_LABELS.NONE) | translate }}\n </span>\n }\n </span>\n </div>\n <span class=\"caret m-r-8 m-l-4 flex-no-shrink\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu-right--xs\"\n *dropdownMenu\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n >\n @for (aggregation of AGGREGATIONS; track aggregation.id) {\n <li\n [ngClass]=\"{\n active: !autoModeActive() && aggregation.id === value,\n disabled: aggregation.id ? disabledAggregations[aggregation.id] : false\n }\"\n >\n <button\n class=\"\"\n (click)=\"selectAggregation(aggregation.id); dropdown.isOpen = false\"\n [disabled]=\"aggregation.id ? disabledAggregations[aggregation.id] : false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n aggregation.id ? AGGREGATION_ICONS[aggregation.id] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n <span>{{ aggregation.title | translate }}</span>\n </button>\n </li>\n }\n\n @if (showAutoMode()) {\n <li [class.active]=\"autoModeActive()\">\n <button\n class=\"\"\n (click)=\"selectAggregation(AUTO_ITEM_ID)\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"AUTO_ICON\"\n ></i>\n <span>{{ AUTO_LABEL | translate }}</span>\n </button>\n </li>\n\n <div\n class=\"p-t-8 p-b-8 p-l-16 p-r-16 separator-top\"\n [collapse]=\"!autoModeActive()\"\n [isAnimated]=\"true\"\n >\n <ng-content select=\"[autoAggregationOptions]\"></ng-content>\n </div>\n }\n </ul>\n</div>\n" }]
31430
31496
  }], propDecorators: { disabledAggregations: [{
31431
31497
  type: Input
31432
- }] } });
31498
+ }], autoModeChange: [{ type: i0.Output, args: ["autoModeChange"] }], autoPoints: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoPoints", required: false }] }], autoKeepPointCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoKeepPointCount", required: false }] }], showAutoMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAutoMode", required: false }] }], autoModeActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoModeActive", required: false }] }] } });
31433
31499
 
31434
31500
  class WidgetTimeContextComponent {
31435
31501
  /**
@@ -31847,7 +31913,7 @@ class WidgetTimeContextComponent {
31847
31913
  }
31848
31914
  }
31849
31915
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: WidgetTimeContextComponent, deps: [{ token: WidgetsDashboardEventService }, { token: DashboardChildComponent }, { token: i1$7.FormBuilder }, { token: WidgetTimeContextQueryService }, { token: WidgetTimeContextHelperService }, { token: i1$3.Router }, { token: ActionBarService }, { token: AggregationService }, { token: i1$3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
31850
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: WidgetTimeContextComponent, isStandalone: true, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple", displaySettings: "displaySettings", hidden: "hidden" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime || isAutoRefreshEnabled\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime || isAutoRefreshEnabled\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1$2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$4.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: "component", type: IntervalPickerComponent, selector: "c8y-interval-picker", inputs: ["INTERVALS"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: RealtimeControlComponent, selector: "c8y-realtime-control" }, { kind: "component", type: AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations"] }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
31916
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: WidgetTimeContextComponent, isStandalone: true, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple", displaySettings: "displaySettings", hidden: "hidden" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime || isAutoRefreshEnabled\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime || isAutoRefreshEnabled\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1$2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$4.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: "component", type: IntervalPickerComponent, selector: "c8y-interval-picker", inputs: ["INTERVALS"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: RealtimeControlComponent, selector: "c8y-realtime-control" }, { kind: "component", type: AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations", "autoPoints", "autoKeepPointCount", "showAutoMode", "autoModeActive"], outputs: ["autoModeChange"] }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
31851
31917
  }
31852
31918
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: WidgetTimeContextComponent, decorators: [{
31853
31919
  type: Component,
@@ -38293,6 +38359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
38293
38359
  }]
38294
38360
  }], ctorParameters: () => [{ type: QueryParamBottomDrawerStateService }, { type: BottomDrawerService }] });
38295
38361
 
38362
+ /* eslint-disable @typescript-eslint/no-explicit-any */
38296
38363
  const HOOK_QUERY_PARAM_MODAL = new InjectionToken('HOOK_QUERY_PARAM_MODAL');
38297
38364
  function hookQueryParamModal(config, options) {
38298
38365
  return hookGeneric(config, HOOK_QUERY_PARAM_MODAL, options);
@@ -38324,12 +38391,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
38324
38391
  }]
38325
38392
  }], ctorParameters: () => [{ type: i0.Injector }, { type: PluginsResolveService }] });
38326
38393
  class QueryParamModalFactory {
38327
- constructor(queryParamModalStateService, bsModalService, router, activatedRoute) {
38394
+ constructor(queryParamModalStateService, bsModalService, router, activatedRoute, destroyRef) {
38328
38395
  this.queryParamModalStateService = queryParamModalStateService;
38329
38396
  this.bsModalService = bsModalService;
38330
38397
  this.router = router;
38331
38398
  this.activatedRoute = activatedRoute;
38332
- this.modalCloseSubscription = null;
38399
+ this.destroyRef = destroyRef;
38400
+ this.pendingModals = new Set();
38401
+ this.openModals = new Map();
38333
38402
  }
38334
38403
  get() {
38335
38404
  return this.queryParamModalStateService.items$.pipe(map$1(items => {
@@ -38347,21 +38416,35 @@ class QueryParamModalFactory {
38347
38416
  }
38348
38417
  /**
38349
38418
  * Handles the display of a modal based on a specific query parameter.
38419
+ * Guards against opening multiple modals for the same query param when the
38420
+ * trigger fires repeatedly during app initialization.
38350
38421
  *
38351
38422
  * @param config - Configuration object specifying the query parameter, component, and optional modal settings.
38352
- * @returns An observable that listens for changes in the query parameter.
38353
38423
  */
38354
38424
  async handleQueryParamModal(config) {
38355
- const component = config.component
38356
- ? config.component
38357
- : config.loadComponent
38358
- ? await config.loadComponent()
38359
- : null;
38360
- const modalRef = this.showModal(component, config.modalConfig);
38361
- this.modalCloseSubscription = modalRef.onHidden.subscribe(() => {
38362
- this.removeQueryParam(config.queryParam);
38363
- this.cleanup();
38364
- });
38425
+ if (this.pendingModals.has(config.queryParam) || this.openModals.has(config.queryParam)) {
38426
+ return;
38427
+ }
38428
+ this.pendingModals.add(config.queryParam);
38429
+ try {
38430
+ const component = config.component
38431
+ ? config.component
38432
+ : config.loadComponent
38433
+ ? await config.loadComponent()
38434
+ : null;
38435
+ if (!component) {
38436
+ return;
38437
+ }
38438
+ const modalRef = this.showModal(component, config.modalConfig);
38439
+ this.openModals.set(config.queryParam, modalRef);
38440
+ modalRef.onHidden.pipe(take(1), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
38441
+ this.openModals.delete(config.queryParam);
38442
+ this.removeQueryParam(config.queryParam);
38443
+ });
38444
+ }
38445
+ finally {
38446
+ this.pendingModals.delete(config.queryParam);
38447
+ }
38365
38448
  }
38366
38449
  /**
38367
38450
  * Removes the specified query parameter from the URL.
@@ -38387,17 +38470,7 @@ class QueryParamModalFactory {
38387
38470
  showModal(component, modalConfig) {
38388
38471
  return this.bsModalService.show(component, modalConfig);
38389
38472
  }
38390
- /**
38391
- * Cleans up subscriptions related to modal events.
38392
- * Ensures no memory leaks by unsubscribing from modal close events.
38393
- */
38394
- cleanup() {
38395
- if (this.modalCloseSubscription) {
38396
- this.modalCloseSubscription.unsubscribe();
38397
- this.modalCloseSubscription = null;
38398
- }
38399
- }
38400
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: QueryParamModalFactory, deps: [{ token: QueryParamModalStateService }, { token: i1$6.BsModalService }, { token: i1$3.Router }, { token: i1$3.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
38473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: QueryParamModalFactory, deps: [{ token: QueryParamModalStateService }, { token: i1$6.BsModalService }, { token: i1$3.Router }, { token: i1$3.ActivatedRoute, optional: true }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Injectable }); }
38401
38474
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: QueryParamModalFactory, providedIn: 'root' }); }
38402
38475
  }
38403
38476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: QueryParamModalFactory, decorators: [{
@@ -38407,7 +38480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
38407
38480
  }]
38408
38481
  }], ctorParameters: () => [{ type: QueryParamModalStateService }, { type: i1$6.BsModalService }, { type: i1$3.Router }, { type: i1$3.ActivatedRoute, decorators: [{
38409
38482
  type: Optional
38410
- }] }] });
38483
+ }] }, { type: i0.DestroyRef }] });
38411
38484
 
38412
38485
  const QUERY_PARAM_HANDLER_PROVIDERS = [
38413
38486
  // This will ensure that the QueryParamHandlerService is initialized
@@ -41095,5 +41168,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
41095
41168
  * Generated bundle index. Do not edit.
41096
41169
  */
41097
41170
 
41098
- export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, ApplyRangeClassPipe, AssetDefinitionsService, AssetHierarchyService, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BASELINE_COLUMNS, BASELINE_ROWS, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DropdownFocusTrapDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IconPanelComponent, IfAllowedDirective, InjectionType, InputGroupEditableComponent, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntersectionObserverService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, LoadingMessageComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PasswordValidationDirective, PasswordValidationService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, SplitViewAlertsComponent, SplitViewComponent, SplitViewDetailsActionsComponent, SplitViewDetailsComponent, SplitViewExtraHeaderComponent, SplitViewFooterComponent, SplitViewHeaderActionsComponent, SplitViewListComponent, SplitViewListItemDirective, SplitViewSelectionService, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, StripHtmlPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollListenerDirective, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetActionWrapperComponent, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isBinaryFile, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, scaleWidgetDimensions, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
41171
+ export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AUTO_AGGREGATION_ICON, AUTO_POINTS_TOOLTIP, AUTO_POINTS_TOOLTIP_KEPT, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, ApplyRangeClassPipe, AssetDefinitionsService, AssetHierarchyService, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BASELINE_COLUMNS, BASELINE_ROWS, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DropdownFocusTrapDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IconPanelComponent, IfAllowedDirective, InjectionType, InputGroupEditableComponent, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntersectionObserverService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, LoadingMessageComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PasswordValidationDirective, PasswordValidationService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, SplitViewAlertsComponent, SplitViewComponent, SplitViewDetailsActionsComponent, SplitViewDetailsComponent, SplitViewExtraHeaderComponent, SplitViewFooterComponent, SplitViewHeaderActionsComponent, SplitViewListComponent, SplitViewListItemDirective, SplitViewSelectionService, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, StripHtmlPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollListenerDirective, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetActionWrapperComponent, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isBinaryFile, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, scaleWidgetDimensions, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
41099
41172
  //# sourceMappingURL=c8y-ngx-components.mjs.map