@c8y/ngx-components 1022.6.1 → 1022.9.6

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 (83) hide show
  1. package/alarms/index.d.ts +1 -0
  2. package/alarms/index.d.ts.map +1 -1
  3. package/context-dashboard/context-dashboard.component.d.ts +1 -3
  4. package/context-dashboard/context-dashboard.component.d.ts.map +1 -1
  5. package/core/core.module.d.ts.map +1 -1
  6. package/core/file-picker/file-picker.component.d.ts +5 -2
  7. package/core/file-picker/file-picker.component.d.ts.map +1 -1
  8. package/core/index.d.ts +1 -0
  9. package/core/index.d.ts.map +1 -1
  10. package/core/preview-feature/feature-cache.service.d.ts +3 -1
  11. package/core/preview-feature/feature-cache.service.d.ts.map +1 -1
  12. package/core/preview-feature/preview-feature-button.component.d.ts +3 -2
  13. package/core/preview-feature/preview-feature-button.component.d.ts.map +1 -1
  14. package/core/preview-feature/preview-feature-query-param.factory.d.ts +24 -0
  15. package/core/preview-feature/preview-feature-query-param.factory.d.ts.map +1 -0
  16. package/core/preview-feature/preview-feature-show-notification.service.d.ts +4 -1
  17. package/core/preview-feature/preview-feature-show-notification.service.d.ts.map +1 -1
  18. package/core/preview-feature/preview-feature.component.d.ts +2 -0
  19. package/core/preview-feature/preview-feature.component.d.ts.map +1 -1
  20. package/core/preview-feature/preview-feature.model.d.ts +1 -1
  21. package/core/preview-feature/preview-feature.model.d.ts.map +1 -1
  22. package/core/preview-feature/preview-feature.providers.d.ts.map +1 -1
  23. package/core/query-param-handler/index.d.ts +5 -0
  24. package/core/query-param-handler/index.d.ts.map +1 -0
  25. package/core/query-param-handler/query-param-bottom-drawer.service.d.ts +48 -0
  26. package/core/query-param-handler/query-param-bottom-drawer.service.d.ts.map +1 -0
  27. package/core/query-param-handler/query-param-handler.service.d.ts +31 -0
  28. package/core/query-param-handler/query-param-handler.service.d.ts.map +1 -0
  29. package/core/query-param-handler/query-param-modal-handler.service.d.ts +79 -0
  30. package/core/query-param-handler/query-param-modal-handler.service.d.ts.map +1 -0
  31. package/datapoint-explorer/view/datapoint-explorer.component.d.ts +3 -2
  32. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -1
  33. package/datapoint-explorer/view/datapoint-explorer.service.d.ts +2 -0
  34. package/datapoint-explorer/view/datapoint-explorer.service.d.ts.map +1 -1
  35. package/datapoint-explorer/view/send-as-widget-to-dashboard-modal/send-as-widget-to-dashboard-modal.component.d.ts +24 -0
  36. package/datapoint-explorer/view/send-as-widget-to-dashboard-modal/send-as-widget-to-dashboard-modal.component.d.ts.map +1 -0
  37. package/datapoint-explorer/view/send-as-widget-to-report-modal/send-as-widget-to-report-modal.component.d.ts +1 -1
  38. package/echart/charts.component.d.ts.map +1 -1
  39. package/echart/services/y-axis.service.d.ts.map +1 -1
  40. package/fesm2022/c8y-ngx-components-alarms.mjs +1 -1
  41. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +4 -20
  42. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  43. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +121 -39
  44. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  45. package/fesm2022/c8y-ngx-components-echart.mjs +9 -6
  46. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  47. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +2 -2
  48. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +2 -2
  50. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
  52. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +6 -6
  54. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-repository-software.mjs +4 -4
  56. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-sensor-phone.mjs +331 -8
  58. package/fesm2022/c8y-ngx-components-sensor-phone.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +25 -17
  60. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components.mjs +429 -101
  62. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  63. package/locales/de.po +29 -3
  64. package/locales/es.po +29 -3
  65. package/locales/fr.po +29 -3
  66. package/locales/ja_JP.po +28 -3
  67. package/locales/ko.po +29 -3
  68. package/locales/locales.pot +29 -3
  69. package/locales/nl.po +29 -3
  70. package/locales/pl.po +29 -3
  71. package/locales/pt_BR.po +29 -3
  72. package/locales/zh_CN.po +29 -3
  73. package/locales/zh_TW.po +29 -3
  74. package/package.json +1 -1
  75. package/sensor-phone/sensor-phone.module.d.ts.map +1 -1
  76. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -1
  77. package/fesm2022/c8y-ngx-components-query-param-modal-handler.mjs +0 -115
  78. package/fesm2022/c8y-ngx-components-query-param-modal-handler.mjs.map +0 -1
  79. package/query-param-modal-handler/c8y-ngx-components-query-param-modal-handler.d.ts.map +0 -1
  80. package/query-param-modal-handler/index.d.ts +0 -2
  81. package/query-param-modal-handler/index.d.ts.map +0 -1
  82. package/query-param-modal-handler/query-param-modal-handler.service.d.ts +0 -77
  83. package/query-param-modal-handler/query-param-modal-handler.service.d.ts.map +0 -1
@@ -1205,7 +1205,7 @@ class RealtimeSubjectService {
1205
1205
  realtimeSubscription = this.realtime.resubscribe(realtimeSubscription);
1206
1206
  }
1207
1207
  catch (e) {
1208
- console.warn(`Failed to resubscribe to channel: "${channel}" after reconnect.`, e);
1208
+ console.warn('Failed to resubscribe to channel after reconnect.', channel, e);
1209
1209
  observer.error(e);
1210
1210
  }
1211
1211
  });
@@ -11179,11 +11179,11 @@ class AlertOutletComponent extends AlertOutletBase {
11179
11179
  this.alertService.remove(alert);
11180
11180
  }
11181
11181
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AlertOutletComponent, deps: [{ token: 'position', attribute: true }, { token: AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
11182
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AlertOutletComponent, isStandalone: true, selector: "c8y-alert-outlet", host: { properties: { "class.static": "this.isStatic" } }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"alert animated fadeInRightBig m-t-16\"\n data-cy=\"c8y-alert--message\"\n *ngFor=\"let alert of alerts | async\"\n [ngClass]=\"[getClass(alert), isDetailsShow(alert) ? 'expanded' : '']\"\n>\n <button title=\"{{ 'Close' | translate }}\" type=\"button\" class=\"close\" (click)=\"close(alert)\">\n <span aria-hidden=\"true\"><i c8yIcon=\"times\"></i></span>\n <span class=\"sr-only\">{{ 'Close' | translate }}</span>\n </button>\n\n <div *ngIf=\"!isTemplateRef(alert.text); else template(alert.text)\">\n <strong *ngIf=\"!alert.allowHtml\" [textContent]=\"alert.text | translate\" class=\"message\"></strong>\n <strong *ngIf=\"alert.allowHtml\" [innerHTML]=\"alert.text | translate\" class=\"message\"></strong>\n </div>\n <p *ngIf=\"hasDetails(alert) && !isDetailsShow(alert)\" class=\"text-muted m-t-8\">\n <button\n title=\"{{ 'Show details' | translate }}\"\n class=\"btn btn-clean\"\n (click)=\"showDetails(alert)\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n {{ 'Show details' | translate }}\n </button>\n </p>\n <p *ngIf=\"hasDetails(alert) && isDetailsShow(alert)\" class=\"text-muted m-t-8\">\n <button title=\"{{ 'Hide details' | translate }}\" class=\"btn btn-clean\" (click)=\"closeDetails()\">\n <i c8yIcon=\"chevron-up\"></i>\n {{ 'Hide details' | translate }}\n </button>\n </p>\n <div *ngIf=\"isDetailsShow(alert)\">\n <div *ngIf=\"!isTemplateRef(detailDisplayedAlert.contents); else template(alert.detailedData)\">\n <pre><code [textContent]=\"detailDisplayedAlert.contents | translate\"></code></pre>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
11182
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AlertOutletComponent, isStandalone: true, selector: "c8y-alert-outlet", host: { properties: { "class.static": "this.isStatic" } }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"alert animated fadeInRightBig m-t-16\"\n data-cy=\"c8y-alert--message\"\n *ngFor=\"let alert of alerts | async\"\n [ngClass]=\"[getClass(alert), isDetailsShow(alert) ? 'expanded' : '']\"\n>\n <button\n class=\"close\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"close(alert)\"\n >\n <span\n aria-hidden=\"true\"\n data-cy=\"alert--close-alert-message\"\n >\n <i c8yIcon=\"times\"></i>\n </span>\n <span class=\"sr-only\">{{ 'Close' | translate }}</span>\n </button>\n\n <div *ngIf=\"!isTemplateRef(alert.text); else template(alert.text)\">\n <strong\n class=\"message\"\n *ngIf=\"!alert.allowHtml\"\n [textContent]=\"alert.text | translate\"\n ></strong>\n <strong\n class=\"message\"\n *ngIf=\"alert.allowHtml\"\n [innerHTML]=\"alert.text | translate\"\n ></strong>\n </div>\n <p\n class=\"text-muted m-t-8\"\n *ngIf=\"hasDetails(alert) && !isDetailsShow(alert)\"\n >\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Show details' | translate }}\"\n (click)=\"showDetails(alert)\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n {{ 'Show details' | translate }}\n </button>\n </p>\n <p\n class=\"text-muted m-t-8\"\n *ngIf=\"hasDetails(alert) && isDetailsShow(alert)\"\n >\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Hide details' | translate }}\"\n (click)=\"closeDetails()\"\n >\n <i c8yIcon=\"chevron-up\"></i>\n {{ 'Hide details' | translate }}\n </button>\n </p>\n <div *ngIf=\"isDetailsShow(alert)\">\n <div *ngIf=\"!isTemplateRef(detailDisplayedAlert.contents); else template(alert.detailedData)\">\n <pre><code [textContent]=\"detailDisplayedAlert.contents | translate\"></code></pre>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
11183
11183
  }
11184
11184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AlertOutletComponent, decorators: [{
11185
11185
  type: Component,
11186
- args: [{ selector: 'c8y-alert-outlet', standalone: true, imports: [NgFor, NgClass, IconDirective, NgIf, C8yTranslatePipe, AsyncPipe], template: "<div\n class=\"alert animated fadeInRightBig m-t-16\"\n data-cy=\"c8y-alert--message\"\n *ngFor=\"let alert of alerts | async\"\n [ngClass]=\"[getClass(alert), isDetailsShow(alert) ? 'expanded' : '']\"\n>\n <button title=\"{{ 'Close' | translate }}\" type=\"button\" class=\"close\" (click)=\"close(alert)\">\n <span aria-hidden=\"true\"><i c8yIcon=\"times\"></i></span>\n <span class=\"sr-only\">{{ 'Close' | translate }}</span>\n </button>\n\n <div *ngIf=\"!isTemplateRef(alert.text); else template(alert.text)\">\n <strong *ngIf=\"!alert.allowHtml\" [textContent]=\"alert.text | translate\" class=\"message\"></strong>\n <strong *ngIf=\"alert.allowHtml\" [innerHTML]=\"alert.text | translate\" class=\"message\"></strong>\n </div>\n <p *ngIf=\"hasDetails(alert) && !isDetailsShow(alert)\" class=\"text-muted m-t-8\">\n <button\n title=\"{{ 'Show details' | translate }}\"\n class=\"btn btn-clean\"\n (click)=\"showDetails(alert)\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n {{ 'Show details' | translate }}\n </button>\n </p>\n <p *ngIf=\"hasDetails(alert) && isDetailsShow(alert)\" class=\"text-muted m-t-8\">\n <button title=\"{{ 'Hide details' | translate }}\" class=\"btn btn-clean\" (click)=\"closeDetails()\">\n <i c8yIcon=\"chevron-up\"></i>\n {{ 'Hide details' | translate }}\n </button>\n </p>\n <div *ngIf=\"isDetailsShow(alert)\">\n <div *ngIf=\"!isTemplateRef(detailDisplayedAlert.contents); else template(alert.detailedData)\">\n <pre><code [textContent]=\"detailDisplayedAlert.contents | translate\"></code></pre>\n </div>\n </div>\n</div>\n" }]
11186
+ args: [{ selector: 'c8y-alert-outlet', standalone: true, imports: [NgFor, NgClass, IconDirective, NgIf, C8yTranslatePipe, AsyncPipe], template: "<div\n class=\"alert animated fadeInRightBig m-t-16\"\n data-cy=\"c8y-alert--message\"\n *ngFor=\"let alert of alerts | async\"\n [ngClass]=\"[getClass(alert), isDetailsShow(alert) ? 'expanded' : '']\"\n>\n <button\n class=\"close\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"close(alert)\"\n >\n <span\n aria-hidden=\"true\"\n data-cy=\"alert--close-alert-message\"\n >\n <i c8yIcon=\"times\"></i>\n </span>\n <span class=\"sr-only\">{{ 'Close' | translate }}</span>\n </button>\n\n <div *ngIf=\"!isTemplateRef(alert.text); else template(alert.text)\">\n <strong\n class=\"message\"\n *ngIf=\"!alert.allowHtml\"\n [textContent]=\"alert.text | translate\"\n ></strong>\n <strong\n class=\"message\"\n *ngIf=\"alert.allowHtml\"\n [innerHTML]=\"alert.text | translate\"\n ></strong>\n </div>\n <p\n class=\"text-muted m-t-8\"\n *ngIf=\"hasDetails(alert) && !isDetailsShow(alert)\"\n >\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Show details' | translate }}\"\n (click)=\"showDetails(alert)\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n {{ 'Show details' | translate }}\n </button>\n </p>\n <p\n class=\"text-muted m-t-8\"\n *ngIf=\"hasDetails(alert) && isDetailsShow(alert)\"\n >\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Hide details' | translate }}\"\n (click)=\"closeDetails()\"\n >\n <i c8yIcon=\"chevron-up\"></i>\n {{ 'Hide details' | translate }}\n </button>\n </p>\n <div *ngIf=\"isDetailsShow(alert)\">\n <div *ngIf=\"!isTemplateRef(detailDisplayedAlert.contents); else template(alert.detailedData)\">\n <pre><code [textContent]=\"detailDisplayedAlert.contents | translate\"></code></pre>\n </div>\n </div>\n</div>\n" }]
11187
11187
  }], ctorParameters: () => [{ type: undefined, decorators: [{
11188
11188
  type: Attribute,
11189
11189
  args: ['position']
@@ -22875,8 +22875,13 @@ class FilePickerComponent {
22875
22875
  this.onFilesPicked = new EventEmitter();
22876
22876
  this.maxAllowedFiles = Infinity;
22877
22877
  this.uploadChoice = 'uploadBinary';
22878
+ this.allowedUploadChoices = [
22879
+ 'uploadBinary',
22880
+ 'uploadUrl'
22881
+ ];
22878
22882
  this.config = { maxlength: 2048 };
22879
22883
  this.ValidationPattern = ValidationPattern;
22884
+ this.providedPopover = gettext$1('Use this option if the device will resolve the binary itself. No file is uploaded.');
22880
22885
  }
22881
22886
  /**
22882
22887
  * @ignore
@@ -22929,8 +22934,13 @@ class FilePickerComponent {
22929
22934
  isPopoverUsed() {
22930
22935
  return !isEmpty(this.fileUrlPopover);
22931
22936
  }
22937
+ setProvidedOption() {
22938
+ this.fileToSave = { url: '$PROVIDED' };
22939
+ delete this.fileUrl;
22940
+ this.onFilesPicked.emit(this.fileToSave);
22941
+ }
22932
22942
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FilePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22933
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: FilePickerComponent, isStandalone: true, selector: "c8y-file-picker", inputs: { maxAllowedFiles: "maxAllowedFiles", uploadChoice: "uploadChoice", fileUrl: "fileUrl", fileBinary: "fileBinary", config: "config", filePickerIndex: "filePickerIndex", fileUrlPopover: "fileUrlPopover" }, outputs: { onFilesPicked: "onFilesPicked" }, viewQueries: [{ propertyName: "dropArea", first: true, predicate: DropAreaComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice-{{filePickerIndex}}\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n title=\"{{ 'Provide a file path' | translate }}\"\n class=\"c8y-radio radio-inline m-l-8\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n #radio\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice-{{filePickerIndex}}\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"top\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"onFileDropped($event)\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"fileUrl\"\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n maxlength=\"{{ config.maxlength }}\"\n required\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$8.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$8.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$8.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1$8.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1$8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i1$9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
22943
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: FilePickerComponent, isStandalone: true, selector: "c8y-file-picker", inputs: { maxAllowedFiles: "maxAllowedFiles", uploadChoice: "uploadChoice", allowedUploadChoices: "allowedUploadChoices", fileUrl: "fileUrl", fileBinary: "fileBinary", config: "config", filePickerIndex: "filePickerIndex", fileUrlPopover: "fileUrlPopover" }, outputs: { onFilesPicked: "onFilesPicked" }, viewQueries: [{ propertyName: "dropArea", first: true, predicate: DropAreaComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label\n class=\"c8y-radio\"\n title=\"{{ 'Upload a binary' | translate }}\"\n >\n <input\n name=\"uploadChoice-{{ filePickerIndex }}\"\n type=\"radio\"\n value=\"uploadBinary\"\n #radio\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio m-l-8\"\n title=\"{{ 'Provide a file path' | translate }}\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n name=\"uploadChoice-{{ filePickerIndex }}\"\n type=\"radio\"\n value=\"uploadUrl\"\n #radio\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n <label\n class=\"c8y-radio m-l-8\"\n title=\"{{ 'Mark as provided' | translate }}\"\n *ngIf=\"allowedUploadChoices.includes('provided')\"\n >\n <input\n name=\"uploadChoice-{{ filePickerIndex }}\"\n type=\"radio\"\n value=\"provided\"\n #radio\n [(ngModel)]=\"uploadChoice\"\n (click)=\"setProvidedOption()\"\n />\n <span></span>\n <span>{{ 'Provided' | translate }}</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ providedPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n (dropped)=\"onFileDropped($event)\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n name=\"fileUrl\"\n type=\"text\"\n required\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n maxlength=\"{{ config.maxlength }}\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$8.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$8.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$8.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1$8.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1$8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i1$9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
22934
22944
  }
22935
22945
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FilePickerComponent, decorators: [{
22936
22946
  type: Component,
@@ -22943,7 +22953,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
22943
22953
  IconDirective,
22944
22954
  RequiredInputPlaceholderDirective,
22945
22955
  C8yTranslatePipe
22946
- ], template: "<div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice-{{filePickerIndex}}\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n title=\"{{ 'Provide a file path' | translate }}\"\n class=\"c8y-radio radio-inline m-l-8\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n #radio\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice-{{filePickerIndex}}\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"top\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"onFileDropped($event)\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"fileUrl\"\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n maxlength=\"{{ config.maxlength }}\"\n required\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n" }]
22956
+ ], template: "<div class=\"form-group\">\n <label\n class=\"c8y-radio\"\n title=\"{{ 'Upload a binary' | translate }}\"\n >\n <input\n name=\"uploadChoice-{{ filePickerIndex }}\"\n type=\"radio\"\n value=\"uploadBinary\"\n #radio\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio m-l-8\"\n title=\"{{ 'Provide a file path' | translate }}\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n name=\"uploadChoice-{{ filePickerIndex }}\"\n type=\"radio\"\n value=\"uploadUrl\"\n #radio\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n <label\n class=\"c8y-radio m-l-8\"\n title=\"{{ 'Mark as provided' | translate }}\"\n *ngIf=\"allowedUploadChoices.includes('provided')\"\n >\n <input\n name=\"uploadChoice-{{ filePickerIndex }}\"\n type=\"radio\"\n value=\"provided\"\n #radio\n [(ngModel)]=\"uploadChoice\"\n (click)=\"setProvidedOption()\"\n />\n <span></span>\n <span>{{ 'Provided' | translate }}</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ providedPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n (dropped)=\"onFileDropped($event)\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n name=\"fileUrl\"\n type=\"text\"\n required\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n maxlength=\"{{ config.maxlength }}\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n" }]
22947
22957
  }], propDecorators: { dropArea: [{
22948
22958
  type: ViewChild,
22949
22959
  args: [DropAreaComponent, { static: true }]
@@ -22953,6 +22963,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
22953
22963
  type: Input
22954
22964
  }], uploadChoice: [{
22955
22965
  type: Input
22966
+ }], allowedUploadChoices: [{
22967
+ type: Input
22956
22968
  }], fileUrl: [{
22957
22969
  type: Input
22958
22970
  }], fileBinary: [{
@@ -34919,10 +34931,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
34919
34931
  }] });
34920
34932
 
34921
34933
  class FeatureCacheService {
34922
- constructor(featureService) {
34934
+ constructor(featureService, appState) {
34923
34935
  this.featureService = featureService;
34936
+ this.appState = appState;
34924
34937
  this.refreshTrigger = new BehaviorSubject(undefined);
34925
- this.features$ = this.refreshTrigger.pipe(switchMap(() => this.loadFeatures()), shareReplay(1));
34938
+ this.features$ = this.appState.currentUser.pipe(switchMap(user => {
34939
+ if (!user) {
34940
+ return NEVER;
34941
+ }
34942
+ return this.refreshTrigger.pipe(switchMap(() => this.loadFeatures()));
34943
+ }), shareReplay(1));
34926
34944
  }
34927
34945
  /**
34928
34946
  * Needed for the angularJS implmentation to show/hide some old features.
@@ -34958,13 +34976,13 @@ class FeatureCacheService {
34958
34976
  return [];
34959
34977
  }
34960
34978
  }
34961
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FeatureCacheService, deps: [{ token: i1.FeatureService }], target: i0.ɵɵFactoryTarget.Injectable }); }
34979
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FeatureCacheService, deps: [{ token: i1.FeatureService }, { token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
34962
34980
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FeatureCacheService, providedIn: 'root' }); }
34963
34981
  }
34964
34982
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FeatureCacheService, decorators: [{
34965
34983
  type: Injectable,
34966
34984
  args: [{ providedIn: 'root' }]
34967
- }], ctorParameters: () => [{ type: i1.FeatureService }] });
34985
+ }], ctorParameters: () => [{ type: i1.FeatureService }, { type: AppStateService }] });
34968
34986
 
34969
34987
  const HOOK_PREVIEW = new InjectionToken('HOOK_PREVIEW');
34970
34988
  function hookPreview(preview, options) {
@@ -35086,7 +35104,378 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
35086
35104
  args: [{ providedIn: 'root' }]
35087
35105
  }], ctorParameters: () => [{ type: i0.Injector }, { type: PluginsResolveService }] });
35088
35106
 
35089
- const SHOW_BETA_PREVIEW = 'showPreviewFeature';
35107
+ const SHOW_PREVIEW_FEATURES = 'showPreviewFeatures';
35108
+
35109
+ class PreviewFeatureButtonComponent {
35110
+ constructor() {
35111
+ this.previewService = inject(PreviewService);
35112
+ this.headerService = inject(HeaderService);
35113
+ this.router = inject(Router);
35114
+ this.route = inject(ActivatedRoute);
35115
+ this.destroy$ = new Subject();
35116
+ }
35117
+ async ngOnInit() {
35118
+ this.hasUnseenFeatures$ = this.previewService.hasUnseenFeatures$;
35119
+ this.open$ = this.headerService.rightDrawerOpen$;
35120
+ }
35121
+ async openPreviewFeature() {
35122
+ this.headerService.closeRightDrawer();
35123
+ this.router.navigate([], {
35124
+ relativeTo: this.route,
35125
+ queryParams: { showPreviewFeatures: true },
35126
+ queryParamsHandling: 'merge',
35127
+ replaceUrl: true
35128
+ });
35129
+ }
35130
+ ngOnDestroy() {
35131
+ this.destroy$.next();
35132
+ this.destroy$.complete();
35133
+ }
35134
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PreviewFeatureButtonComponent, isStandalone: true, selector: "c8y-preview-feature-button", ngImport: i0, template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i class=\"dlt-c8y-icon-science\"></i>\n <span\n class=\"text-bold\"\n translate\n >\n Preview features\n </span>\n <span\n class=\"m-l-8 tag tag--primary\"\n *ngIf=\"hasUnseenFeatures$ | async\"\n >\n {{ 'New' | translate }}\n </span>\n</div>\n<ul class=\"list-unstyled\">\n <li class=\"c8y-right-drawer__item\">\n <small translate>\n Enable or disable experimental features. Your feedback helps us improve functionality before\n final release.\n </small>\n </li>\n <li class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Manage preview features' | translate }}\"\n [attr.tabindex]=\"(open$ | async) ? '0' : '-1'\"\n (click)=\"openPreviewFeature()\"\n >\n <i class=\"m-t-0 m-b-9 text-14 dlt-c8y-icon-settings\"></i>\n <span translate>Manage preview features</span>\n </button>\n </li>\n</ul>\n", dependencies: [{ kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
35136
+ }
35137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureButtonComponent, decorators: [{
35138
+ type: Component,
35139
+ args: [{ selector: 'c8y-preview-feature-button', standalone: true, imports: [C8yTranslateDirective, C8yTranslatePipe, AsyncPipe, NgIf], template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i class=\"dlt-c8y-icon-science\"></i>\n <span\n class=\"text-bold\"\n translate\n >\n Preview features\n </span>\n <span\n class=\"m-l-8 tag tag--primary\"\n *ngIf=\"hasUnseenFeatures$ | async\"\n >\n {{ 'New' | translate }}\n </span>\n</div>\n<ul class=\"list-unstyled\">\n <li class=\"c8y-right-drawer__item\">\n <small translate>\n Enable or disable experimental features. Your feedback helps us improve functionality before\n final release.\n </small>\n </li>\n <li class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Manage preview features' | translate }}\"\n [attr.tabindex]=\"(open$ | async) ? '0' : '-1'\"\n (click)=\"openPreviewFeature()\"\n >\n <i class=\"m-t-0 m-b-9 text-14 dlt-c8y-icon-settings\"></i>\n <span translate>Manage preview features</span>\n </button>\n </li>\n</ul>\n" }]
35140
+ }] });
35141
+
35142
+ class PreviewFeatureDrawerFactory {
35143
+ constructor(options, previewService, permissions) {
35144
+ this.options = options;
35145
+ this.previewService = previewService;
35146
+ this.permissions = permissions;
35147
+ this.drawerItem = {
35148
+ component: PreviewFeatureButtonComponent,
35149
+ position: 'right',
35150
+ priority: 80,
35151
+ id: 'previewFeature'
35152
+ };
35153
+ }
35154
+ get() {
35155
+ return this.shouldShowPreviewFeature$().pipe(distinctUntilChanged(), map(shouldShowPreviewFeature => {
35156
+ if (shouldShowPreviewFeature) {
35157
+ return this.drawerItem;
35158
+ }
35159
+ return [];
35160
+ }));
35161
+ }
35162
+ shouldShowPreviewFeature$() {
35163
+ return combineLatest([
35164
+ this.options.get$('hidePreviewFeature'),
35165
+ this.previewService.getAvailableFeatures$()
35166
+ ]).pipe(map(([hidePreviewFeature, items]) => {
35167
+ const hasItems = items.length > 0;
35168
+ if (!hasItems) {
35169
+ return false;
35170
+ }
35171
+ const hasAdminRole = this.permissions.hasRole(Permissions.ROLE_TENANT_MANAGEMENT_ADMIN);
35172
+ if (hidePreviewFeature === undefined) {
35173
+ return hasItems && hasAdminRole;
35174
+ }
35175
+ return !hidePreviewFeature && hasItems && hasAdminRole;
35176
+ }));
35177
+ }
35178
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureDrawerFactory, deps: [{ token: OptionsService }, { token: PreviewService }, { token: Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
35179
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureDrawerFactory, providedIn: 'root' }); }
35180
+ }
35181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureDrawerFactory, decorators: [{
35182
+ type: Injectable,
35183
+ args: [{ providedIn: 'root' }]
35184
+ }], ctorParameters: () => [{ type: OptionsService }, { type: PreviewService }, { type: Permissions }] });
35185
+
35186
+ class PreviewFeatureShowNotification {
35187
+ constructor(previewService, permissions, appState) {
35188
+ this.previewService = previewService;
35189
+ this.permissions = permissions;
35190
+ this.appState = appState;
35191
+ this.shouldShowNotification$ = this.appState.currentUser.pipe(switchMap$1(user => {
35192
+ if (!user) {
35193
+ return of(false);
35194
+ }
35195
+ const hasAdminRole = this.permissions.hasRole(Permissions.ROLE_TENANT_MANAGEMENT_ADMIN);
35196
+ if (!hasAdminRole) {
35197
+ return of(false);
35198
+ }
35199
+ return this.previewService.hasUnseenFeatures$;
35200
+ }));
35201
+ }
35202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureShowNotification, deps: [{ token: PreviewService }, { token: Permissions }, { token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
35203
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureShowNotification, providedIn: 'root' }); }
35204
+ }
35205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureShowNotification, decorators: [{
35206
+ type: Injectable,
35207
+ args: [{ providedIn: 'root' }]
35208
+ }], ctorParameters: () => [{ type: PreviewService }, { type: Permissions }, { type: AppStateService }] });
35209
+
35210
+ class PluginLoadedPipe {
35211
+ constructor(pluginsResolve) {
35212
+ this.pluginsResolve = pluginsResolve;
35213
+ }
35214
+ transform(pluginName) {
35215
+ if (!pluginName) {
35216
+ return of(false);
35217
+ }
35218
+ return this.pluginsResolve.loadedPluginNames$.pipe(map$2(pluginNames => pluginNames.includes(pluginName)), distinctUntilChanged$1());
35219
+ }
35220
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PluginLoadedPipe, deps: [{ token: PluginsResolveService }], target: i0.ɵɵFactoryTarget.Pipe }); }
35221
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: PluginLoadedPipe, isStandalone: true, name: "c8yPluginLoaded" }); }
35222
+ }
35223
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PluginLoadedPipe, decorators: [{
35224
+ type: Pipe,
35225
+ args: [{
35226
+ name: 'c8yPluginLoaded',
35227
+ standalone: true
35228
+ }]
35229
+ }], ctorParameters: () => [{ type: PluginsResolveService }] });
35230
+
35231
+ const HOOK_QUERY_PARAM = new InjectionToken('HOOK_QUERY_PARAM');
35232
+ function hookQueryParam(config, options) {
35233
+ return hookGeneric(config, HOOK_QUERY_PARAM, options);
35234
+ }
35235
+ class QueryParamHandlerService extends ExtensionPointWithoutStateForPlugins {
35236
+ constructor(rootInjector, router, pluginService, activatedRoute) {
35237
+ super(rootInjector, pluginService);
35238
+ this.router = router;
35239
+ this.activatedRoute = activatedRoute;
35240
+ this.items$ = this.setupItemsObservable();
35241
+ combineLatest([this.items$, this.activatedRoute?.queryParamMap || NEVER])
35242
+ .pipe(distinctUntilChanged$1(([prevItems, prevParamsMap], [currItems, currParamsMap]) => {
35243
+ const previousItems = prevItems.map(item => item.queryParam).sort();
35244
+ const currentItems = currItems.map(item => item.queryParam).sort();
35245
+ const itemsUnchanged = JSON.stringify(previousItems) === JSON.stringify(currentItems);
35246
+ const prevParams = {};
35247
+ prevParamsMap.keys.forEach(key => {
35248
+ const value = prevParamsMap.get(key);
35249
+ if (value !== null) {
35250
+ prevParams[key] = value;
35251
+ }
35252
+ });
35253
+ const currParams = {};
35254
+ currParamsMap.keys.forEach(key => {
35255
+ const value = currParamsMap.get(key);
35256
+ if (value !== null) {
35257
+ currParams[key] = value;
35258
+ }
35259
+ });
35260
+ const paramsUnchanged = JSON.stringify(prevParams) === JSON.stringify(currParams);
35261
+ return itemsUnchanged && paramsUnchanged;
35262
+ }), tap$1(([items, params]) => {
35263
+ items.forEach(item => {
35264
+ const paramValue = params.get(item.queryParam);
35265
+ if (paramValue !== null) {
35266
+ runInInjectionContext(item.injector || rootInjector, () => {
35267
+ item.trigger();
35268
+ });
35269
+ }
35270
+ });
35271
+ }))
35272
+ .subscribe();
35273
+ }
35274
+ setupItemsObservable() {
35275
+ return fromTrigger(this.router, this.refresh$, [
35276
+ getInjectedHooks(HOOK_QUERY_PARAM, this.injectors),
35277
+ () => this.factories
35278
+ ]).pipe(distinctUntilChanged$1(), shareReplay$1(1));
35279
+ }
35280
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamHandlerService, deps: [{ token: i0.Injector }, { token: i1$4.Router }, { token: PluginsResolveService }, { token: i1$4.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
35281
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamHandlerService, providedIn: 'root' }); }
35282
+ }
35283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamHandlerService, decorators: [{
35284
+ type: Injectable,
35285
+ args: [{
35286
+ providedIn: 'root'
35287
+ }]
35288
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1$4.Router }, { type: PluginsResolveService }, { type: i1$4.ActivatedRoute, decorators: [{
35289
+ type: Optional
35290
+ }] }] });
35291
+
35292
+ const HOOK_QUERY_PARAM_BOTTOM_DRAWER = new InjectionToken('HOOK_QUERY_PARAM_BOTTOM_DRAWER');
35293
+ function hookQueryParamBottomDrawer(config, options) {
35294
+ return hookGeneric(config, HOOK_QUERY_PARAM_BOTTOM_DRAWER, options);
35295
+ }
35296
+ class QueryParamBottomDrawerStateService extends ExtensionPointWithoutStateForPlugins {
35297
+ constructor(rootInjector, pluginService) {
35298
+ super(rootInjector, pluginService);
35299
+ this.items$ = this.setupItemsObservable();
35300
+ }
35301
+ setupItemsObservable() {
35302
+ return fromTriggerOnce(undefined, this.refresh$, [
35303
+ getInjectedHooks(HOOK_QUERY_PARAM_BOTTOM_DRAWER, this.injectors),
35304
+ () => this.factories
35305
+ ]).pipe(distinctUntilChanged(), shareReplay(1));
35306
+ }
35307
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamBottomDrawerStateService, deps: [{ token: i0.Injector }, { token: PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
35308
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamBottomDrawerStateService, providedIn: 'root' }); }
35309
+ }
35310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamBottomDrawerStateService, decorators: [{
35311
+ type: Injectable,
35312
+ args: [{
35313
+ providedIn: 'root'
35314
+ }]
35315
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: PluginsResolveService }] });
35316
+ class QueryParamBottomDrawerFactory {
35317
+ constructor(queryParamBottomDrawerStateService, bottomDrawerService) {
35318
+ this.queryParamBottomDrawerStateService = queryParamBottomDrawerStateService;
35319
+ this.bottomDrawerService = bottomDrawerService;
35320
+ }
35321
+ get() {
35322
+ return this.queryParamBottomDrawerStateService.items$.pipe(map(items => {
35323
+ return items.map(item => {
35324
+ const config = {
35325
+ queryParam: item.queryParam,
35326
+ trigger: () => {
35327
+ this.handleQueryParamBottomDrawer(item);
35328
+ },
35329
+ injector: item.injector
35330
+ };
35331
+ return config;
35332
+ });
35333
+ }));
35334
+ }
35335
+ async handleQueryParamBottomDrawer(config) {
35336
+ const bottomDrawer = this.bottomDrawerService.openDrawer(config.component, {
35337
+ closeOnNavigation: config.closeOnNavigation,
35338
+ disableClickOutside: config.disableClickOutside
35339
+ });
35340
+ try {
35341
+ const result = await bottomDrawer.instance.shouldClose;
35342
+ if (result) {
35343
+ bottomDrawer.close();
35344
+ }
35345
+ }
35346
+ catch (e) {
35347
+ // intended empty
35348
+ }
35349
+ }
35350
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamBottomDrawerFactory, deps: [{ token: QueryParamBottomDrawerStateService }, { token: BottomDrawerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
35351
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamBottomDrawerFactory, providedIn: 'root' }); }
35352
+ }
35353
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamBottomDrawerFactory, decorators: [{
35354
+ type: Injectable,
35355
+ args: [{
35356
+ providedIn: 'root'
35357
+ }]
35358
+ }], ctorParameters: () => [{ type: QueryParamBottomDrawerStateService }, { type: BottomDrawerService }] });
35359
+
35360
+ const HOOK_QUERY_PARAM_MODAL = new InjectionToken('HOOK_QUERY_PARAM_MODAL');
35361
+ function hookQueryParamModal(config, options) {
35362
+ return hookGeneric(config, HOOK_QUERY_PARAM_MODAL, options);
35363
+ }
35364
+ /**
35365
+ * Service to manage the display of modals based on URL query parameter.
35366
+ *
35367
+ * This service listens for specific query parameters in the URL and opens corresponding modals when detected.
35368
+ * It automatically cleans up the query parameters from the URL when the modal is closed or query parameter value passed as 'false'.
35369
+ */
35370
+ class QueryParamModalStateService extends ExtensionPointWithoutStateForPlugins {
35371
+ constructor(rootInjector, pluginService) {
35372
+ super(rootInjector, pluginService);
35373
+ this.items$ = this.setupItemsObservable();
35374
+ }
35375
+ setupItemsObservable() {
35376
+ return fromTriggerOnce(undefined, this.refresh$, [
35377
+ getInjectedHooks(HOOK_QUERY_PARAM_MODAL, this.injectors),
35378
+ () => this.factories
35379
+ ]).pipe(distinctUntilChanged(), shareReplay(1));
35380
+ }
35381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamModalStateService, deps: [{ token: i0.Injector }, { token: PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
35382
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamModalStateService, providedIn: 'root' }); }
35383
+ }
35384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamModalStateService, decorators: [{
35385
+ type: Injectable,
35386
+ args: [{
35387
+ providedIn: 'root'
35388
+ }]
35389
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: PluginsResolveService }] });
35390
+ class QueryParamModalFactory {
35391
+ constructor(queryParamModalStateService, bsModalService, router, activatedRoute) {
35392
+ this.queryParamModalStateService = queryParamModalStateService;
35393
+ this.bsModalService = bsModalService;
35394
+ this.router = router;
35395
+ this.activatedRoute = activatedRoute;
35396
+ this.modalCloseSubscription = null;
35397
+ }
35398
+ get() {
35399
+ return this.queryParamModalStateService.items$.pipe(map(items => {
35400
+ return items.map(item => {
35401
+ const config = {
35402
+ queryParam: item.queryParam,
35403
+ trigger: () => {
35404
+ this.handleQueryParamModal(item);
35405
+ },
35406
+ injector: item.injector
35407
+ };
35408
+ return config;
35409
+ });
35410
+ }));
35411
+ }
35412
+ /**
35413
+ * Handles the display of a modal based on a specific query parameter.
35414
+ *
35415
+ * @param config - Configuration object specifying the query parameter, component, and optional modal settings.
35416
+ * @returns An observable that listens for changes in the query parameter.
35417
+ */
35418
+ handleQueryParamModal(config) {
35419
+ this.showModal(config.component, config.modalConfig);
35420
+ this.modalCloseSubscription = this.bsModalService.onHidden.subscribe(() => {
35421
+ this.removeQueryParam(config.queryParam);
35422
+ this.cleanup();
35423
+ });
35424
+ }
35425
+ /**
35426
+ * Removes the specified query parameter from the URL.
35427
+ *
35428
+ * @param paramKey - The key of the query parameter to remove.
35429
+ */
35430
+ removeQueryParam(paramKey) {
35431
+ const queryParams = {
35432
+ [paramKey]: null
35433
+ };
35434
+ this.router.navigate([], {
35435
+ relativeTo: this.activatedRoute,
35436
+ queryParams,
35437
+ queryParamsHandling: 'merge'
35438
+ });
35439
+ }
35440
+ /**
35441
+ * Displays a modal with the specified component and configuration.
35442
+ *
35443
+ * @param component - The component to display in the modal.
35444
+ * @param modalConfig - Optional settings for the modal appearance and behavior.
35445
+ */
35446
+ showModal(component, modalConfig) {
35447
+ this.bsModalService.show(component, modalConfig);
35448
+ }
35449
+ /**
35450
+ * Cleans up subscriptions related to modal events.
35451
+ * Ensures no memory leaks by unsubscribing from modal close events.
35452
+ */
35453
+ cleanup() {
35454
+ if (this.modalCloseSubscription) {
35455
+ this.modalCloseSubscription.unsubscribe();
35456
+ this.modalCloseSubscription = null;
35457
+ }
35458
+ }
35459
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamModalFactory, deps: [{ token: QueryParamModalStateService }, { token: i1$7.BsModalService }, { token: i1$4.Router }, { token: i1$4.ActivatedRoute, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
35460
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamModalFactory, providedIn: 'root' }); }
35461
+ }
35462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QueryParamModalFactory, decorators: [{
35463
+ type: Injectable,
35464
+ args: [{
35465
+ providedIn: 'root'
35466
+ }]
35467
+ }], ctorParameters: () => [{ type: QueryParamModalStateService }, { type: i1$7.BsModalService }, { type: i1$4.Router }, { type: i1$4.ActivatedRoute, decorators: [{
35468
+ type: Optional
35469
+ }] }] });
35470
+
35471
+ const QUERY_PARAM_HANDLER_PROVIDERS = [
35472
+ // This will ensure that the QueryParamHandlerService is initialized
35473
+ provideAppInitializer(() => {
35474
+ inject(QueryParamHandlerService);
35475
+ }),
35476
+ hookQueryParam(QueryParamBottomDrawerFactory),
35477
+ hookQueryParam(QueryParamModalFactory)
35478
+ ];
35090
35479
 
35091
35480
  class FeatureStatePipe {
35092
35481
  constructor(previewService) {
@@ -35111,6 +35500,8 @@ class PreviewFeatureComponent {
35111
35500
  this.description$ = new BehaviorSubject('');
35112
35501
  this.previewFeatureService = inject(PreviewService);
35113
35502
  this.markdownToHtmlPipe = inject(MarkdownToHtmlPipe);
35503
+ this.router = inject(Router);
35504
+ this.route = inject(ActivatedRoute);
35114
35505
  this.features$ = this.previewFeatureService.getAvailableFeatures$();
35115
35506
  this.shouldClose = new Promise(resolve => {
35116
35507
  this.resolveClose = resolve;
@@ -35144,6 +35535,19 @@ class PreviewFeatureComponent {
35144
35535
  }
35145
35536
  close() {
35146
35537
  this.resolveClose(true);
35538
+ this.router
35539
+ .navigate([], {
35540
+ relativeTo: this.route,
35541
+ queryParams: { showPreviewFeatures: null },
35542
+ queryParamsHandling: 'merge',
35543
+ replaceUrl: true
35544
+ })
35545
+ .then(() => {
35546
+ // Reload if needed
35547
+ if (this.previewFeatureService.reload$.value) {
35548
+ window.location.reload();
35549
+ }
35550
+ });
35147
35551
  }
35148
35552
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35149
35553
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PreviewFeatureComponent, isStandalone: true, selector: "c8y-preview-feature", host: { classAttribute: "d-contents" }, providers: [MarkdownToHtmlPipe], ngImport: i0, template: "<div class=\"card-block separator-bottom bg-component text-center flex-no-shrink p-24\">\n <div class=\"d-flex fit-w a-i-center j-c-center\">\n <i\n class=\"icon-24 m-r-8\"\n [c8yIcon]=\"'science'\"\n ></i>\n <h3\n class=\"m-0\"\n translate\n >\n Preview features\n </h3>\n </div>\n <p class=\"text-16 m-t-8\">\n {{\n 'Select any feature to view additional details and documentation. Toggle features on or off using the switches.'\n | translate\n }}\n </p>\n\n <p>\n {{\n 'These beta capabilities may change or be removed before final release. We value your feedback. The descriptions for the features below are available only in English.'\n | translate\n }}\n </p>\n</div>\n\n<div class=\"card-block p-0\">\n <div class=\"d-flex fit-h\">\n <div class=\"col-md-4 col-lg-3 p-l-0 p-r-0 sticky-top m-t-0 inner-scroll bg-level-1\">\n <div class=\"nav-tabs nav-tabs-vertical nav-tabs-vertical--wide p-t-0\">\n <div\n [class.active]=\"feature === selectedFeature\"\n class=\"d-flex fit-w a-i-center\"\n *ngFor=\"let feature of features$ | async\"\n >\n <button\n class=\"d-flex gap-4 text-truncate flex-grow min-width-0\"\n title=\"{{ feature.label }}\"\n [ngClass]=\"{\n 'bg-component': feature === selectedFeature,\n 'bg-level-1': feature !== selectedFeature\n }\"\n (click)=\"updateSelectedFeature(feature)\"\n >\n <i\n class=\"m-l-0\"\n [c8yIcon]=\"'science'\"\n ></i>\n <span class=\"text-truncate\">\n {{ feature.label }}\n </span>\n </button>\n <div\n class=\"a-s-stretch d-flex a-i-center separator-bottom p-r-16\"\n [ngClass]=\"{\n 'bg-component': feature === selectedFeature,\n 'bg-level-1': feature !== selectedFeature\n }\"\n >\n <label\n class=\"c8y-switch c8y-switch--inline m-l-auto\"\n title=\"{{ 'Enable or disable' | translate }}\"\n >\n <input\n [attr.aria-label]=\"feature.label\"\n type=\"checkbox\"\n [checked]=\"feature.key | featureState | async\"\n (change)=\"$event.stopPropagation(); onToggle(feature, $event)\"\n />\n <span class=\"slider round\"></span>\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-md-8 col-lg-9 p-24 inner-scroll markdown-content\"\n *ngIf=\"selectedFeature\"\n >\n <span class=\"tag tag--primary h4\">\n {{ 'Feature preview' | translate }} \u2014 {{ selectedFeature.label }}\n </span>\n <div *ngIf=\"isComponent(description$.value); else stringDescription\">\n <ng-container *ngComponentOutlet=\"description$.value\"></ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"text-center card-footer p-24 separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n</div>\n\n<ng-template #stringDescription>\n <p [innerHTML]=\"description$.value\"></p>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i1$a.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$a.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: ListGroupModule }, { kind: "pipe", type: FeatureStatePipe, name: "featureState" }] }); }
@@ -35153,66 +35557,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
35153
35557
  args: [{ selector: 'c8y-preview-feature', host: { class: 'd-contents' }, standalone: true, imports: [NgForOf, NgIf, AsyncPipe, CommonModule, ListGroupModule, FeatureStatePipe], providers: [MarkdownToHtmlPipe], template: "<div class=\"card-block separator-bottom bg-component text-center flex-no-shrink p-24\">\n <div class=\"d-flex fit-w a-i-center j-c-center\">\n <i\n class=\"icon-24 m-r-8\"\n [c8yIcon]=\"'science'\"\n ></i>\n <h3\n class=\"m-0\"\n translate\n >\n Preview features\n </h3>\n </div>\n <p class=\"text-16 m-t-8\">\n {{\n 'Select any feature to view additional details and documentation. Toggle features on or off using the switches.'\n | translate\n }}\n </p>\n\n <p>\n {{\n 'These beta capabilities may change or be removed before final release. We value your feedback. The descriptions for the features below are available only in English.'\n | translate\n }}\n </p>\n</div>\n\n<div class=\"card-block p-0\">\n <div class=\"d-flex fit-h\">\n <div class=\"col-md-4 col-lg-3 p-l-0 p-r-0 sticky-top m-t-0 inner-scroll bg-level-1\">\n <div class=\"nav-tabs nav-tabs-vertical nav-tabs-vertical--wide p-t-0\">\n <div\n [class.active]=\"feature === selectedFeature\"\n class=\"d-flex fit-w a-i-center\"\n *ngFor=\"let feature of features$ | async\"\n >\n <button\n class=\"d-flex gap-4 text-truncate flex-grow min-width-0\"\n title=\"{{ feature.label }}\"\n [ngClass]=\"{\n 'bg-component': feature === selectedFeature,\n 'bg-level-1': feature !== selectedFeature\n }\"\n (click)=\"updateSelectedFeature(feature)\"\n >\n <i\n class=\"m-l-0\"\n [c8yIcon]=\"'science'\"\n ></i>\n <span class=\"text-truncate\">\n {{ feature.label }}\n </span>\n </button>\n <div\n class=\"a-s-stretch d-flex a-i-center separator-bottom p-r-16\"\n [ngClass]=\"{\n 'bg-component': feature === selectedFeature,\n 'bg-level-1': feature !== selectedFeature\n }\"\n >\n <label\n class=\"c8y-switch c8y-switch--inline m-l-auto\"\n title=\"{{ 'Enable or disable' | translate }}\"\n >\n <input\n [attr.aria-label]=\"feature.label\"\n type=\"checkbox\"\n [checked]=\"feature.key | featureState | async\"\n (change)=\"$event.stopPropagation(); onToggle(feature, $event)\"\n />\n <span class=\"slider round\"></span>\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-md-8 col-lg-9 p-24 inner-scroll markdown-content\"\n *ngIf=\"selectedFeature\"\n >\n <span class=\"tag tag--primary h4\">\n {{ 'Feature preview' | translate }} \u2014 {{ selectedFeature.label }}\n </span>\n <div *ngIf=\"isComponent(description$.value); else stringDescription\">\n <ng-container *ngComponentOutlet=\"description$.value\"></ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"text-center card-footer p-24 separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n</div>\n\n<ng-template #stringDescription>\n <p [innerHTML]=\"description$.value\"></p>\n</ng-template>\n" }]
35154
35558
  }], ctorParameters: () => [] });
35155
35559
 
35156
- class PreviewFeatureButtonComponent {
35157
- constructor() {
35158
- this.previewService = inject(PreviewService);
35159
- this.bottomDrawerService = inject(BottomDrawerService);
35160
- this.headerService = inject(HeaderService);
35161
- this.destroy$ = new Subject();
35162
- }
35163
- ngOnInit() {
35164
- this.hasUnseenFeatures$ = this.previewService.hasUnseenFeatures$;
35165
- this.open$ = this.headerService.rightDrawerOpen$;
35166
- }
35167
- async openPreviewFeature() {
35168
- this.headerService.closeRightDrawer();
35169
- const bottomDrawer = this.bottomDrawerService.openDrawer(PreviewFeatureComponent, {
35170
- closeOnNavigation: false,
35171
- disableClickOutside: true
35172
- });
35173
- bottomDrawer.onClosed$.pipe(takeUntil$1(this.destroy$)).subscribe(() => {
35174
- if (this.previewService.reload$.value) {
35175
- window.location.reload();
35176
- }
35177
- });
35178
- try {
35179
- const result = await bottomDrawer.instance.shouldClose;
35180
- if (result) {
35181
- bottomDrawer.close();
35182
- }
35183
- }
35184
- catch (e) {
35185
- // intended empty
35186
- }
35187
- }
35188
- ngOnDestroy() {
35189
- this.destroy$.next();
35190
- this.destroy$.complete();
35191
- }
35192
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35193
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PreviewFeatureButtonComponent, isStandalone: true, selector: "c8y-preview-feature-button", ngImport: i0, template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i class=\"dlt-c8y-icon-science\"></i>\n <span\n class=\"text-bold\"\n translate\n >\n Preview features\n </span>\n <span\n class=\"m-l-8 tag tag--primary\"\n *ngIf=\"hasUnseenFeatures$ | async\"\n >\n {{ 'New' | translate }}\n </span>\n</div>\n<ul class=\"list-unstyled\">\n <li class=\"c8y-right-drawer__item\">\n <small translate>\n Enable or disable experimental features. Your feedback helps us improve functionality before\n final release.\n </small>\n </li>\n <li class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Manage preview features' | translate }}\"\n [attr.tabindex]=\"(open$ | async) ? '0' : '-1'\"\n (click)=\"openPreviewFeature()\"\n >\n <i class=\"m-t-0 m-b-9 text-14 dlt-c8y-icon-settings\"></i>\n <span translate>Manage preview features</span>\n </button>\n </li>\n</ul>\n", dependencies: [{ kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
35194
- }
35195
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureButtonComponent, decorators: [{
35196
- type: Component,
35197
- args: [{ selector: 'c8y-preview-feature-button', standalone: true, imports: [C8yTranslateDirective, C8yTranslatePipe, AsyncPipe, NgIf], template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i class=\"dlt-c8y-icon-science\"></i>\n <span\n class=\"text-bold\"\n translate\n >\n Preview features\n </span>\n <span\n class=\"m-l-8 tag tag--primary\"\n *ngIf=\"hasUnseenFeatures$ | async\"\n >\n {{ 'New' | translate }}\n </span>\n</div>\n<ul class=\"list-unstyled\">\n <li class=\"c8y-right-drawer__item\">\n <small translate>\n Enable or disable experimental features. Your feedback helps us improve functionality before\n final release.\n </small>\n </li>\n <li class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Manage preview features' | translate }}\"\n [attr.tabindex]=\"(open$ | async) ? '0' : '-1'\"\n (click)=\"openPreviewFeature()\"\n >\n <i class=\"m-t-0 m-b-9 text-14 dlt-c8y-icon-settings\"></i>\n <span translate>Manage preview features</span>\n </button>\n </li>\n</ul>\n" }]
35198
- }] });
35199
-
35200
- class PreviewFeatureDrawerFactory {
35560
+ class PreviewFeatureQueryParamDrawerFactory {
35201
35561
  constructor(options, previewService, permissions) {
35202
35562
  this.options = options;
35203
35563
  this.previewService = previewService;
35204
35564
  this.permissions = permissions;
35205
- this.drawerItem = {
35206
- component: PreviewFeatureButtonComponent,
35207
- position: 'right',
35208
- priority: 80,
35209
- id: 'previewFeature'
35565
+ this.queryParamConfig = {
35566
+ queryParam: SHOW_PREVIEW_FEATURES,
35567
+ closeOnNavigation: false,
35568
+ disableClickOutside: true,
35569
+ component: PreviewFeatureComponent
35210
35570
  };
35211
35571
  }
35212
35572
  get() {
35213
35573
  return this.shouldShowPreviewFeature$().pipe(distinctUntilChanged(), map(shouldShowPreviewFeature => {
35214
35574
  if (shouldShowPreviewFeature) {
35215
- return this.drawerItem;
35575
+ return this.queryParamConfig;
35216
35576
  }
35217
35577
  return [];
35218
35578
  }));
@@ -35233,30 +35593,18 @@ class PreviewFeatureDrawerFactory {
35233
35593
  return !hidePreviewFeature && hasItems && hasAdminRole;
35234
35594
  }));
35235
35595
  }
35236
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureDrawerFactory, deps: [{ token: OptionsService }, { token: PreviewService }, { token: Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
35237
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureDrawerFactory, providedIn: 'root' }); }
35596
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureQueryParamDrawerFactory, deps: [{ token: OptionsService }, { token: PreviewService }, { token: Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
35597
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureQueryParamDrawerFactory, providedIn: 'root' }); }
35238
35598
  }
35239
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureDrawerFactory, decorators: [{
35599
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureQueryParamDrawerFactory, decorators: [{
35240
35600
  type: Injectable,
35241
35601
  args: [{ providedIn: 'root' }]
35242
35602
  }], ctorParameters: () => [{ type: OptionsService }, { type: PreviewService }, { type: Permissions }] });
35243
35603
 
35244
- class PreviewFeatureShowNotification {
35245
- constructor(previewService) {
35246
- this.previewService = previewService;
35247
- this.shouldShowNotification$ = this.previewService.hasUnseenFeatures$;
35248
- }
35249
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureShowNotification, deps: [{ token: PreviewService }], target: i0.ɵɵFactoryTarget.Injectable }); }
35250
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureShowNotification, providedIn: 'root' }); }
35251
- }
35252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PreviewFeatureShowNotification, decorators: [{
35253
- type: Injectable,
35254
- args: [{ providedIn: 'root' }]
35255
- }], ctorParameters: () => [{ type: PreviewService }] });
35256
-
35257
35604
  const PREVIEW_FEATURE_PROVIDERS = [
35258
35605
  hookDrawer(PreviewFeatureDrawerFactory),
35259
- hookService('notificationService', PreviewFeatureShowNotification)
35606
+ hookService('notificationService', PreviewFeatureShowNotification),
35607
+ hookQueryParamBottomDrawer(PreviewFeatureQueryParamDrawerFactory)
35260
35608
  ];
35261
35609
 
35262
35610
  class ChangeIconComponent {
@@ -35335,7 +35683,8 @@ class CoreModule {
35335
35683
  ...UiSettingsModule.providers(),
35336
35684
  ...UserModule.providers(),
35337
35685
  ...VersionModule.providers(),
35338
- ...PREVIEW_FEATURE_PROVIDERS
35686
+ ...PREVIEW_FEATURE_PROVIDERS,
35687
+ ...QUERY_PARAM_HANDLER_PROVIDERS
35339
35688
  ]
35340
35689
  };
35341
35690
  }
@@ -36259,27 +36608,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
36259
36608
  class RealtimeMessage {
36260
36609
  }
36261
36610
 
36262
- class PluginLoadedPipe {
36263
- constructor(pluginsResolve) {
36264
- this.pluginsResolve = pluginsResolve;
36265
- }
36266
- transform(pluginName) {
36267
- if (!pluginName) {
36268
- return of(false);
36269
- }
36270
- return this.pluginsResolve.loadedPluginNames$.pipe(map$2(pluginNames => pluginNames.includes(pluginName)), distinctUntilChanged$1());
36271
- }
36272
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PluginLoadedPipe, deps: [{ token: PluginsResolveService }], target: i0.ɵɵFactoryTarget.Pipe }); }
36273
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: PluginLoadedPipe, isStandalone: true, name: "c8yPluginLoaded" }); }
36274
- }
36275
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PluginLoadedPipe, decorators: [{
36276
- type: Pipe,
36277
- args: [{
36278
- name: 'c8yPluginLoaded',
36279
- standalone: true
36280
- }]
36281
- }], ctorParameters: () => [{ type: PluginsResolveService }] });
36282
-
36283
36611
  /**
36284
36612
  * AssetTypesService is being used to manage a cache of all existing asset types.
36285
36613
  * This service is injected in the AssetOverviewNavigationFactory class, which will trigger
@@ -36497,5 +36825,5 @@ function colorValidator(allowedModes) {
36497
36825
  * Generated bundle index. Do not edit.
36498
36826
  */
36499
36827
 
36500
- 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, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, 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, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, 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, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, 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_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, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, 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, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, 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, 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, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_BETA_PREVIEW, 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, StandalonePluginInjector, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateParserCustom, TranslateService, TranslationLoaderService, 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, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_TYPE_VALUES, WebSDKVersionFactory, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, initializeServices, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, ratiosByColumnTypes, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
36828
+ 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, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, 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, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, 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, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, 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, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, 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, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, 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, 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, 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, StandalonePluginInjector, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateParserCustom, TranslateService, TranslationLoaderService, 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, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_TYPE_VALUES, WebSDKVersionFactory, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, 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, initializeServices, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, ratiosByColumnTypes, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
36501
36829
  //# sourceMappingURL=c8y-ngx-components.mjs.map