@c8y/ngx-components 1024.2.4 → 1024.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/fesm2022/c8y-ngx-components-bookmarks.mjs +33 -23
  2. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -2
  4. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
  6. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
  8. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
  10. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +43 -0
  12. package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
  14. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +179 -41
  16. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
  18. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
  20. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
  22. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
  24. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components.mjs +9 -4
  26. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  27. package/locales/de.po +61 -5
  28. package/locales/es.po +61 -5
  29. package/locales/fr.po +61 -5
  30. package/locales/ja_JP.po +60 -6
  31. package/locales/ko.po +61 -5
  32. package/locales/locales.pot +60 -4
  33. package/locales/nl.po +61 -5
  34. package/locales/pl.po +61 -5
  35. package/locales/pt_BR.po +61 -5
  36. package/locales/zh_CN.po +61 -5
  37. package/locales/zh_TW.po +61 -5
  38. package/package.json +1 -1
  39. package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
  40. package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
  41. package/types/c8y-ngx-components-device-profile.d.ts +5 -2
  42. package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
  43. package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
  44. package/types/c8y-ngx-components-remote-access-data.d.ts +19 -0
  45. package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
  46. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
  47. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
  48. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
  49. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
  50. package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
  51. package/types/c8y-ngx-components-repository-software.d.ts +2 -0
  52. package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
  53. package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
  54. package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
  55. package/types/c8y-ngx-components.d.ts +5 -1
  56. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -19441,6 +19441,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
19441
19441
  * control only when the user confirms an edit (save), not on every keystroke.
19442
19442
  * When `noSaveButton` is `true`, every keystroke propagates instead.
19443
19443
  *
19444
+ * The model update (`onChange`) happens before the `(save)` event fires, so
19445
+ * `(save)` handlers can read the committed value directly from the bound form
19446
+ * control or `ngModel`.
19447
+ *
19444
19448
  * Supports synchronous and asynchronous validators via the `validators` and
19445
19449
  * `asyncValidators` inputs. Validation errors are shown while the user is
19446
19450
  * editing; saving is blocked when the typed value is invalid or a validator
@@ -19598,9 +19602,9 @@ class InputGroupEditableComponent {
19598
19602
  const value = this.internalControl.value ?? '';
19599
19603
  this.committedValue = value;
19600
19604
  this.errors = null;
19601
- this.save.emit(value);
19602
19605
  this.onChange?.(value);
19603
19606
  this.onTouched?.();
19607
+ this.save.emit(value);
19604
19608
  this.internalControl.reset(value, { emitEvent: false });
19605
19609
  this.notifyAutoresize();
19606
19610
  this.announce(gettext$1('Saved'));
@@ -19617,7 +19621,8 @@ class InputGroupEditableComponent {
19617
19621
  this.cancel.emit();
19618
19622
  this.announce(gettext$1('Cancelled'));
19619
19623
  }
19620
- onEscape() {
19624
+ onEscape(event) {
19625
+ event.stopPropagation();
19621
19626
  this.onCancel();
19622
19627
  this.inputEl()?.nativeElement.blur();
19623
19628
  }
@@ -19641,7 +19646,7 @@ class InputGroupEditableComponent {
19641
19646
  useExisting: forwardRef(() => InputGroupEditableComponent),
19642
19647
  multi: true
19643
19648
  }
19644
- ], queries: [{ propertyName: "customErrorMessages", predicate: MessageDirective }], viewQueries: [{ propertyName: "autoresizeDir", first: true, predicate: TextareaAutoresizeDirective, descendants: true, isSignal: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19649
+ ], queries: [{ propertyName: "customErrorMessages", predicate: MessageDirective }], viewQueries: [{ propertyName: "autoresizeDir", first: true, predicate: TextareaAutoresizeDirective, descendants: true, isSignal: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n data-1p-ignore\n data-lpignore=\"true\"\n data-bwignore\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19645
19650
  }
19646
19651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: InputGroupEditableComponent, decorators: [{
19647
19652
  type: Component,
@@ -19658,7 +19663,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
19658
19663
  useExisting: forwardRef(() => InputGroupEditableComponent),
19659
19664
  multi: true
19660
19665
  }
19661
- ], template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape()\"\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n" }]
19666
+ ], template: "<c8y-form-group\n [class]=\"formGroupClass()\"\n [status]=\"!!errors ? 'error' : ''\"\n>\n <div\n class=\"input-group input-group-editable\"\n [class.input-group-sm]=\"size() === 'sm'\"\n [class.input-group-lg]=\"size() === 'lg'\"\n [class.input-group-editable--no-actions]=\"noSaveButton()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n role=\"group\"\n >\n @if (multiline()) {\n <textarea\n class=\"form-control no-resize\"\n [style.max-height]=\"maxHeight() || null\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.control.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n c8y-textarea-autoresize\n ></textarea>\n } @else {\n <input\n class=\"form-control\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n data-cy=\"c8y-input-group-editable--input\"\n #inputEl\n [attr.maxlength]=\"maxLength()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [placeholder]=\"(placeholder() | translate) || ''\"\n [formControl]=\"internalControl\"\n (keydown.enter)=\"noSaveButton() ? null : onSave()\"\n (keydown.escape)=\"onEscape($event)\"\n data-1p-ignore\n data-lpignore=\"true\"\n data-bwignore\n />\n }\n <!-- Edit mode indicator hook used by _input-groups.scss -->\n <span aria-hidden=\"true\"></span>\n @if (!internalControl.disabled && !noSaveButton()) {\n <div class=\"input-group-btn min-width-0\">\n <button\n class=\"btn btn-clean\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"onCancel()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean text-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"isSaveDisabled\"\n (click)=\"onSave()\"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ liveMessage | translate }}</span\n >\n </div>\n <c8y-messages\n [show]=\"errors\"\n [additionalMessages]=\"customErrorMessages\"\n ></c8y-messages>\n</c8y-form-group>\n" }]
19662
19667
  }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], noSaveButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "noSaveButton", required: false }] }], formGroupClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "formGroupClass", required: false }] }], validators: [{ type: i0.Input, args: [{ isSignal: true, alias: "validators", required: false }] }], asyncValidators: [{ type: i0.Input, args: [{ isSignal: true, alias: "asyncValidators", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], save: [{ type: i0.Output, args: ["save"] }], cancel: [{ type: i0.Output, args: ["cancel"] }], customErrorMessages: [{
19663
19668
  type: ContentChildren,
19664
19669
  args: [MessageDirective]