@c8y/ngx-components 1024.18.1 → 1024.18.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/fesm2022/c8y-ngx-components-actility-device-registration.mjs +1 -1
  2. package/fesm2022/c8y-ngx-components-actility-device-registration.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-asset-properties.mjs +67 -20
  4. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-assets-navigator.mjs +75 -13
  6. package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +2 -4
  8. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +6 -8
  10. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +98 -19
  12. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +4 -4
  14. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +7 -7
  16. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +5 -3
  18. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-echart.mjs +52 -7
  21. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
  23. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-file-preview.mjs +2 -2
  25. package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-icon-selector.mjs +6 -6
  27. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs +1 -1
  29. package/fesm2022/c8y-ngx-components-loriot-device-registration.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-operation-picker.mjs +2 -2
  31. package/fesm2022/c8y-ngx-components-operation-picker.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-register-device.mjs +4 -4
  33. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +2 -3
  35. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +2 -2
  37. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
  38. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +2 -2
  39. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  40. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +2 -4
  41. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -1
  42. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +2 -3
  43. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs +1 -1
  45. package/fesm2022/c8y-ngx-components-sigfox-device-registration.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +2 -2
  47. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +3 -4
  49. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs +10 -1
  51. package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs.map +1 -1
  52. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +4 -4
  53. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  54. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +18 -3
  55. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +1 -1
  57. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components.mjs +59 -19
  59. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  60. package/locales/de.po +3 -2
  61. package/locales/es.po +3 -3
  62. package/locales/fr.po +3 -3
  63. package/locales/ja_JP.po +2 -2
  64. package/locales/ko.po +3 -3
  65. package/locales/locales.pot +1 -1
  66. package/locales/nl.po +3 -3
  67. package/locales/pl.po +2 -3
  68. package/locales/pt_BR.po +2 -3
  69. package/locales/zh_CN.po +2 -2
  70. package/locales/zh_TW.po +3 -3
  71. package/package.json +1 -1
  72. package/types/c8y-ngx-components-asset-properties.d.ts +9 -1
  73. package/types/c8y-ngx-components-asset-properties.d.ts.map +1 -1
  74. package/types/c8y-ngx-components-assets-navigator.d.ts +30 -3
  75. package/types/c8y-ngx-components-assets-navigator.d.ts.map +1 -1
  76. package/types/c8y-ngx-components-branding-shared-lazy-add-branding-modal.d.ts.map +1 -1
  77. package/types/c8y-ngx-components-context-dashboard.d.ts +44 -1
  78. package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
  79. package/types/c8y-ngx-components-echart-models.d.ts +9 -0
  80. package/types/c8y-ngx-components-echart-models.d.ts.map +1 -1
  81. package/types/c8y-ngx-components-echart.d.ts +32 -5
  82. package/types/c8y-ngx-components-echart.d.ts.map +1 -1
  83. package/types/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.d.ts.map +1 -1
  84. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts +6 -0
  85. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -1
  86. package/types/c8y-ngx-components.d.ts +50 -2
  87. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -16901,6 +16901,12 @@ class ModalComponent {
16901
16901
  * CSS classes for modal header.
16902
16902
  */
16903
16903
  this.headerClasses = '';
16904
+ /**
16905
+ * Lets the modal content reach the dialog edges, for lists, tables, steppers and previews.
16906
+ * By default the body is inset by the same amount as the header and the footer, so that its
16907
+ * content lines up with the title.
16908
+ */
16909
+ this.flushBody = false;
16904
16910
  this._labels = { ok: gettext$1('OK'), cancel: gettext$1('Cancel') };
16905
16911
  }
16906
16912
  /**
@@ -16947,11 +16953,11 @@ class ModalComponent {
16947
16953
  }
16948
16954
  }
16949
16955
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ModalComponent, deps: [{ token: i1$6.BsModalRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
16950
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: ModalComponent, isStandalone: true, selector: "c8y-modal", inputs: { disabled: "disabled", close: "close", dismiss: "dismiss", title: "title", body: "body", customFooter: "customFooter", headerClasses: "headerClasses", labels: "labels" }, outputs: { onDismiss: "onDismiss", onClose: "onClose" }, host: { listeners: { "document:keydown.enter": "onEnterKeyDown($event)" } }, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header {{ headerClasses }}\"\n [ngClass]=\"{ separator: title }\"\n >\n <ng-content select=\"[c8y-modal-title]\"></ng-content>\n\n @if (title) {\n <div\n class=\"modal-title\"\n id=\"modal-title\"\n >\n {{ title | translate }}\n </div>\n }\n </div>\n\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div [ngClass]=\"{ 'modal-body': !customFooter, 'd-contents': customFooter }\">\n @if (title) {\n <p class=\"text-center text-break-word\">\n {{ body }}\n </p>\n }\n\n <ng-content></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[c8y-modal-footer-custom]\"></ng-content>\n\n @if (!customFooter) {\n <div class=\"modal-footer\">\n <ng-content select=\"[c8y-modal-footer]\"></ng-content>\n\n @if (labels.cancel) {\n <button\n class=\"btn btn-default\"\n title=\"{{ labels.cancel | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--dismiss\"\n (click)=\"_dismiss()\"\n >\n {{ labels.cancel | translate }}\n </button>\n }\n\n @if (labels.ok) {\n <button\n class=\"btn btn-primary\"\n title=\"{{ labels.ok | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--confirm\"\n (click)=\"_close()\"\n [disabled]=\"disabled\"\n >\n {{ labels.ok | translate }}\n </button>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
16956
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: ModalComponent, isStandalone: true, selector: "c8y-modal", inputs: { disabled: "disabled", close: "close", dismiss: "dismiss", title: "title", body: "body", customFooter: "customFooter", headerClasses: "headerClasses", flushBody: "flushBody", labels: "labels" }, outputs: { onDismiss: "onDismiss", onClose: "onClose" }, host: { listeners: { "document:keydown.enter": "onEnterKeyDown($event)" } }, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header {{ headerClasses }}\"\n [ngClass]=\"{ separator: title }\"\n >\n <ng-content select=\"[c8y-modal-title]\"></ng-content>\n\n @if (title) {\n <div\n class=\"modal-title\"\n id=\"modal-title\"\n >\n {{ title | translate }}\n </div>\n }\n </div>\n\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div\n [ngClass]=\"{\n 'modal-body': !customFooter,\n 'modal-body--flush': !customFooter && flushBody,\n 'd-contents': customFooter\n }\"\n >\n @if (title) {\n <p class=\"text-center text-break-word\">\n {{ body }}\n </p>\n }\n\n <ng-content></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[c8y-modal-footer-custom]\"></ng-content>\n\n @if (!customFooter) {\n <div class=\"modal-footer\">\n <ng-content select=\"[c8y-modal-footer]\"></ng-content>\n\n @if (labels.cancel) {\n <button\n class=\"btn btn-default\"\n title=\"{{ labels.cancel | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--dismiss\"\n (click)=\"_dismiss()\"\n >\n {{ labels.cancel | translate }}\n </button>\n }\n\n @if (labels.ok) {\n <button\n class=\"btn btn-primary\"\n title=\"{{ labels.ok | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--confirm\"\n (click)=\"_close()\"\n [disabled]=\"disabled\"\n >\n {{ labels.ok | translate }}\n </button>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
16951
16957
  }
16952
16958
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: ModalComponent, decorators: [{
16953
16959
  type: Component,
16954
- args: [{ selector: 'c8y-modal', standalone: true, imports: [NgClass, NgIf, C8yTranslatePipe], changeDetection: ChangeDetectionStrategy.Eager, template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header {{ headerClasses }}\"\n [ngClass]=\"{ separator: title }\"\n >\n <ng-content select=\"[c8y-modal-title]\"></ng-content>\n\n @if (title) {\n <div\n class=\"modal-title\"\n id=\"modal-title\"\n >\n {{ title | translate }}\n </div>\n }\n </div>\n\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div [ngClass]=\"{ 'modal-body': !customFooter, 'd-contents': customFooter }\">\n @if (title) {\n <p class=\"text-center text-break-word\">\n {{ body }}\n </p>\n }\n\n <ng-content></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[c8y-modal-footer-custom]\"></ng-content>\n\n @if (!customFooter) {\n <div class=\"modal-footer\">\n <ng-content select=\"[c8y-modal-footer]\"></ng-content>\n\n @if (labels.cancel) {\n <button\n class=\"btn btn-default\"\n title=\"{{ labels.cancel | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--dismiss\"\n (click)=\"_dismiss()\"\n >\n {{ labels.cancel | translate }}\n </button>\n }\n\n @if (labels.ok) {\n <button\n class=\"btn btn-primary\"\n title=\"{{ labels.ok | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--confirm\"\n (click)=\"_close()\"\n [disabled]=\"disabled\"\n >\n {{ labels.ok | translate }}\n </button>\n }\n </div>\n }\n</div>\n" }]
16960
+ args: [{ selector: 'c8y-modal', standalone: true, imports: [NgClass, C8yTranslatePipe], changeDetection: ChangeDetectionStrategy.Eager, template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header {{ headerClasses }}\"\n [ngClass]=\"{ separator: title }\"\n >\n <ng-content select=\"[c8y-modal-title]\"></ng-content>\n\n @if (title) {\n <div\n class=\"modal-title\"\n id=\"modal-title\"\n >\n {{ title | translate }}\n </div>\n }\n </div>\n\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div\n [ngClass]=\"{\n 'modal-body': !customFooter,\n 'modal-body--flush': !customFooter && flushBody,\n 'd-contents': customFooter\n }\"\n >\n @if (title) {\n <p class=\"text-center text-break-word\">\n {{ body }}\n </p>\n }\n\n <ng-content></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[c8y-modal-footer-custom]\"></ng-content>\n\n @if (!customFooter) {\n <div class=\"modal-footer\">\n <ng-content select=\"[c8y-modal-footer]\"></ng-content>\n\n @if (labels.cancel) {\n <button\n class=\"btn btn-default\"\n title=\"{{ labels.cancel | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--dismiss\"\n (click)=\"_dismiss()\"\n >\n {{ labels.cancel | translate }}\n </button>\n }\n\n @if (labels.ok) {\n <button\n class=\"btn btn-primary\"\n title=\"{{ labels.ok | translate }}\"\n type=\"button\"\n data-cy=\"c8y-modal--confirm\"\n (click)=\"_close()\"\n [disabled]=\"disabled\"\n >\n {{ labels.ok | translate }}\n </button>\n }\n </div>\n }\n</div>\n" }]
16955
16961
  }], ctorParameters: () => [{ type: i1$6.BsModalRef, decorators: [{
16956
16962
  type: Optional
16957
16963
  }] }], propDecorators: { onDismiss: [{
@@ -16972,6 +16978,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
16972
16978
  type: Input
16973
16979
  }], headerClasses: [{
16974
16980
  type: Input
16981
+ }], flushBody: [{
16982
+ type: Input
16975
16983
  }], labels: [{
16976
16984
  type: Input
16977
16985
  }], onEnterKeyDown: [{
@@ -21739,7 +21747,7 @@ class PasswordConfirmModalComponent {
21739
21747
  this.modal._dismiss();
21740
21748
  }
21741
21749
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: PasswordConfirmModalComponent, deps: [{ token: i1.UserService }, { token: AppStateService }, { token: i1.FetchClient }, { token: AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
21742
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: PasswordConfirmModalComponent, isStandalone: true, selector: "c8y-password-confirm-modal", outputs: { passwordConfirmedEmitter: "passwordConfirmedEmitter" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], ngImport: i0, template: "<c8y-modal [customFooter]=\"true\" [title]=\"'Confirm your current password' | translate\" #modal>\r\n <form #confirmForm=\"ngForm\" (ngSubmit)=\"confirmForm.form.valid && passwordConfirm()\">\r\n <div class=\"d-block p-24 p-b-0\">\r\n <c8y-form-group [hasWarning]=\"true\">\r\n <label translate for=\"currentPassword\">Enter your password</label>\r\n <input\r\n id=\"currentPassword\"\r\n [(ngModel)]=\"password\"\r\n type=\"password\"\r\n name=\"password\"\r\n class=\"form-control\"\r\n placeholder=\"{{ 'Enter your password' | translate }}\"\r\n required\r\n />\r\n <c8y-messages>\r\n <c8y-message translate>\r\n Enter the password of the user that you are currently logged in with.\r\n </c8y-message>\r\n </c8y-messages>\r\n </c8y-form-group>\r\n </div>\r\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\r\n <button\r\n title=\"{{ 'Cancel' | translate }}\"\r\n class=\"btn btn-default\"\r\n type=\"button\"\r\n (click)=\"cancel()\"\r\n >\r\n {{ 'Cancel' | translate }}\r\n </button>\r\n <button\r\n title=\"{{ 'Confirm' | translate }}\"\r\n class=\"btn btn-primary\"\r\n type=\"submit\"\r\n [disabled]=\"!confirmForm.form.valid || loading\"\r\n >\r\n {{ 'Confirm' | translate }}\r\n </button>\r\n </div>\r\n </form>\r\n</c8y-modal>\r\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
21750
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: PasswordConfirmModalComponent, isStandalone: true, selector: "c8y-password-confirm-modal", outputs: { passwordConfirmedEmitter: "passwordConfirmedEmitter" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], ngImport: i0, template: "<c8y-modal [customFooter]=\"true\" [title]=\"'Confirm your current password' | translate\" #modal>\r\n <form #confirmForm=\"ngForm\" (ngSubmit)=\"confirmForm.form.valid && passwordConfirm()\">\r\n <div class=\"d-block p-24 p-b-0\">\r\n <c8y-form-group [hasWarning]=\"true\">\r\n <label translate for=\"currentPassword\">Enter your password</label>\r\n <input\r\n id=\"currentPassword\"\r\n [(ngModel)]=\"password\"\r\n type=\"password\"\r\n name=\"password\"\r\n class=\"form-control\"\r\n placeholder=\"{{ 'Enter your password' | translate }}\"\r\n required\r\n />\r\n <c8y-messages>\r\n <c8y-message translate>\r\n Enter the password of the user that you are currently logged in with.\r\n </c8y-message>\r\n </c8y-messages>\r\n </c8y-form-group>\r\n </div>\r\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\r\n <button\r\n title=\"{{ 'Cancel' | translate }}\"\r\n class=\"btn btn-default\"\r\n type=\"button\"\r\n (click)=\"cancel()\"\r\n >\r\n {{ 'Cancel' | translate }}\r\n </button>\r\n <button\r\n title=\"{{ 'Confirm' | translate }}\"\r\n class=\"btn btn-primary\"\r\n type=\"submit\"\r\n [disabled]=\"!confirmForm.form.valid || loading\"\r\n >\r\n {{ 'Confirm' | translate }}\r\n </button>\r\n </div>\r\n </form>\r\n</c8y-modal>\r\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "flushBody", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
21743
21751
  }
21744
21752
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: PasswordConfirmModalComponent, decorators: [{
21745
21753
  type: Component,
@@ -21774,7 +21782,7 @@ class CurrentPasswordModalComponent {
21774
21782
  this.modal.hide();
21775
21783
  }
21776
21784
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CurrentPasswordModalComponent, deps: [{ token: i1$6.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
21777
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: CurrentPasswordModalComponent, isStandalone: true, selector: "c8y-current-password-modal", outputs: { currentPasswordEmitter: "currentPasswordEmitter" }, ngImport: i0, template: "<c8y-modal [customFooter]=\"true\" [title]=\"'Confirm your current password' | translate\" #modal>\n <form #confirmForm=\"ngForm\" (ngSubmit)=\"confirmForm.form.valid && passwordConfirm()\">\n <div class=\"d-block p-24\">\n <c8y-form-group [hasWarning]=\"true\">\n <label translate for=\"currentPassword\">Enter your password</label>\n <input\n id=\"currentPassword\"\n [(ngModel)]=\"password\"\n type=\"password\"\n name=\"password\"\n class=\"form-control\"\n required\n />\n <c8y-messages>\n <c8y-message translate>\n The password of the user that you are currently logged in with.\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Confirm' | translate }}\"\n class=\"btn btn-primary\"\n [attr.data-cy]=\"'confirm-current-password-confirm-button'\"\n type=\"submit\"\n [disabled]=\"!confirmForm.form.valid\"\n >\n {{ 'Confirm' | translate }}\n </button>\n </div>\n </form>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
21785
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: CurrentPasswordModalComponent, isStandalone: true, selector: "c8y-current-password-modal", outputs: { currentPasswordEmitter: "currentPasswordEmitter" }, ngImport: i0, template: "<c8y-modal [customFooter]=\"true\" [title]=\"'Confirm your current password' | translate\" #modal>\n <form #confirmForm=\"ngForm\" (ngSubmit)=\"confirmForm.form.valid && passwordConfirm()\">\n <div class=\"d-block p-24\">\n <c8y-form-group [hasWarning]=\"true\">\n <label translate for=\"currentPassword\">Enter your password</label>\n <input\n id=\"currentPassword\"\n [(ngModel)]=\"password\"\n type=\"password\"\n name=\"password\"\n class=\"form-control\"\n required\n />\n <c8y-messages>\n <c8y-message translate>\n The password of the user that you are currently logged in with.\n </c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Confirm' | translate }}\"\n class=\"btn btn-primary\"\n [attr.data-cy]=\"'confirm-current-password-confirm-button'\"\n type=\"submit\"\n [disabled]=\"!confirmForm.form.valid\"\n >\n {{ 'Confirm' | translate }}\n </button>\n </div>\n </form>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "flushBody", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "directive", type: MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
21778
21786
  }
21779
21787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: CurrentPasswordModalComponent, decorators: [{
21780
21788
  type: Component,
@@ -22013,7 +22021,7 @@ class UserTotpSetupComponent {
22013
22021
  this.modal.hide();
22014
22022
  }
22015
22023
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UserTotpSetupComponent, deps: [{ token: i1.UserService }, { token: ModalService }, { token: i1$6.BsModalRef }, { token: SimplifiedAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
22016
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: UserTotpSetupComponent, isStandalone: true, selector: "c8y-user-totp-setup", ngImport: i0, template: "<c8y-modal\n [title]=\"'Set up two-factor authentication' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span class=\"dlt-c8y-icon-phonelink-lock\"></span>\n </ng-container>\n\n <c8y-totp-setup></c8y-totp-setup>\n <c8y-totp-challenge [isModal]=\"true\" (onSuccess)=\"totpSetupVerified()\" (totpUnconfirmedEmitter)=\"close()\"></c8y-totp-challenge>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: TotpSetupComponent, selector: "c8y-totp-setup" }, { kind: "component", type: TotpChallengeComponent, selector: "c8y-totp-challenge", inputs: ["verify", "loading", "hasError", "isModal"], outputs: ["onSuccess", "totpUnconfirmedEmitter"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
22024
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: UserTotpSetupComponent, isStandalone: true, selector: "c8y-user-totp-setup", ngImport: i0, template: "<c8y-modal\n [title]=\"'Set up two-factor authentication' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span class=\"dlt-c8y-icon-phonelink-lock\"></span>\n </ng-container>\n\n <c8y-totp-setup></c8y-totp-setup>\n <c8y-totp-challenge [isModal]=\"true\" (onSuccess)=\"totpSetupVerified()\" (totpUnconfirmedEmitter)=\"close()\"></c8y-totp-challenge>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "flushBody", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: TotpSetupComponent, selector: "c8y-totp-setup" }, { kind: "component", type: TotpChallengeComponent, selector: "c8y-totp-challenge", inputs: ["verify", "loading", "hasError", "isModal"], outputs: ["onSuccess", "totpUnconfirmedEmitter"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
22017
22025
  }
22018
22026
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UserTotpSetupComponent, decorators: [{
22019
22027
  type: Component,
@@ -22863,7 +22871,7 @@ class UserEditModalComponent {
22863
22871
  this.auth.updateCredentials(newCredentials);
22864
22872
  }
22865
22873
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$6.BsModalRef }, { token: i1.UserService }, { token: AppStateService }, { token: i1.BasicAuth }, { token: i1.FetchClient }, { token: AlertService }, { token: UserPreferencesService }, { token: ModalService }, { token: GainsightService }, { token: CookieBannerService }, { token: PasswordService }, { token: UserEngagementsService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
22866
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: UserEditModalComponent, isStandalone: true, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n [focusOnNewPassword]=\"passwordChange\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n ></c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: UserEditComponent, selector: "c8y-user-edit", inputs: ["loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled", "focusOnNewPassword"], outputs: ["onUser", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
22874
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.19", type: UserEditModalComponent, isStandalone: true, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n [focusOnNewPassword]=\"passwordChange\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n ></c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "flushBody", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: UserEditComponent, selector: "c8y-user-edit", inputs: ["loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled", "focusOnNewPassword"], outputs: ["onUser", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
22867
22875
  }
22868
22876
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: UserEditModalComponent, decorators: [{
22869
22877
  type: Component,
@@ -33478,6 +33486,7 @@ class HelpComponent {
33478
33486
  * @ignore
33479
33487
  */
33480
33488
  this.isInit = false;
33489
+ this.isContextHelpAvailable$ = this.helpService.contextHelp.pipe(map(contextHelp => typeof contextHelp === 'string' ? !!contextHelp : contextHelp && docsService.isDocsEnabled()));
33481
33490
  }
33482
33491
  /**
33483
33492
  * The component is shown by default and therefore breaks e2e test. This is
@@ -33491,18 +33500,12 @@ class HelpComponent {
33491
33500
  * Builds the URL based on the src. The Base URL can be set in the application options docBaseUrl.
33492
33501
  * @param src The source of the help on the guide.
33493
33502
  * @param index This flag is used to call the index.json content of a guide. For example, "https://cumulocity.com/docs/cockpit/data-explorer/index.json".
33503
+ * @returns The URL of the documentation page, or `null` if documentation links are switched off.
33494
33504
  */
33495
33505
  getUrl(src = '', index = false) {
33496
- let docsUrl;
33497
- try {
33498
- docsUrl =
33499
- typeof this.helpService.contextHelp.value === 'string'
33500
- ? new URL(this.docsService.getUrlWithDocsVersion(this.helpService.contextHelp.value))
33501
- : new URL(this.docsService.getBaseUrl());
33502
- }
33503
- catch (error) {
33504
- docsUrl = new URL(this.docsService.getBaseUrl());
33505
- console.warn(error);
33506
+ const docsUrl = this.resolveBaseUrl();
33507
+ if (!docsUrl) {
33508
+ return null;
33506
33509
  }
33507
33510
  const [url, hashFragment] = src.split('#');
33508
33511
  this.sectionHeading = hashFragment;
@@ -33547,6 +33550,43 @@ class HelpComponent {
33547
33550
  this.icon = this.resolveIcon();
33548
33551
  }
33549
33552
  }
33553
+ /**
33554
+ * Resolves the base URL the help content is loaded from: either the one provided by the
33555
+ * `contextHelp` option, or the documentation base URL. Returns `null` if neither of them
33556
+ * yields a usable URL.
33557
+ */
33558
+ resolveBaseUrl() {
33559
+ const contextHelp = this.helpService.contextHelp.value;
33560
+ if (typeof contextHelp === 'string' && contextHelp) {
33561
+ const contextHelpUrl = this.toAbsoluteUrl(this.docsService.getUrlWithDocsVersion(contextHelp));
33562
+ if (contextHelpUrl) {
33563
+ return contextHelpUrl;
33564
+ }
33565
+ console.warn(`Invalid contextHelp URL: "${contextHelp}", falling back to docsBaseUrl.`);
33566
+ }
33567
+ if (!this.docsService.isDocsEnabled()) {
33568
+ return null;
33569
+ }
33570
+ return this.toAbsoluteUrl(this.docsService.getBaseUrl());
33571
+ }
33572
+ /**
33573
+ * Turns a documentation base URL into an absolute one. A base URL relative to the host the
33574
+ * application is served from (`docsBaseUrl: '/'`, which `DocsService.getBaseUrl` trims to an
33575
+ * empty string) is resolved against that host. Returns `null` for anything that is not a valid
33576
+ * URL.
33577
+ */
33578
+ toAbsoluteUrl(baseUrl) {
33579
+ if (isNil(baseUrl)) {
33580
+ return null;
33581
+ }
33582
+ const isRelativeToHost = baseUrl === '' || baseUrl.startsWith('/');
33583
+ try {
33584
+ return isRelativeToHost ? new URL(baseUrl, window.location.origin) : new URL(baseUrl);
33585
+ }
33586
+ catch {
33587
+ return null;
33588
+ }
33589
+ }
33550
33590
  requestContent() {
33551
33591
  const req = new XMLHttpRequest();
33552
33592
  req.onreadystatechange = () => this.render(req);
@@ -33566,7 +33606,7 @@ class HelpComponent {
33566
33606
  const icon = Array.from(document.querySelector('nav .active i').classList).find(classes => classes.startsWith('c8y-icon-') || classes.startsWith('dlt-c8y-icon-'));
33567
33607
  return icon.replace('dlt-c8y-icon-', '').replace('c8y-icon-', 'c8y-');
33568
33608
  }
33569
- catch (ex) {
33609
+ catch {
33570
33610
  return 'life-saver';
33571
33611
  }
33572
33612
  }
@@ -33587,7 +33627,7 @@ class HelpComponent {
33587
33627
  }
33588
33628
  }
33589
33629
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: HelpComponent, deps: [{ token: DocsService }, { token: HelpService }], target: i0.ɵɵFactoryTarget.Component }); }
33590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: HelpComponent, isStandalone: true, selector: "c8y-help", inputs: { src: "src", isCollapsed: "isCollapsed", priority: "priority", icon: "icon" }, ngImport: i0, template: "@if (!!(helpService.contextHelp | async)) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"pull-right m-l-md-8\"\n [priority]=\"priority\"\n >\n <button\n class=\"btn-help hidden-xs\"\n [attr.aria-label]=\"'About this page' | translate\"\n tooltip=\"{{ 'About this page' | translate }}\"\n placement=\"left\"\n container=\"body\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"help--help-btn\"\n [delay]=\"750\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n ></button>\n <button\n class=\"btn btn-link visible-xs\"\n title=\"{{ 'About this page' | translate }}\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"help-outline\"\n ></i>\n {{ 'About this page' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<div\n class=\"c8y-help-drawer\"\n id=\"collapseHelp\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n (collapsed)=\"onCollapsed()\"\n>\n <div\n [ngClass]=\"{ 'c8y-help-drawer-block': isInit }\"\n #docOutlet\n data-cy=\"c8y-help--c8y-help-drawer-block\"\n >\n @if (isLoading) {\n <c8y-loading></c8y-loading>\n } @else {\n <div class=\"d-flex\">\n <i\n class=\"c8y-icon-duocolor icon-48\"\n [c8yIcon]=\"!hasError ? icon : 'unlink'\"\n [ngClass]=\"{ 'text-warning': hasError, 'text-muted': !hasError }\"\n ></i>\n @if (!hasError) {\n <div class=\"p-l-16 flex-grow\">\n @if (\n !helpService.isSupportedLanguage() &&\n !showLangWarning &&\n !helpService.isWarningAlertViewed\n ) {\n <div class=\"alert alert-info m-b-16\">\n <button\n class=\"close\"\n [attr.aria-label]=\"'Close' | translate\"\n type=\"button\"\n (click)=\"\n showLangWarning = !showLangWarning;\n helpService.isWarningAlertViewed = !helpService.isWarningAlertViewed\n \"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <p>\n {{ 'Help content is only available in English.' | translate }}\n </p>\n </div>\n }\n <h4 class=\"text-bold text-primary p-t-16 m-b-16\">\n {{ title }}\n </h4>\n <div\n class=\"help-content\"\n id=\"helpContent\"\n [innerHTML]=\"sectionContent\"\n data-cy=\"help--c8y-help-content\"\n ></div>\n </div>\n }\n\n @if (hasError) {\n <div class=\"p-l-16 p-t-16 flex-grow\">\n <h4\n class=\"text-bold m-b-16\"\n translate\n >\n Content couldn't be loaded.\n </h4>\n <div class=\"help-content\">\n <p translate>Check internet connection or reload page.</p>\n </div>\n </div>\n }\n </div>\n }\n </div>\n @if (!isLoading && !hasError) {\n <div\n class=\"c8y-help-drawer-footer animated fadeIn\"\n style=\"animation-delay: 0.35s\"\n data-cy=\"c8y-help--c8y-help-drawer-footer\"\n >\n <button\n class=\"btn btn-default\"\n [title]=\"'Close help' | translate\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"c8y-help--close-btn\"\n (click)=\"toggle()\"\n translate\n >\n Close\n </button>\n <a\n class=\"btn btn-primary\"\n href=\"{{ hasError ? getUrl() : getUrl(src) }}\"\n target=\"_blank\"\n data-cy=\"c8y-help--user-guide\"\n rel=\"noopener noreferrer\"\n >\n @if (!hasError) {\n <span translate>\n Open the\n <span>user documentation</span>\n </span>\n } @else {\n <span translate>\n Check the\n <span>user documentation</span>\n </span>\n }\n </a>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i2$3.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
33630
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: HelpComponent, isStandalone: true, selector: "c8y-help", inputs: { src: "src", isCollapsed: "isCollapsed", priority: "priority", icon: "icon" }, ngImport: i0, template: "@if (isContextHelpAvailable$ | async) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"pull-right m-l-md-8\"\n [priority]=\"priority\"\n >\n <button\n class=\"btn-help hidden-xs\"\n [attr.aria-label]=\"'About this page' | translate\"\n tooltip=\"{{ 'About this page' | translate }}\"\n placement=\"left\"\n container=\"body\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"help--help-btn\"\n [delay]=\"750\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n ></button>\n <button\n class=\"btn btn-link visible-xs\"\n title=\"{{ 'About this page' | translate }}\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"help-outline\"\n ></i>\n {{ 'About this page' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<div\n class=\"c8y-help-drawer\"\n id=\"collapseHelp\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n (collapsed)=\"onCollapsed()\"\n>\n <div\n [ngClass]=\"{ 'c8y-help-drawer-block': isInit }\"\n #docOutlet\n data-cy=\"c8y-help--c8y-help-drawer-block\"\n >\n @if (isLoading) {\n <c8y-loading></c8y-loading>\n } @else {\n <div class=\"d-flex\">\n <i\n class=\"c8y-icon-duocolor icon-48\"\n [c8yIcon]=\"!hasError ? icon : 'unlink'\"\n [ngClass]=\"{ 'text-warning': hasError, 'text-muted': !hasError }\"\n ></i>\n @if (!hasError) {\n <div class=\"p-l-16 flex-grow\">\n @if (\n !helpService.isSupportedLanguage() &&\n !showLangWarning &&\n !helpService.isWarningAlertViewed\n ) {\n <div class=\"alert alert-info m-b-16\">\n <button\n class=\"close\"\n [attr.aria-label]=\"'Close' | translate\"\n type=\"button\"\n (click)=\"\n showLangWarning = !showLangWarning;\n helpService.isWarningAlertViewed = !helpService.isWarningAlertViewed\n \"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <p>\n {{ 'Help content is only available in English.' | translate }}\n </p>\n </div>\n }\n <h4 class=\"text-bold text-primary p-t-16 m-b-16\">\n {{ title }}\n </h4>\n <div\n class=\"help-content\"\n id=\"helpContent\"\n [innerHTML]=\"sectionContent\"\n data-cy=\"help--c8y-help-content\"\n ></div>\n </div>\n }\n\n @if (hasError) {\n <div class=\"p-l-16 p-t-16 flex-grow\">\n <h4\n class=\"text-bold m-b-16\"\n translate\n >\n Content couldn't be loaded.\n </h4>\n <div class=\"help-content\">\n <p translate>Check internet connection or reload page.</p>\n </div>\n </div>\n }\n </div>\n }\n </div>\n @if (!isLoading && !hasError) {\n <div\n class=\"c8y-help-drawer-footer animated fadeIn\"\n style=\"animation-delay: 0.35s\"\n data-cy=\"c8y-help--c8y-help-drawer-footer\"\n >\n <button\n class=\"btn btn-default\"\n [title]=\"'Close help' | translate\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"c8y-help--close-btn\"\n (click)=\"toggle()\"\n translate\n >\n Close\n </button>\n <a\n class=\"btn btn-primary\"\n href=\"{{ hasError ? getUrl() : getUrl(src) }}\"\n target=\"_blank\"\n data-cy=\"c8y-help--user-guide\"\n rel=\"noopener noreferrer\"\n >\n @if (!hasError) {\n <span translate>\n Open the\n <span>user documentation</span>\n </span>\n } @else {\n <span translate>\n Check the\n <span>user documentation</span>\n </span>\n }\n </a>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i2$3.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
33591
33631
  }
33592
33632
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: HelpComponent, decorators: [{
33593
33633
  type: Component,
@@ -33602,7 +33642,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
33602
33642
  C8yTranslateDirective,
33603
33643
  C8yTranslatePipe,
33604
33644
  AsyncPipe
33605
- ], changeDetection: ChangeDetectionStrategy.Eager, template: "@if (!!(helpService.contextHelp | async)) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"pull-right m-l-md-8\"\n [priority]=\"priority\"\n >\n <button\n class=\"btn-help hidden-xs\"\n [attr.aria-label]=\"'About this page' | translate\"\n tooltip=\"{{ 'About this page' | translate }}\"\n placement=\"left\"\n container=\"body\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"help--help-btn\"\n [delay]=\"750\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n ></button>\n <button\n class=\"btn btn-link visible-xs\"\n title=\"{{ 'About this page' | translate }}\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"help-outline\"\n ></i>\n {{ 'About this page' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<div\n class=\"c8y-help-drawer\"\n id=\"collapseHelp\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n (collapsed)=\"onCollapsed()\"\n>\n <div\n [ngClass]=\"{ 'c8y-help-drawer-block': isInit }\"\n #docOutlet\n data-cy=\"c8y-help--c8y-help-drawer-block\"\n >\n @if (isLoading) {\n <c8y-loading></c8y-loading>\n } @else {\n <div class=\"d-flex\">\n <i\n class=\"c8y-icon-duocolor icon-48\"\n [c8yIcon]=\"!hasError ? icon : 'unlink'\"\n [ngClass]=\"{ 'text-warning': hasError, 'text-muted': !hasError }\"\n ></i>\n @if (!hasError) {\n <div class=\"p-l-16 flex-grow\">\n @if (\n !helpService.isSupportedLanguage() &&\n !showLangWarning &&\n !helpService.isWarningAlertViewed\n ) {\n <div class=\"alert alert-info m-b-16\">\n <button\n class=\"close\"\n [attr.aria-label]=\"'Close' | translate\"\n type=\"button\"\n (click)=\"\n showLangWarning = !showLangWarning;\n helpService.isWarningAlertViewed = !helpService.isWarningAlertViewed\n \"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <p>\n {{ 'Help content is only available in English.' | translate }}\n </p>\n </div>\n }\n <h4 class=\"text-bold text-primary p-t-16 m-b-16\">\n {{ title }}\n </h4>\n <div\n class=\"help-content\"\n id=\"helpContent\"\n [innerHTML]=\"sectionContent\"\n data-cy=\"help--c8y-help-content\"\n ></div>\n </div>\n }\n\n @if (hasError) {\n <div class=\"p-l-16 p-t-16 flex-grow\">\n <h4\n class=\"text-bold m-b-16\"\n translate\n >\n Content couldn't be loaded.\n </h4>\n <div class=\"help-content\">\n <p translate>Check internet connection or reload page.</p>\n </div>\n </div>\n }\n </div>\n }\n </div>\n @if (!isLoading && !hasError) {\n <div\n class=\"c8y-help-drawer-footer animated fadeIn\"\n style=\"animation-delay: 0.35s\"\n data-cy=\"c8y-help--c8y-help-drawer-footer\"\n >\n <button\n class=\"btn btn-default\"\n [title]=\"'Close help' | translate\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"c8y-help--close-btn\"\n (click)=\"toggle()\"\n translate\n >\n Close\n </button>\n <a\n class=\"btn btn-primary\"\n href=\"{{ hasError ? getUrl() : getUrl(src) }}\"\n target=\"_blank\"\n data-cy=\"c8y-help--user-guide\"\n rel=\"noopener noreferrer\"\n >\n @if (!hasError) {\n <span translate>\n Open the\n <span>user documentation</span>\n </span>\n } @else {\n <span translate>\n Check the\n <span>user documentation</span>\n </span>\n }\n </a>\n </div>\n }\n</div>\n" }]
33645
+ ], changeDetection: ChangeDetectionStrategy.Eager, template: "@if (isContextHelpAvailable$ | async) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"pull-right m-l-md-8\"\n [priority]=\"priority\"\n >\n <button\n class=\"btn-help hidden-xs\"\n [attr.aria-label]=\"'About this page' | translate\"\n tooltip=\"{{ 'About this page' | translate }}\"\n placement=\"left\"\n container=\"body\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"help--help-btn\"\n [delay]=\"750\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n ></button>\n <button\n class=\"btn btn-link visible-xs\"\n title=\"{{ 'About this page' | translate }}\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n (click)=\"toggle()\"\n c8yProductExperience\n [actionName]=\"isCollapsed ? 'helpOpened' : 'helpClosed'\"\n [actionData]=\"{ src: src }\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"help-outline\"\n ></i>\n {{ 'About this page' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<div\n class=\"c8y-help-drawer\"\n id=\"collapseHelp\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n (collapsed)=\"onCollapsed()\"\n>\n <div\n [ngClass]=\"{ 'c8y-help-drawer-block': isInit }\"\n #docOutlet\n data-cy=\"c8y-help--c8y-help-drawer-block\"\n >\n @if (isLoading) {\n <c8y-loading></c8y-loading>\n } @else {\n <div class=\"d-flex\">\n <i\n class=\"c8y-icon-duocolor icon-48\"\n [c8yIcon]=\"!hasError ? icon : 'unlink'\"\n [ngClass]=\"{ 'text-warning': hasError, 'text-muted': !hasError }\"\n ></i>\n @if (!hasError) {\n <div class=\"p-l-16 flex-grow\">\n @if (\n !helpService.isSupportedLanguage() &&\n !showLangWarning &&\n !helpService.isWarningAlertViewed\n ) {\n <div class=\"alert alert-info m-b-16\">\n <button\n class=\"close\"\n [attr.aria-label]=\"'Close' | translate\"\n type=\"button\"\n (click)=\"\n showLangWarning = !showLangWarning;\n helpService.isWarningAlertViewed = !helpService.isWarningAlertViewed\n \"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <p>\n {{ 'Help content is only available in English.' | translate }}\n </p>\n </div>\n }\n <h4 class=\"text-bold text-primary p-t-16 m-b-16\">\n {{ title }}\n </h4>\n <div\n class=\"help-content\"\n id=\"helpContent\"\n [innerHTML]=\"sectionContent\"\n data-cy=\"help--c8y-help-content\"\n ></div>\n </div>\n }\n\n @if (hasError) {\n <div class=\"p-l-16 p-t-16 flex-grow\">\n <h4\n class=\"text-bold m-b-16\"\n translate\n >\n Content couldn't be loaded.\n </h4>\n <div class=\"help-content\">\n <p translate>Check internet connection or reload page.</p>\n </div>\n </div>\n }\n </div>\n }\n </div>\n @if (!isLoading && !hasError) {\n <div\n class=\"c8y-help-drawer-footer animated fadeIn\"\n style=\"animation-delay: 0.35s\"\n data-cy=\"c8y-help--c8y-help-drawer-footer\"\n >\n <button\n class=\"btn btn-default\"\n [title]=\"'Close help' | translate\"\n aria-controls=\"collapseHelp\"\n [attr.aria-expanded]=\"!isCollapsed\"\n type=\"button\"\n data-cy=\"c8y-help--close-btn\"\n (click)=\"toggle()\"\n translate\n >\n Close\n </button>\n <a\n class=\"btn btn-primary\"\n href=\"{{ hasError ? getUrl() : getUrl(src) }}\"\n target=\"_blank\"\n data-cy=\"c8y-help--user-guide\"\n rel=\"noopener noreferrer\"\n >\n @if (!hasError) {\n <span translate>\n Open the\n <span>user documentation</span>\n </span>\n } @else {\n <span translate>\n Check the\n <span>user documentation</span>\n </span>\n }\n </a>\n </div>\n }\n</div>\n" }]
33606
33646
  }], ctorParameters: () => [{ type: DocsService }, { type: HelpService }], propDecorators: { src: [{
33607
33647
  type: Input
33608
33648
  }], isCollapsed: [{