@valtimo/access-control-management 13.36.1 → 13.37.0

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.
@@ -679,10 +679,10 @@ class AccessControlFormEditorService {
679
679
  sortByText(items) {
680
680
  return [...items].sort((a, b) => (a.text ?? '').localeCompare(b.text ?? ''));
681
681
  }
682
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlFormEditorService, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); }
683
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlFormEditorService }); }
682
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlFormEditorService, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); }
683
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlFormEditorService }); }
684
684
  }
685
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlFormEditorService, decorators: [{
685
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlFormEditorService, decorators: [{
686
686
  type: Injectable
687
687
  }], ctorParameters: () => [{ type: i1.FormBuilder }] });
688
688
  function minSelectedArrayValidator(min) {
@@ -795,10 +795,10 @@ class AccessControlService {
795
795
  updateRole(roleKey, request) {
796
796
  return this.http.put(`${this.valtimoEndpointUri}v1/roles/${roleKey}`, request);
797
797
  }
798
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlService, deps: [{ token: i1$1.ConfigService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
799
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlService, providedIn: 'root' }); }
798
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlService, deps: [{ token: i1$1.ConfigService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
799
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlService, providedIn: 'root' }); }
800
800
  }
801
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlService, decorators: [{
801
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlService, decorators: [{
802
802
  type: Injectable,
803
803
  args: [{ providedIn: 'root' }]
804
804
  }], ctorParameters: () => [{ type: i1$1.ConfigService }, { type: i2.HttpClient }] });
@@ -882,10 +882,10 @@ class PermissionSchemaMetadataService {
882
882
  }
883
883
  return result;
884
884
  }
885
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: PermissionSchemaMetadataService, deps: [{ token: AccessControlService }], target: i0.ɵɵFactoryTarget.Injectable }); }
886
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: PermissionSchemaMetadataService, providedIn: 'root' }); }
885
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PermissionSchemaMetadataService, deps: [{ token: AccessControlService }], target: i0.ɵɵFactoryTarget.Injectable }); }
886
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PermissionSchemaMetadataService, providedIn: 'root' }); }
887
887
  }
888
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: PermissionSchemaMetadataService, decorators: [{
888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PermissionSchemaMetadataService, decorators: [{
889
889
  type: Injectable,
890
890
  args: [{ providedIn: 'root' }]
891
891
  }], ctorParameters: () => [{ type: AccessControlService }] });
@@ -947,10 +947,10 @@ class AccessControlExportService {
947
947
  element.click(); // simulate click
948
948
  document.body.removeChild(element);
949
949
  }
950
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlExportService, deps: [{ token: AccessControlService }], target: i0.ɵɵFactoryTarget.Injectable }); }
951
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlExportService, providedIn: 'root' }); }
950
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlExportService, deps: [{ token: AccessControlService }], target: i0.ɵɵFactoryTarget.Injectable }); }
951
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlExportService, providedIn: 'root' }); }
952
952
  }
953
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlExportService, decorators: [{
953
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlExportService, decorators: [{
954
954
  type: Injectable,
955
955
  args: [{ providedIn: 'root' }]
956
956
  }], ctorParameters: () => [{ type: AccessControlService }] });
@@ -1058,10 +1058,10 @@ class RoleMetadataModalComponent {
1058
1058
  }
1059
1059
  }, CARBON_CONSTANTS.modalAnimationMs);
1060
1060
  }
1061
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RoleMetadataModalComponent, deps: [{ token: i1.FormBuilder }, { token: AccessControlService }], target: i0.ɵɵFactoryTarget.Component }); }
1062
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: RoleMetadataModalComponent, isStandalone: false, selector: "valtimo-role-metadata-modal", inputs: { type: "type", open: "open", defaultKeyValue: "defaultKeyValue", usedKeys: "usedKeys" }, outputs: { closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n *ngIf=\"{\n isAdd: type === 'add',\n } as vars\"\n [open]=\"open\"\n showFooter=\"true\"\n [title]=\"vars.title\"\n valtimoCdsModal\n (close)=\"onCancel()\"\n>\n <cds-modal-header [cdsLayer]=\"1\" [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{\n vars.isAdd\n ? ('accessControl.roles.add' | translate)\n : ('accessControl.roles.editRole' | translate)\n }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <form [formGroup]=\"form\">\n <div class=\"role-metadata-modal__field cds--form-item\">\n <label class=\"cds--label\">\n {{ 'accessControl.roles.name' | translate }} ({{ 'interface.required' | translate }})\n </label>\n\n @if ($keyManual()) {\n <input\n formControlName=\"key\"\n cdsText\n placeholder=\"{{ 'accessControl.roles.name' | translate }}\"\n [attr.modal-primary-focus]=\"true\"\n [invalid]=\"key.dirty && key.invalid\"\n />\n } @else {\n <v-select\n formControlName=\"key\"\n [appendInline]=\"false\"\n [clearable]=\"false\"\n [defaultSelectionId]=\"key.value || ''\"\n [dropUp]=\"false\"\n [invalid]=\"key.dirty && key.invalid\"\n [items]=\"$roleKeyItems()\"\n [loading]=\"$loadingRoles()\"\n [placeholder]=\"'accessControl.roles.selectRole' | translate\"\n ></v-select>\n }\n\n <button\n class=\"role-metadata-modal__mode-switch\"\n cdsButton=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onKeyManualToggle(!$keyManual())\"\n >\n {{\n ($keyManual()\n ? 'accessControl.roles.chooseFromList'\n : 'accessControl.roles.enterManually'\n ) | translate\n }}\n </button>\n </div>\n </form>\n </section>\n\n <cds-modal-footer [cdsLayer]=\"1\">\n <button cdsButton=\"secondary\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button [disabled]=\"this.form.invalid\" (click)=\"onConfirm()\" cdsButton=\"primary\">\n {{ vars.isAdd ? ('interface.create' | translate) : ('interface.save' | translate) }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".role-metadata-modal__field{display:flex;flex-direction:column;gap:.5rem}.role-metadata-modal__field v-select{display:block;width:100%}.role-metadata-modal__field input{width:100%}.role-metadata-modal__mode-switch{align-self:flex-start}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i2$1.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2$1.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2$1.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2$1.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2$1.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "component", type: i3$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1061
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RoleMetadataModalComponent, deps: [{ token: i1.FormBuilder }, { token: AccessControlService }], target: i0.ɵɵFactoryTarget.Component }); }
1062
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: RoleMetadataModalComponent, isStandalone: false, selector: "valtimo-role-metadata-modal", inputs: { type: "type", open: "open", defaultKeyValue: "defaultKeyValue", usedKeys: "usedKeys" }, outputs: { closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n *ngIf=\"{\n isAdd: type === 'add',\n } as vars\"\n [open]=\"open\"\n showFooter=\"true\"\n [title]=\"vars.title\"\n valtimoCdsModal\n (close)=\"onCancel()\"\n>\n <cds-modal-header [cdsLayer]=\"1\" [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{\n vars.isAdd\n ? ('accessControl.roles.add' | translate)\n : ('accessControl.roles.editRole' | translate)\n }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <form [formGroup]=\"form\">\n <div class=\"role-metadata-modal__field cds--form-item\">\n <label class=\"cds--label\">\n {{ 'accessControl.roles.name' | translate }} ({{ 'interface.required' | translate }})\n </label>\n\n @if ($keyManual()) {\n <input\n formControlName=\"key\"\n cdsText\n placeholder=\"{{ 'accessControl.roles.name' | translate }}\"\n [attr.modal-primary-focus]=\"true\"\n [invalid]=\"key.dirty && key.invalid\"\n />\n } @else {\n <v-select\n formControlName=\"key\"\n [appendInline]=\"false\"\n [clearable]=\"false\"\n [defaultSelectionId]=\"key.value || ''\"\n [dropUp]=\"false\"\n [invalid]=\"key.dirty && key.invalid\"\n [items]=\"$roleKeyItems()\"\n [loading]=\"$loadingRoles()\"\n [placeholder]=\"'accessControl.roles.selectRole' | translate\"\n ></v-select>\n }\n\n <button\n class=\"role-metadata-modal__mode-switch\"\n cdsButton=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onKeyManualToggle(!$keyManual())\"\n >\n {{\n ($keyManual()\n ? 'accessControl.roles.chooseFromList'\n : 'accessControl.roles.enterManually'\n ) | translate\n }}\n </button>\n </div>\n </form>\n </section>\n\n <cds-modal-footer [cdsLayer]=\"1\">\n <button cdsButton=\"secondary\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button [disabled]=\"this.form.invalid\" (click)=\"onConfirm()\" cdsButton=\"primary\">\n {{ vars.isAdd ? ('interface.create' | translate) : ('interface.save' | translate) }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".role-metadata-modal__field{display:flex;flex-direction:column;gap:.5rem}.role-metadata-modal__field v-select{display:block;width:100%}.role-metadata-modal__field input{width:100%}.role-metadata-modal__mode-switch{align-self:flex-start}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i2$1.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2$1.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2$1.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2$1.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2$1.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "component", type: i3$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1063
1063
  }
1064
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RoleMetadataModalComponent, decorators: [{
1064
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: RoleMetadataModalComponent, decorators: [{
1065
1065
  type: Component,
1066
1066
  args: [{ standalone: false, selector: 'valtimo-role-metadata-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n *ngIf=\"{\n isAdd: type === 'add',\n } as vars\"\n [open]=\"open\"\n showFooter=\"true\"\n [title]=\"vars.title\"\n valtimoCdsModal\n (close)=\"onCancel()\"\n>\n <cds-modal-header [cdsLayer]=\"1\" [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{\n vars.isAdd\n ? ('accessControl.roles.add' | translate)\n : ('accessControl.roles.editRole' | translate)\n }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <form [formGroup]=\"form\">\n <div class=\"role-metadata-modal__field cds--form-item\">\n <label class=\"cds--label\">\n {{ 'accessControl.roles.name' | translate }} ({{ 'interface.required' | translate }})\n </label>\n\n @if ($keyManual()) {\n <input\n formControlName=\"key\"\n cdsText\n placeholder=\"{{ 'accessControl.roles.name' | translate }}\"\n [attr.modal-primary-focus]=\"true\"\n [invalid]=\"key.dirty && key.invalid\"\n />\n } @else {\n <v-select\n formControlName=\"key\"\n [appendInline]=\"false\"\n [clearable]=\"false\"\n [defaultSelectionId]=\"key.value || ''\"\n [dropUp]=\"false\"\n [invalid]=\"key.dirty && key.invalid\"\n [items]=\"$roleKeyItems()\"\n [loading]=\"$loadingRoles()\"\n [placeholder]=\"'accessControl.roles.selectRole' | translate\"\n ></v-select>\n }\n\n <button\n class=\"role-metadata-modal__mode-switch\"\n cdsButton=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onKeyManualToggle(!$keyManual())\"\n >\n {{\n ($keyManual()\n ? 'accessControl.roles.chooseFromList'\n : 'accessControl.roles.enterManually'\n ) | translate\n }}\n </button>\n </div>\n </form>\n </section>\n\n <cds-modal-footer [cdsLayer]=\"1\">\n <button cdsButton=\"secondary\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button [disabled]=\"this.form.invalid\" (click)=\"onConfirm()\" cdsButton=\"primary\">\n {{ vars.isAdd ? ('interface.create' | translate) : ('interface.save' | translate) }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".role-metadata-modal__field{display:flex;flex-direction:column;gap:.5rem}.role-metadata-modal__field v-select{display:block;width:100%}.role-metadata-modal__field input{width:100%}.role-metadata-modal__mode-switch{align-self:flex-start}\n"] }]
1067
1067
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: AccessControlService }], propDecorators: { type: [{
@@ -1098,10 +1098,10 @@ class DeleteRoleModalComponent {
1098
1098
  onDelete(roles) {
1099
1099
  this.deleteEvent.emit(roles);
1100
1100
  }
1101
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: DeleteRoleModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1102
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: DeleteRoleModalComponent, isStandalone: false, selector: "valtimo-delete-role-modal", inputs: { deleteRowKeys: "deleteRowKeys", showDeleteModal$: "showDeleteModal$" }, outputs: { deleteEvent: "deleteEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"accessControl.roles.deleteModalContent\"\n [outputOnConfirm]=\"deleteRowKeys\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"interface.delete\"\n (confirmEvent)=\"onDelete($event)\"\n></valtimo-confirmation-modal>\n", dependencies: [{ kind: "component", type: i3$1.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DeleteRoleModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1102
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: DeleteRoleModalComponent, isStandalone: false, selector: "valtimo-delete-role-modal", inputs: { deleteRowKeys: "deleteRowKeys", showDeleteModal$: "showDeleteModal$" }, outputs: { deleteEvent: "deleteEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"accessControl.roles.deleteModalContent\"\n [outputOnConfirm]=\"deleteRowKeys\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"interface.delete\"\n (confirmEvent)=\"onDelete($event)\"\n></valtimo-confirmation-modal>\n", dependencies: [{ kind: "component", type: i3$1.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1103
1103
  }
1104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: DeleteRoleModalComponent, decorators: [{
1104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DeleteRoleModalComponent, decorators: [{
1105
1105
  type: Component,
1106
1106
  args: [{ standalone: false, selector: 'valtimo-delete-role-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"accessControl.roles.deleteModalContent\"\n [outputOnConfirm]=\"deleteRowKeys\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"interface.delete\"\n (confirmEvent)=\"onDelete($event)\"\n></valtimo-confirmation-modal>\n" }]
1107
1107
  }], propDecorators: { deleteRowKeys: [{
@@ -1163,10 +1163,10 @@ class ExportRoleModalComponent {
1163
1163
  this.resetType();
1164
1164
  });
1165
1165
  }
1166
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ExportRoleModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1167
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: ExportRoleModalComponent, isStandalone: false, selector: "valtimo-export-role-modal", inputs: { open: "open", exportRowKeys: "exportRowKeys", reset$: "reset$", disabled: "disabled" }, outputs: { exportEvent: "exportEvent", closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n *ngIf=\"{title: ('interface.export' | translate), selectedType: selectedType$ | async} as vars\"\n valtimoCdsModal\n [open]=\"open\"\n size=\"sm\"\n showFooter=\"true\"\n [title]=\"vars.title\"\n (close)=\"onCancel()\"\n>\n <cds-modal-header [cdsLayer]=\"1\" [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ vars.title }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <div class=\"export-buttons\">\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"selectType('unified')\">\n {{ 'accessControl.roles.singleExport' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"document\" size=\"16\"></svg>\n </button>\n\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"selectType('separate')\">\n {{ 'accessControl.roles.multipleExport' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"copy--file\" size=\"16\"></svg>\n </button>\n </div>\n </section>\n\n <cds-modal-footer [cdsLayer]=\"1\">\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n [disabled]=\"!vars.selectedType || disabled\"\n cdsButton=\"primary\"\n (click)=\"onConfirm(vars.selectedType)\"\n >\n {{ vars.title }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".export-buttons{display:grid;width:100%;grid-template-columns:1fr 1fr;column-gap:16px}.export-buttons button{width:100%}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i2$1.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2$1.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2$1.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2$1.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2$1.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ExportRoleModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: ExportRoleModalComponent, isStandalone: false, selector: "valtimo-export-role-modal", inputs: { open: "open", exportRowKeys: "exportRowKeys", reset$: "reset$", disabled: "disabled" }, outputs: { exportEvent: "exportEvent", closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n *ngIf=\"{title: ('interface.export' | translate), selectedType: selectedType$ | async} as vars\"\n valtimoCdsModal\n [open]=\"open\"\n size=\"sm\"\n showFooter=\"true\"\n [title]=\"vars.title\"\n (close)=\"onCancel()\"\n>\n <cds-modal-header [cdsLayer]=\"1\" [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ vars.title }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <div class=\"export-buttons\">\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"selectType('unified')\">\n {{ 'accessControl.roles.singleExport' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"document\" size=\"16\"></svg>\n </button>\n\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"selectType('separate')\">\n {{ 'accessControl.roles.multipleExport' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"copy--file\" size=\"16\"></svg>\n </button>\n </div>\n </section>\n\n <cds-modal-footer [cdsLayer]=\"1\">\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n [disabled]=\"!vars.selectedType || disabled\"\n cdsButton=\"primary\"\n (click)=\"onConfirm(vars.selectedType)\"\n >\n {{ vars.title }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".export-buttons{display:grid;width:100%;grid-template-columns:1fr 1fr;column-gap:16px}.export-buttons button{width:100%}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i2$1.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2$1.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2$1.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2$1.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2$1.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1168
1168
  }
1169
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ExportRoleModalComponent, decorators: [{
1169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ExportRoleModalComponent, decorators: [{
1170
1170
  type: Component,
1171
1171
  args: [{ standalone: false, selector: 'valtimo-export-role-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<cds-modal\n *ngIf=\"{title: ('interface.export' | translate), selectedType: selectedType$ | async} as vars\"\n valtimoCdsModal\n [open]=\"open\"\n size=\"sm\"\n showFooter=\"true\"\n [title]=\"vars.title\"\n (close)=\"onCancel()\"\n>\n <cds-modal-header [cdsLayer]=\"1\" [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ vars.title }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent [cdsLayer]=\"1\">\n <div class=\"export-buttons\">\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"selectType('unified')\">\n {{ 'accessControl.roles.singleExport' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"document\" size=\"16\"></svg>\n </button>\n\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"selectType('separate')\">\n {{ 'accessControl.roles.multipleExport' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"copy--file\" size=\"16\"></svg>\n </button>\n </div>\n </section>\n\n <cds-modal-footer [cdsLayer]=\"1\">\n <button [disabled]=\"disabled\" cdsButton=\"secondary\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n [disabled]=\"!vars.selectedType || disabled\"\n cdsButton=\"primary\"\n (click)=\"onConfirm(vars.selectedType)\"\n >\n {{ vars.title }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".export-buttons{display:grid;width:100%;grid-template-columns:1fr 1fr;column-gap:16px}.export-buttons button{width:100%}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1172
1172
  }], propDecorators: { open: [{
@@ -1277,10 +1277,10 @@ class AccessControlOverviewComponent {
1277
1277
  setSelectedRoleKeys() {
1278
1278
  this.selectedRowKeys$.next(this.carbonList.selectedItems.map((role) => role.roleKey));
1279
1279
  }
1280
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlOverviewComponent, deps: [{ token: AccessControlService }, { token: AccessControlExportService }, { token: i1$3.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1281
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: AccessControlOverviewComponent, isStandalone: false, selector: "ng-component", viewQueries: [{ propertyName: "carbonList", first: true, predicate: CarbonListComponent, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n [header]=\"false\"\n [items]=\"roles$ | async\"\n [fields]=\"fields\"\n [loading]=\"loading$ | async\"\n [showSelectionColumn]=\"true\"\n (rowClicked)=\"onRowClick($event)\"\n>\n <ng-container header> {{ 'accessControl.roles.title' | translate }} </ng-container>\n\n <div carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addRoleButton\"></ng-container>\n </div>\n\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showDeleteModal()\">\n {{ 'interface.delete' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n\n <button cdsButton=\"primary\" (click)=\"showExportModal()\">\n {{ 'interface.export' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addRoleButton\"\n description=\"{{ 'accessControl.roles.noResults.description' | translate }}\"\n title=\"{{ 'accessControl.roles.noResults.title' | translate }}\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-role-metadata-modal\n [open]=\"showAddModal$ | async\"\n [usedKeys]=\"existingRoleKeys$ | async\"\n (closeEvent)=\"onAdd($event)\"\n></valtimo-role-metadata-modal>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-delete-role-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-delete-role-modal>\n\n <valtimo-export-role-modal\n [disabled]=\"exportDisabled$ | async\"\n [exportRowKeys]=\"obs.selectedRowKeys\"\n [open]=\"showExportModal$ | async\"\n [reset$]=\"resetExportType$\"\n (exportEvent)=\"onExport($event)\"\n (closeEvent)=\"closeExportModal()\"\n >\n </valtimo-export-role-modal>\n</ng-container>\n\n<ng-template #addRoleButton>\n <button cdsButton=\"primary\" (click)=\"openAddModal()\">\n {{ 'accessControl.roles.add' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3$1.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "skeletonRowCount", "actions", "actionItems", "showActionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i3$1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "component", type: RoleMetadataModalComponent, selector: "valtimo-role-metadata-modal", inputs: ["type", "open", "defaultKeyValue", "usedKeys"], outputs: ["closeEvent"] }, { kind: "component", type: DeleteRoleModalComponent, selector: "valtimo-delete-role-modal", inputs: ["deleteRowKeys", "showDeleteModal$"], outputs: ["deleteEvent"] }, { kind: "component", type: ExportRoleModalComponent, selector: "valtimo-export-role-modal", inputs: ["open", "exportRowKeys", "reset$", "disabled"], outputs: ["exportEvent", "closeEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1280
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlOverviewComponent, deps: [{ token: AccessControlService }, { token: AccessControlExportService }, { token: i1$3.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1281
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AccessControlOverviewComponent, isStandalone: false, selector: "ng-component", viewQueries: [{ propertyName: "carbonList", first: true, predicate: CarbonListComponent, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n [header]=\"false\"\n [items]=\"roles$ | async\"\n [fields]=\"fields\"\n [loading]=\"loading$ | async\"\n [showSelectionColumn]=\"true\"\n (rowClicked)=\"onRowClick($event)\"\n>\n <ng-container header> {{ 'accessControl.roles.title' | translate }} </ng-container>\n\n <div carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addRoleButton\"></ng-container>\n </div>\n\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showDeleteModal()\">\n {{ 'interface.delete' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n\n <button cdsButton=\"primary\" (click)=\"showExportModal()\">\n {{ 'interface.export' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addRoleButton\"\n description=\"{{ 'accessControl.roles.noResults.description' | translate }}\"\n title=\"{{ 'accessControl.roles.noResults.title' | translate }}\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-role-metadata-modal\n [open]=\"showAddModal$ | async\"\n [usedKeys]=\"existingRoleKeys$ | async\"\n (closeEvent)=\"onAdd($event)\"\n></valtimo-role-metadata-modal>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-delete-role-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-delete-role-modal>\n\n <valtimo-export-role-modal\n [disabled]=\"exportDisabled$ | async\"\n [exportRowKeys]=\"obs.selectedRowKeys\"\n [open]=\"showExportModal$ | async\"\n [reset$]=\"resetExportType$\"\n (exportEvent)=\"onExport($event)\"\n (closeEvent)=\"closeExportModal()\"\n >\n </valtimo-export-role-modal>\n</ng-container>\n\n<ng-template #addRoleButton>\n <button cdsButton=\"primary\" (click)=\"openAddModal()\">\n {{ 'accessControl.roles.add' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3$1.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "skeletonRowCount", "actions", "actionItems", "showActionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i3$1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "component", type: RoleMetadataModalComponent, selector: "valtimo-role-metadata-modal", inputs: ["type", "open", "defaultKeyValue", "usedKeys"], outputs: ["closeEvent"] }, { kind: "component", type: DeleteRoleModalComponent, selector: "valtimo-delete-role-modal", inputs: ["deleteRowKeys", "showDeleteModal$"], outputs: ["deleteEvent"] }, { kind: "component", type: ExportRoleModalComponent, selector: "valtimo-export-role-modal", inputs: ["open", "exportRowKeys", "reset$", "disabled"], outputs: ["exportEvent", "closeEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1282
1282
  }
1283
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlOverviewComponent, decorators: [{
1283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlOverviewComponent, decorators: [{
1284
1284
  type: Component,
1285
1285
  args: [{ standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<valtimo-carbon-list\n [header]=\"false\"\n [items]=\"roles$ | async\"\n [fields]=\"fields\"\n [loading]=\"loading$ | async\"\n [showSelectionColumn]=\"true\"\n (rowClicked)=\"onRowClick($event)\"\n>\n <ng-container header> {{ 'accessControl.roles.title' | translate }} </ng-container>\n\n <div carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addRoleButton\"></ng-container>\n </div>\n\n <ng-container carbonToolbarActions>\n <button cdsButton=\"primary\" (click)=\"showDeleteModal()\">\n {{ 'interface.delete' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n\n <button cdsButton=\"primary\" (click)=\"showExportModal()\">\n {{ 'interface.export' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"download\" size=\"16\"></svg>\n </button>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addRoleButton\"\n description=\"{{ 'accessControl.roles.noResults.description' | translate }}\"\n title=\"{{ 'accessControl.roles.noResults.title' | translate }}\"\n ></valtimo-no-results>\n</valtimo-carbon-list>\n\n<valtimo-role-metadata-modal\n [open]=\"showAddModal$ | async\"\n [usedKeys]=\"existingRoleKeys$ | async\"\n (closeEvent)=\"onAdd($event)\"\n></valtimo-role-metadata-modal>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-delete-role-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-delete-role-modal>\n\n <valtimo-export-role-modal\n [disabled]=\"exportDisabled$ | async\"\n [exportRowKeys]=\"obs.selectedRowKeys\"\n [open]=\"showExportModal$ | async\"\n [reset$]=\"resetExportType$\"\n (exportEvent)=\"onExport($event)\"\n (closeEvent)=\"closeExportModal()\"\n >\n </valtimo-export-role-modal>\n</ng-container>\n\n<ng-template #addRoleButton>\n <button cdsButton=\"primary\" (click)=\"openAddModal()\">\n {{ 'accessControl.roles.add' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n" }]
1286
1286
  }], ctorParameters: () => [{ type: AccessControlService }, { type: AccessControlExportService }, { type: i1$3.Router }], propDecorators: { carbonList: [{
@@ -1427,10 +1427,10 @@ class ConditionTreeComponent {
1427
1427
  .map(control => control.get('resourceType').value)
1428
1428
  .filter((value) => !!value);
1429
1429
  }
1430
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ConditionTreeComponent, deps: [{ token: AccessControlFormEditorService }, { token: i2$1.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
1431
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: ConditionTreeComponent, isStandalone: false, selector: "valtimo-condition-tree", inputs: { conditions: "conditions", resourceType: "resourceType", disabled: "disabled", depth: "depth" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"condition-tree\" [class.condition-tree--nested]=\"depth > 0\">\n @for (control of conditions.controls; track control; let i = $index) {\n <div class=\"condition-tree__row\" [cdsLayer]=\"rowLayerLevel\" [formGroup]=\"asFormGroup(control)\">\n <div class=\"condition-tree__content\">\n <v-select\n class=\"condition-tree__type\"\n formControlName=\"type\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionTypeSelect\"\n [defaultSelectionId]=\"typeOf(i)\"\n [dropUp]=\"false\"\n [items]=\"typeItems\"\n [tooltip]=\"'accessControl.editor.tooltips.conditionType' | translate\"\n titleTranslationKey=\"accessControl.editor.conditionType\"\n (selectedChange)=\"onTypeChange(i)\"\n ></v-select>\n\n @switch (typeOf(i)) {\n @case ('container') {\n <v-select\n formControlName=\"resourceType\"\n [cdsLayer]=\"inputLayerLevel\"\n [dataTestId]=\"testIds.conditionFieldSelect\"\n [defaultSelectionId]=\"containerResourceTypeAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['resourceTypeRequired'] &&\n !!asFormGroup(control).get('resourceType')?.touched\n \"\n [items]=\"containerTargetItems\"\n [placeholder]=\"'accessControl.editor.relatedResourcePlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.relatedResource' | translate\"\n titleTranslationKey=\"accessControl.editor.relatedResource\"\n ></v-select>\n\n <div class=\"condition-tree__nested\">\n <valtimo-condition-tree\n [conditions]=\"nestedConditions(i)\"\n [depth]=\"depth + 1\"\n [disabled]=\"disabled\"\n [resourceType]=\"containerResourceType(i)\"\n ></valtimo-condition-tree>\n </div>\n }\n\n @default {\n <div class=\"condition-tree__fields\">\n <v-select\n class=\"condition-tree__field\"\n formControlName=\"field\"\n [cdsLayer]=\"inputLayerLevel\"\n [dataTestId]=\"testIds.conditionFieldSelect\"\n [defaultSelectionId]=\"fieldValueAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['fieldRequired'] &&\n !!asFormGroup(control).get('field')?.touched\n \"\n [items]=\"fieldItems\"\n [placeholder]=\"'accessControl.editor.fieldPlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.field' | translate\"\n titleTranslationKey=\"accessControl.editor.field\"\n ></v-select>\n\n <v-select\n class=\"condition-tree__operator\"\n formControlName=\"operator\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionOperatorSelect\"\n [defaultSelectionId]=\"operatorValueAt(i)\"\n [dropUp]=\"false\"\n [items]=\"operatorItems\"\n [tooltip]=\"'accessControl.editor.tooltips.operator' | translate\"\n titleTranslationKey=\"accessControl.editor.operator\"\n ></v-select>\n\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.value' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.value' | translate\"\n ></v-tooltip-icon>\n </label>\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionValueInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['valueRequired'] &&\n !!asFormGroup(control).get('value')?.touched\n \"\n [placeholder]=\"'accessControl.editor.valuePlaceholder' | translate\"\n formControlName=\"value\"\n />\n </div>\n </div>\n\n @if (typeOf(i) === 'expression') {\n <div class=\"condition-tree__fields\">\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.path' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.path' | translate\"\n ></v-tooltip-icon>\n </label>\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionPathInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['pathRequired'] &&\n !!asFormGroup(control).get('path')?.touched\n \"\n [placeholder]=\"'accessControl.editor.pathPlaceholder' | translate\"\n formControlName=\"path\"\n />\n </div>\n\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.clazz' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.clazz' | translate\"\n ></v-tooltip-icon>\n </label>\n\n @if (clazzManualAt(i)) {\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionClazzInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['clazzRequired'] &&\n !!asFormGroup(control).get('clazz')?.touched\n \"\n [placeholder]=\"'accessControl.editor.clazzPlaceholder' | translate\"\n formControlName=\"clazz\"\n />\n } @else {\n <v-select\n formControlName=\"clazz\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionClazzInput\"\n [defaultSelectionId]=\"clazzValueAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['clazzRequired'] &&\n !!asFormGroup(control).get('clazz')?.touched\n \"\n [items]=\"valueTypeItems\"\n ></v-select>\n }\n\n <button\n class=\"condition-tree__mode-switch\"\n cdsButton=\"ghost\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onClazzManualToggle(i, !clazzManualAt(i))\"\n >\n {{\n (clazzManualAt(i)\n ? 'accessControl.editor.valueTypeFromList'\n : 'accessControl.editor.valueTypeManual'\n ) | translate\n }}\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n\n <button\n class=\"condition-tree__remove\"\n cdsButton=\"ghost\"\n [attr.data-test-id]=\"testIds.removeConditionButton\"\n [disabled]=\"disabled\"\n [iconOnly]=\"true\"\n (click)=\"removeCondition(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n }\n\n <button\n class=\"condition-tree__add\"\n cdsButton=\"ghost\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.addConditionButton\"\n [disabled]=\"disabled\"\n (click)=\"addCondition()\"\n >\n {{ 'accessControl.editor.addCondition' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</div>\n", styles: [".condition-tree{display:flex;flex-direction:column;gap:.75rem}.condition-tree v-select{display:block;width:100%}.condition-tree--nested{border-left:2px solid var(--cds-border-subtle, #c6c6c6);margin-top:.5rem;padding-left:1rem}.condition-tree__row{background-color:var(--cds-layer);border:1px solid var(--cds-border-subtle);display:flex;flex-direction:row;align-items:stretch;gap:1rem;padding:.75rem}.condition-tree__content{display:flex;flex:1 1 auto;flex-direction:column;gap:.75rem;min-width:0}.condition-tree__remove{align-items:flex-start;align-self:stretch}.condition-tree__fields{display:flex;flex-direction:column;gap:.75rem}.condition-tree__value{width:100%}.condition-tree__mode-switch{align-self:flex-start;margin-top:.25rem}.condition-tree__nested{display:flex;flex-direction:column}.condition-tree__add{align-self:flex-start}.condition-tree .label-with-tooltip{align-items:center;display:inline-flex;gap:.25rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i3$1.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: ConditionTreeComponent, selector: "valtimo-condition-tree", inputs: ["conditions", "resourceType", "disabled", "depth"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }] }); }
1430
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ConditionTreeComponent, deps: [{ token: AccessControlFormEditorService }, { token: i2$1.IconService }], target: i0.ɵɵFactoryTarget.Component }); }
1431
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: ConditionTreeComponent, isStandalone: false, selector: "valtimo-condition-tree", inputs: { conditions: "conditions", resourceType: "resourceType", disabled: "disabled", depth: "depth" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"condition-tree\" [class.condition-tree--nested]=\"depth > 0\">\n @for (control of conditions.controls; track control; let i = $index) {\n <div class=\"condition-tree__row\" [cdsLayer]=\"rowLayerLevel\" [formGroup]=\"asFormGroup(control)\">\n <div class=\"condition-tree__content\">\n <v-select\n class=\"condition-tree__type\"\n formControlName=\"type\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionTypeSelect\"\n [defaultSelectionId]=\"typeOf(i)\"\n [dropUp]=\"false\"\n [items]=\"typeItems\"\n [tooltip]=\"'accessControl.editor.tooltips.conditionType' | translate\"\n titleTranslationKey=\"accessControl.editor.conditionType\"\n (selectedChange)=\"onTypeChange(i)\"\n ></v-select>\n\n @switch (typeOf(i)) {\n @case ('container') {\n <v-select\n formControlName=\"resourceType\"\n [cdsLayer]=\"inputLayerLevel\"\n [dataTestId]=\"testIds.conditionFieldSelect\"\n [defaultSelectionId]=\"containerResourceTypeAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['resourceTypeRequired'] &&\n !!asFormGroup(control).get('resourceType')?.touched\n \"\n [items]=\"containerTargetItems\"\n [placeholder]=\"'accessControl.editor.relatedResourcePlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.relatedResource' | translate\"\n titleTranslationKey=\"accessControl.editor.relatedResource\"\n ></v-select>\n\n <div class=\"condition-tree__nested\">\n <valtimo-condition-tree\n [conditions]=\"nestedConditions(i)\"\n [depth]=\"depth + 1\"\n [disabled]=\"disabled\"\n [resourceType]=\"containerResourceType(i)\"\n ></valtimo-condition-tree>\n </div>\n }\n\n @default {\n <div class=\"condition-tree__fields\">\n <v-select\n class=\"condition-tree__field\"\n formControlName=\"field\"\n [cdsLayer]=\"inputLayerLevel\"\n [dataTestId]=\"testIds.conditionFieldSelect\"\n [defaultSelectionId]=\"fieldValueAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['fieldRequired'] &&\n !!asFormGroup(control).get('field')?.touched\n \"\n [items]=\"fieldItems\"\n [placeholder]=\"'accessControl.editor.fieldPlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.field' | translate\"\n titleTranslationKey=\"accessControl.editor.field\"\n ></v-select>\n\n <v-select\n class=\"condition-tree__operator\"\n formControlName=\"operator\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionOperatorSelect\"\n [defaultSelectionId]=\"operatorValueAt(i)\"\n [dropUp]=\"false\"\n [items]=\"operatorItems\"\n [tooltip]=\"'accessControl.editor.tooltips.operator' | translate\"\n titleTranslationKey=\"accessControl.editor.operator\"\n ></v-select>\n\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.value' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.value' | translate\"\n ></v-tooltip-icon>\n </label>\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionValueInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['valueRequired'] &&\n !!asFormGroup(control).get('value')?.touched\n \"\n [placeholder]=\"'accessControl.editor.valuePlaceholder' | translate\"\n formControlName=\"value\"\n />\n </div>\n </div>\n\n @if (typeOf(i) === 'expression') {\n <div class=\"condition-tree__fields\">\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.path' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.path' | translate\"\n ></v-tooltip-icon>\n </label>\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionPathInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['pathRequired'] &&\n !!asFormGroup(control).get('path')?.touched\n \"\n [placeholder]=\"'accessControl.editor.pathPlaceholder' | translate\"\n formControlName=\"path\"\n />\n </div>\n\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.clazz' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.clazz' | translate\"\n ></v-tooltip-icon>\n </label>\n\n @if (clazzManualAt(i)) {\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionClazzInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['clazzRequired'] &&\n !!asFormGroup(control).get('clazz')?.touched\n \"\n [placeholder]=\"'accessControl.editor.clazzPlaceholder' | translate\"\n formControlName=\"clazz\"\n />\n } @else {\n <v-select\n formControlName=\"clazz\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionClazzInput\"\n [defaultSelectionId]=\"clazzValueAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['clazzRequired'] &&\n !!asFormGroup(control).get('clazz')?.touched\n \"\n [items]=\"valueTypeItems\"\n ></v-select>\n }\n\n <button\n class=\"condition-tree__mode-switch\"\n cdsButton=\"ghost\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onClazzManualToggle(i, !clazzManualAt(i))\"\n >\n {{\n (clazzManualAt(i)\n ? 'accessControl.editor.valueTypeFromList'\n : 'accessControl.editor.valueTypeManual'\n ) | translate\n }}\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n\n <button\n class=\"condition-tree__remove\"\n cdsButton=\"ghost\"\n [attr.data-test-id]=\"testIds.removeConditionButton\"\n [disabled]=\"disabled\"\n [iconOnly]=\"true\"\n (click)=\"removeCondition(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n }\n\n <button\n class=\"condition-tree__add\"\n cdsButton=\"ghost\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.addConditionButton\"\n [disabled]=\"disabled\"\n (click)=\"addCondition()\"\n >\n {{ 'accessControl.editor.addCondition' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</div>\n", styles: [".condition-tree{display:flex;flex-direction:column;gap:.75rem}.condition-tree v-select{display:block;width:100%}.condition-tree--nested{border-left:2px solid var(--cds-border-subtle, #c6c6c6);margin-top:.5rem;padding-left:1rem}.condition-tree__row{background-color:var(--cds-layer);border:1px solid var(--cds-border-subtle);display:flex;flex-direction:row;align-items:stretch;gap:1rem;padding:.75rem}.condition-tree__content{display:flex;flex:1 1 auto;flex-direction:column;gap:.75rem;min-width:0}.condition-tree__remove{align-items:flex-start;align-self:stretch}.condition-tree__fields{display:flex;flex-direction:column;gap:.75rem}.condition-tree__value{width:100%}.condition-tree__mode-switch{align-self:flex-start;margin-top:.25rem}.condition-tree__nested{display:flex;flex-direction:column}.condition-tree__add{align-self:flex-start}.condition-tree .label-with-tooltip{align-items:center;display:inline-flex;gap:.25rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i3$1.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: ConditionTreeComponent, selector: "valtimo-condition-tree", inputs: ["conditions", "resourceType", "disabled", "depth"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }] }); }
1432
1432
  }
1433
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ConditionTreeComponent, decorators: [{
1433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ConditionTreeComponent, decorators: [{
1434
1434
  type: Component,
1435
1435
  args: [{ standalone: false, selector: 'valtimo-condition-tree', template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"condition-tree\" [class.condition-tree--nested]=\"depth > 0\">\n @for (control of conditions.controls; track control; let i = $index) {\n <div class=\"condition-tree__row\" [cdsLayer]=\"rowLayerLevel\" [formGroup]=\"asFormGroup(control)\">\n <div class=\"condition-tree__content\">\n <v-select\n class=\"condition-tree__type\"\n formControlName=\"type\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionTypeSelect\"\n [defaultSelectionId]=\"typeOf(i)\"\n [dropUp]=\"false\"\n [items]=\"typeItems\"\n [tooltip]=\"'accessControl.editor.tooltips.conditionType' | translate\"\n titleTranslationKey=\"accessControl.editor.conditionType\"\n (selectedChange)=\"onTypeChange(i)\"\n ></v-select>\n\n @switch (typeOf(i)) {\n @case ('container') {\n <v-select\n formControlName=\"resourceType\"\n [cdsLayer]=\"inputLayerLevel\"\n [dataTestId]=\"testIds.conditionFieldSelect\"\n [defaultSelectionId]=\"containerResourceTypeAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['resourceTypeRequired'] &&\n !!asFormGroup(control).get('resourceType')?.touched\n \"\n [items]=\"containerTargetItems\"\n [placeholder]=\"'accessControl.editor.relatedResourcePlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.relatedResource' | translate\"\n titleTranslationKey=\"accessControl.editor.relatedResource\"\n ></v-select>\n\n <div class=\"condition-tree__nested\">\n <valtimo-condition-tree\n [conditions]=\"nestedConditions(i)\"\n [depth]=\"depth + 1\"\n [disabled]=\"disabled\"\n [resourceType]=\"containerResourceType(i)\"\n ></valtimo-condition-tree>\n </div>\n }\n\n @default {\n <div class=\"condition-tree__fields\">\n <v-select\n class=\"condition-tree__field\"\n formControlName=\"field\"\n [cdsLayer]=\"inputLayerLevel\"\n [dataTestId]=\"testIds.conditionFieldSelect\"\n [defaultSelectionId]=\"fieldValueAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['fieldRequired'] &&\n !!asFormGroup(control).get('field')?.touched\n \"\n [items]=\"fieldItems\"\n [placeholder]=\"'accessControl.editor.fieldPlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.field' | translate\"\n titleTranslationKey=\"accessControl.editor.field\"\n ></v-select>\n\n <v-select\n class=\"condition-tree__operator\"\n formControlName=\"operator\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionOperatorSelect\"\n [defaultSelectionId]=\"operatorValueAt(i)\"\n [dropUp]=\"false\"\n [items]=\"operatorItems\"\n [tooltip]=\"'accessControl.editor.tooltips.operator' | translate\"\n titleTranslationKey=\"accessControl.editor.operator\"\n ></v-select>\n\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.value' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.value' | translate\"\n ></v-tooltip-icon>\n </label>\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionValueInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['valueRequired'] &&\n !!asFormGroup(control).get('value')?.touched\n \"\n [placeholder]=\"'accessControl.editor.valuePlaceholder' | translate\"\n formControlName=\"value\"\n />\n </div>\n </div>\n\n @if (typeOf(i) === 'expression') {\n <div class=\"condition-tree__fields\">\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.path' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.path' | translate\"\n ></v-tooltip-icon>\n </label>\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionPathInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['pathRequired'] &&\n !!asFormGroup(control).get('path')?.touched\n \"\n [placeholder]=\"'accessControl.editor.pathPlaceholder' | translate\"\n formControlName=\"path\"\n />\n </div>\n\n <div class=\"condition-tree__value cds--form-item\" [cdsLayer]=\"inputLayerLevel\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.clazz' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.clazz' | translate\"\n ></v-tooltip-icon>\n </label>\n\n @if (clazzManualAt(i)) {\n <input\n cdsText\n [attr.data-test-id]=\"testIds.conditionClazzInput\"\n [class.cds--text-input--invalid]=\"\n !!asFormGroup(control).errors?.['clazzRequired'] &&\n !!asFormGroup(control).get('clazz')?.touched\n \"\n [placeholder]=\"'accessControl.editor.clazzPlaceholder' | translate\"\n formControlName=\"clazz\"\n />\n } @else {\n <v-select\n formControlName=\"clazz\"\n [cdsLayer]=\"inputLayerLevel\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.conditionClazzInput\"\n [defaultSelectionId]=\"clazzValueAt(i)\"\n [dropUp]=\"false\"\n [invalid]=\"\n !!asFormGroup(control).errors?.['clazzRequired'] &&\n !!asFormGroup(control).get('clazz')?.touched\n \"\n [items]=\"valueTypeItems\"\n ></v-select>\n }\n\n <button\n class=\"condition-tree__mode-switch\"\n cdsButton=\"ghost\"\n size=\"sm\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onClazzManualToggle(i, !clazzManualAt(i))\"\n >\n {{\n (clazzManualAt(i)\n ? 'accessControl.editor.valueTypeFromList'\n : 'accessControl.editor.valueTypeManual'\n ) | translate\n }}\n </button>\n </div>\n </div>\n }\n }\n }\n </div>\n\n <button\n class=\"condition-tree__remove\"\n cdsButton=\"ghost\"\n [attr.data-test-id]=\"testIds.removeConditionButton\"\n [disabled]=\"disabled\"\n [iconOnly]=\"true\"\n (click)=\"removeCondition(i)\"\n >\n <svg cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n }\n\n <button\n class=\"condition-tree__add\"\n cdsButton=\"ghost\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.addConditionButton\"\n [disabled]=\"disabled\"\n (click)=\"addCondition()\"\n >\n {{ 'accessControl.editor.addCondition' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</div>\n", styles: [".condition-tree{display:flex;flex-direction:column;gap:.75rem}.condition-tree v-select{display:block;width:100%}.condition-tree--nested{border-left:2px solid var(--cds-border-subtle, #c6c6c6);margin-top:.5rem;padding-left:1rem}.condition-tree__row{background-color:var(--cds-layer);border:1px solid var(--cds-border-subtle);display:flex;flex-direction:row;align-items:stretch;gap:1rem;padding:.75rem}.condition-tree__content{display:flex;flex:1 1 auto;flex-direction:column;gap:.75rem;min-width:0}.condition-tree__remove{align-items:flex-start;align-self:stretch}.condition-tree__fields{display:flex;flex-direction:column;gap:.75rem}.condition-tree__value{width:100%}.condition-tree__mode-switch{align-self:flex-start;margin-top:.25rem}.condition-tree__nested{display:flex;flex-direction:column}.condition-tree__add{align-self:flex-start}.condition-tree .label-with-tooltip{align-items:center;display:inline-flex;gap:.25rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1436
1436
  }], ctorParameters: () => [{ type: AccessControlFormEditorService }, { type: i2$1.IconService }], propDecorators: { conditions: [{
@@ -1471,10 +1471,10 @@ class ActionLabelPipe {
1471
1471
  const translated = this.translateService.instant(key);
1472
1472
  return translated === key ? action : translated;
1473
1473
  }
1474
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ActionLabelPipe, deps: [{ token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
1475
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: ActionLabelPipe, isStandalone: true, name: "actionLabel", pure: false }); }
1474
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ActionLabelPipe, deps: [{ token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
1475
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.25", ngImport: i0, type: ActionLabelPipe, isStandalone: true, name: "actionLabel", pure: false }); }
1476
1476
  }
1477
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ActionLabelPipe, decorators: [{
1477
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ActionLabelPipe, decorators: [{
1478
1478
  type: Pipe,
1479
1479
  args: [{
1480
1480
  standalone: true,
@@ -1512,10 +1512,10 @@ class ActionDescriptionPipe {
1512
1512
  const translated = this.translateService.instant(key);
1513
1513
  return translated === key ? '' : translated;
1514
1514
  }
1515
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ActionDescriptionPipe, deps: [{ token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
1516
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: ActionDescriptionPipe, isStandalone: true, name: "actionDescription", pure: false }); }
1515
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ActionDescriptionPipe, deps: [{ token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
1516
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.25", ngImport: i0, type: ActionDescriptionPipe, isStandalone: true, name: "actionDescription", pure: false }); }
1517
1517
  }
1518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ActionDescriptionPipe, decorators: [{
1518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ActionDescriptionPipe, decorators: [{
1519
1519
  type: Pipe,
1520
1520
  args: [{
1521
1521
  standalone: true,
@@ -1549,10 +1549,10 @@ class ActionTagTypePipe {
1549
1549
  return DEFAULT_ACTION_TAG_TYPE;
1550
1550
  return (ACTION_TAG_TYPE[action] ?? DEFAULT_ACTION_TAG_TYPE);
1551
1551
  }
1552
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ActionTagTypePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1553
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: ActionTagTypePipe, isStandalone: true, name: "actionTagType" }); }
1552
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ActionTagTypePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1553
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.25", ngImport: i0, type: ActionTagTypePipe, isStandalone: true, name: "actionTagType" }); }
1554
1554
  }
1555
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ActionTagTypePipe, decorators: [{
1555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ActionTagTypePipe, decorators: [{
1556
1556
  type: Pipe,
1557
1557
  args: [{
1558
1558
  standalone: true,
@@ -1731,10 +1731,10 @@ class PermissionFormComponent {
1731
1731
  }
1732
1732
  this.contextResourceTypeItems = this.formEditorService.containerTargetItems(this.resourceTypeValue, this.hasContextResource ? this.contextResourceTypeValue : null);
1733
1733
  }
1734
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: PermissionFormComponent, deps: [{ token: AccessControlFormEditorService }, { token: i2$1.IconService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1735
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: PermissionFormComponent, isStandalone: false, selector: "valtimo-permission-form", inputs: { group: "group", index: "index", disabled: "disabled", roleKey: "roleKey" }, outputs: { removeEvent: "removeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"permission-form\"\n [attr.data-test-id]=\"testIds.permissionCard\"\n [cdsLayer]=\"0\"\n [formGroup]=\"group\"\n>\n @if ($loading()) {\n <div class=\"permission-form__loading\">\n <cds-loading [isActive]=\"true\" [overlay]=\"false\" size=\"sm\"></cds-loading>\n </div>\n }\n\n <div class=\"permission-form__body\" [class.permission-form__body--hidden]=\"$loading()\">\n <!-- Header block: the permission preview followed by an editor-level note, separated from the\n editable sections below by a subtle divider. -->\n <div class=\"permission-form__header\">\n <!-- A larger preview of the permission (the same information shown in the sidebar list), so\n the rule being edited is recognisable at the top of the panel. The full resource type is\n shown here (the sidebar only shows the short name). -->\n <div class=\"permission-form__preview\">\n <div class=\"permission-form__preview-heading\">\n <h4 class=\"permission-form__preview-title\">\n @if (resourceTypeValue) {\n {{ resourceShortName }}\n } @else {\n {{ 'accessControl.editor.newPermission' | translate }}\n }\n </h4>\n\n @if (resourceTypeValue) {\n <span class=\"permission-form__preview-subtitle\">{{ resourceTypeValue }}</span>\n }\n </div>\n\n @if (conditionsArray.length || hasContext) {\n <div class=\"permission-form__preview-row\">\n <span class=\"permission-form__preview-label\">{{\n 'accessControl.editor.preview.includes' | translate\n }}</span>\n\n @if (conditionsArray.length) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasConditions' | translate\n }}</cds-tag>\n }\n @if (hasContext) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasContext' | translate\n }}</cds-tag>\n }\n </div>\n }\n\n @if (selectedActions.length) {\n <div class=\"permission-form__preview-row\">\n <span class=\"permission-form__preview-label\">{{\n 'accessControl.editor.preview.actions' | translate\n }}</span>\n\n @for (action of selectedActions; track action) {\n <cds-tag size=\"sm\" [type]=\"action | actionTagType\">{{\n action | actionLabel\n }}</cds-tag>\n }\n </div>\n }\n </div>\n\n <!-- Editor-level note: applies to the role selected on this page, and only system-supported\n options can be selected. -->\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {\n $implicit: resourceShortName\n ? ('accessControl.editor.permissionsHint'\n | translate: {resource: resourceShortName, role: roleKey})\n : ('accessControl.editor.permissionsHintNew' | translate: {role: roleKey}),\n }\n \"\n ></ng-container>\n </div>\n\n <cds-accordion class=\"permission-form__accordion\">\n <cds-accordion-item\n [expanded]=\"$openSection() === 'resourceActions'\"\n [title]=\"'accessControl.editor.resourceAndActions' | translate\"\n (selected)=\"onSectionToggle('resourceActions', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.resourceActionsHint' | translate}\n \"\n ></ng-container>\n\n <div class=\"permission-form__row\">\n <v-select\n class=\"permission-form__resource-type\"\n formControlName=\"resourceType\"\n [cdsLayer]=\"1\"\n [dataTestId]=\"testIds.resourceTypeSelect\"\n [defaultSelectionId]=\"resourceTypeValue\"\n [dropUp]=\"false\"\n [invalid]=\"group.get('resourceType')!.invalid && group.get('resourceType')!.touched\"\n [items]=\"resourceTypeItems\"\n [placeholder]=\"'accessControl.editor.resourceTypePlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.resourceType' | translate\"\n titleTranslationKey=\"accessControl.editor.resourceType\"\n ></v-select>\n\n <div class=\"permission-form__actions-field\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.actions' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.actions' | translate\"\n ></v-tooltip-icon>\n </label>\n\n @if (actionItems.length) {\n <div\n class=\"permission-form__actions-grid\"\n [attr.data-test-id]=\"testIds.actionsSelect\"\n [class.permission-form__actions-grid--invalid]=\"\n actionsControl.invalid && actionsControl.touched\n \"\n >\n @for (item of actionItems; track item.id) {\n <div class=\"permission-form__action\">\n <cds-checkbox\n [checked]=\"selectedActions.includes(item.id)\"\n [disabled]=\"disabled\"\n (checkedChange)=\"onActionToggle(item.id, $event)\"\n >\n {{ item.id | actionLabel }}\n </cds-checkbox>\n\n @if (item.id | actionDescription; as description) {\n <v-tooltip-icon [tooltip]=\"description\"></v-tooltip-icon>\n }\n </div>\n }\n </div>\n } @else {\n <p class=\"permission-form__hint\">\n {{ 'accessControl.editor.noActions' | translate }}\n </p>\n }\n </div>\n </div>\n </div>\n </cds-accordion-item>\n\n <cds-accordion-item\n [class.permission-form__section-configured]=\"conditionsArray.length > 0\"\n [expanded]=\"$openSection() === 'conditions'\"\n [title]=\"'accessControl.editor.conditions' | translate\"\n (selected)=\"onSectionToggle('conditions', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.conditionsHint' | translate}\n \"\n ></ng-container>\n\n <valtimo-condition-tree\n [conditions]=\"conditionsArray\"\n [disabled]=\"disabled\"\n [resourceType]=\"resourceTypeValue\"\n ></valtimo-condition-tree>\n </div>\n </cds-accordion-item>\n\n <cds-accordion-item\n [class.permission-form__section-configured]=\"hasContext\"\n [expanded]=\"$openSection() === 'context'\"\n [title]=\"'accessControl.editor.contextSection' | translate\"\n (selected)=\"onSectionToggle('context', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.contextHint' | translate}\n \"\n ></ng-container>\n\n <cds-content-switcher\n class=\"permission-form__context-switcher\"\n [attr.data-test-id]=\"testIds.contextToggle\"\n [class.permission-form__context-switcher--disabled]=\"disabled\"\n size=\"sm\"\n >\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'none'\"\n (selected)=\"onContextModeChange('none')\"\n >\n {{ 'accessControl.editor.contextModeNone' | translate }}\n </button>\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'noContext'\"\n (selected)=\"onContextModeChange('noContext')\"\n >\n {{ 'accessControl.editor.contextModeNoContext' | translate }}\n </button>\n @if (hasContextTargets) {\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'specific'\"\n (selected)=\"onContextModeChange('specific')\"\n >\n {{ 'accessControl.editor.contextModeSpecific' | translate }}\n </button>\n }\n </cds-content-switcher>\n\n @switch (contextMode) {\n @case ('noContext') {\n <cds-inline-notification\n class=\"permission-form__notification\"\n [notificationObj]=\"{\n type: 'info',\n message: 'accessControl.editor.noContextHint' | translate,\n lowContrast: true,\n showClose: false,\n }\"\n ></cds-inline-notification>\n }\n @case ('specific') {\n <v-select\n class=\"permission-form__resource-type\"\n formControlName=\"contextResourceType\"\n [cdsLayer]=\"1\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.contextResourceTypeSelect\"\n [defaultSelectionId]=\"contextResourceTypeValue || ''\"\n [dropUp]=\"false\"\n [items]=\"contextResourceTypeItems\"\n [placeholder]=\"'accessControl.editor.contextResourceTypePlaceholder' | translate\"\n [tooltip]=\"'accessControl.editor.tooltips.contextResourceType' | translate\"\n titleTranslationKey=\"accessControl.editor.contextResourceType\"\n ></v-select>\n\n <valtimo-condition-tree\n [conditions]=\"contextConditionsArray\"\n [disabled]=\"disabled\"\n [resourceType]=\"contextResourceTypeValue\"\n ></valtimo-condition-tree>\n }\n }\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <div class=\"permission-form__footer\">\n <button\n cdsButton=\"danger--ghost\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.removePermissionButton\"\n [disabled]=\"disabled\"\n (click)=\"openRemoveModal()\"\n >\n {{ 'accessControl.editor.removePermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"accessControl.editor.removePermission\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"accessControl.editor.removePermissionModal.content\"\n titleTranslationKey=\"accessControl.editor.removePermissionModal.title\"\n [showModalSubject$]=\"showRemoveModal$\"\n (confirmEvent)=\"onRemove()\"\n ></valtimo-confirmation-modal>\n\n <!-- Lightweight inline hint: a blue information icon with italic secondary text. The message is\n passed in via context so the icon and styling are defined in a single place. -->\n <ng-template #infoNote let-message>\n <p class=\"permission-form__info-note\">\n <svg class=\"permission-form__info-icon\" cdsIcon=\"information\" size=\"16\"></svg>\n\n <span>{{ message }}</span>\n </p>\n </ng-template>\n</div>\n", styles: [".permission-form{display:flex;flex-direction:column}.permission-form v-select{display:block;width:100%}.permission-form__loading{align-items:center;display:flex;justify-content:center;padding:1.5rem 0}.permission-form__body{display:flex;flex-direction:column;gap:1rem}.permission-form__body--hidden{display:none}.permission-form__accordion{width:100%}.permission-form__header{border-bottom:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex-direction:column;gap:1rem;padding-bottom:1.5rem}.permission-form__preview{display:flex;flex-direction:column;gap:.5rem}.permission-form__preview-heading{display:flex;flex-direction:column;gap:.125rem}.permission-form__preview-title{font-size:1.25rem;font-weight:400;line-height:1.4;margin:0;overflow-wrap:anywhere}.permission-form__preview-subtitle{color:var(--cds-text-secondary, #525252);font-size:.75rem;font-weight:400;line-height:1.34;overflow-wrap:anywhere}.permission-form__preview-row{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.permission-form__preview-row ::ng-deep .cds--tag{margin:0;max-width:none}.permission-form__preview-label{color:var(--cds-text-secondary, #525252);font-size:.875rem;font-weight:600;padding-right:.5rem}.permission-form__row{display:flex;flex-direction:column;gap:1rem}.permission-form__context-switcher{display:block;width:100%}.permission-form__context-switcher--disabled{opacity:.5;pointer-events:none}.permission-form__actions-field{display:flex;flex-direction:column;gap:.5rem}.permission-form__actions-grid{display:grid;gap:.25rem 1rem;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr))}.permission-form__actions-grid--invalid{border-left:2px solid var(--cds-support-error, #da1e28);margin-left:-.75rem;padding-left:calc(.75rem - 2px)}.permission-form__action{align-items:center;display:flex;gap:.25rem}.permission-form .label-with-tooltip{align-items:center;display:inline-flex;gap:.25rem}.permission-form__section{display:flex;flex-direction:column;gap:.75rem}.permission-form__hint{color:var(--cds-text-secondary, #525252);font-size:.875rem;margin:0}.permission-form__info-note{align-items:flex-start;color:var(--cds-text-secondary, #525252);display:flex;font-size:.875rem;gap:.375rem;line-height:1.34;margin-bottom:8px}.permission-form__info-icon{color:var(--cds-support-info, #0043ce);flex-shrink:0;margin-top:.0625rem}.permission-form__footer{display:flex;justify-content:flex-end;padding-top:.25rem}:host ::ng-deep .permission-form__accordion .cds--accordion__item:first-of-type{border-top:0}:host ::ng-deep .permission-form__accordion .cds--accordion__content{padding:1rem 1rem 1.5rem}:host ::ng-deep .permission-form__accordion .permission-form__section-configured .cds--accordion__title:after{background:var(--cds-support-info, #0043ce);border-radius:50%;content:\"\";display:inline-block;height:.5rem;margin-left:.5rem;vertical-align:middle;width:.5rem}:host ::ng-deep .permission-form__notification.cds--inline-notification{inline-size:100%;margin-block-end:0;max-inline-size:100%;min-inline-size:0}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3$1.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "component", type: i2$1.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i2$1.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: i3$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i3$1.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i2$1.ContentSwitcher, selector: "cds-content-switcher, ibm-content-switcher", inputs: ["ariaLabel", "size"], outputs: ["selected"] }, { kind: "directive", type: i2$1.ContentSwitcherOption, selector: "[cdsContentOption], [ibmContentOption]", inputs: ["active", "name"], outputs: ["selected", "onClick", "onFocus"] }, { kind: "component", type: i2$1.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i2$1.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "component", type: i2$1.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: i2$1.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: ConditionTreeComponent, selector: "valtimo-condition-tree", inputs: ["conditions", "resourceType", "disabled", "depth"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }, { kind: "pipe", type: ActionDescriptionPipe, name: "actionDescription" }, { kind: "pipe", type: ActionTagTypePipe, name: "actionTagType" }] }); }
1734
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PermissionFormComponent, deps: [{ token: AccessControlFormEditorService }, { token: i2$1.IconService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1735
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: PermissionFormComponent, isStandalone: false, selector: "valtimo-permission-form", inputs: { group: "group", index: "index", disabled: "disabled", roleKey: "roleKey" }, outputs: { removeEvent: "removeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"permission-form\"\n [attr.data-test-id]=\"testIds.permissionCard\"\n [cdsLayer]=\"0\"\n [formGroup]=\"group\"\n>\n @if ($loading()) {\n <div class=\"permission-form__loading\">\n <cds-loading [isActive]=\"true\" [overlay]=\"false\" size=\"sm\"></cds-loading>\n </div>\n }\n\n <div class=\"permission-form__body\" [class.permission-form__body--hidden]=\"$loading()\">\n <!-- Header block: the permission preview followed by an editor-level note, separated from the\n editable sections below by a subtle divider. -->\n <div class=\"permission-form__header\">\n <!-- A larger preview of the permission (the same information shown in the sidebar list), so\n the rule being edited is recognisable at the top of the panel. The full resource type is\n shown here (the sidebar only shows the short name). -->\n <div class=\"permission-form__preview\">\n <div class=\"permission-form__preview-heading\">\n <h4 class=\"permission-form__preview-title\">\n @if (resourceTypeValue) {\n {{ resourceShortName }}\n } @else {\n {{ 'accessControl.editor.newPermission' | translate }}\n }\n </h4>\n\n @if (resourceTypeValue) {\n <span class=\"permission-form__preview-subtitle\">{{ resourceTypeValue }}</span>\n }\n </div>\n\n @if (conditionsArray.length || hasContext) {\n <div class=\"permission-form__preview-row\">\n <span class=\"permission-form__preview-label\">{{\n 'accessControl.editor.preview.includes' | translate\n }}</span>\n\n @if (conditionsArray.length) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasConditions' | translate\n }}</cds-tag>\n }\n @if (hasContext) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasContext' | translate\n }}</cds-tag>\n }\n </div>\n }\n\n @if (selectedActions.length) {\n <div class=\"permission-form__preview-row\">\n <span class=\"permission-form__preview-label\">{{\n 'accessControl.editor.preview.actions' | translate\n }}</span>\n\n @for (action of selectedActions; track action) {\n <cds-tag size=\"sm\" [type]=\"action | actionTagType\">{{\n action | actionLabel\n }}</cds-tag>\n }\n </div>\n }\n </div>\n\n <!-- Editor-level note: applies to the role selected on this page, and only system-supported\n options can be selected. -->\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {\n $implicit: resourceShortName\n ? ('accessControl.editor.permissionsHint'\n | translate: {resource: resourceShortName, role: roleKey})\n : ('accessControl.editor.permissionsHintNew' | translate: {role: roleKey}),\n }\n \"\n ></ng-container>\n </div>\n\n <cds-accordion class=\"permission-form__accordion\">\n <cds-accordion-item\n [expanded]=\"$openSection() === 'resourceActions'\"\n [title]=\"'accessControl.editor.resourceAndActions' | translate\"\n (selected)=\"onSectionToggle('resourceActions', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.resourceActionsHint' | translate}\n \"\n ></ng-container>\n\n <div class=\"permission-form__row\">\n <v-select\n class=\"permission-form__resource-type\"\n formControlName=\"resourceType\"\n [cdsLayer]=\"1\"\n [dataTestId]=\"testIds.resourceTypeSelect\"\n [defaultSelectionId]=\"resourceTypeValue\"\n [dropUp]=\"false\"\n [invalid]=\"group.get('resourceType')!.invalid && group.get('resourceType')!.touched\"\n [items]=\"resourceTypeItems\"\n [placeholder]=\"'accessControl.editor.resourceTypePlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.resourceType' | translate\"\n titleTranslationKey=\"accessControl.editor.resourceType\"\n ></v-select>\n\n <div class=\"permission-form__actions-field\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.actions' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.actions' | translate\"\n ></v-tooltip-icon>\n </label>\n\n @if (actionItems.length) {\n <div\n class=\"permission-form__actions-grid\"\n [attr.data-test-id]=\"testIds.actionsSelect\"\n [class.permission-form__actions-grid--invalid]=\"\n actionsControl.invalid && actionsControl.touched\n \"\n >\n @for (item of actionItems; track item.id) {\n <div class=\"permission-form__action\">\n <cds-checkbox\n [checked]=\"selectedActions.includes(item.id)\"\n [disabled]=\"disabled\"\n (checkedChange)=\"onActionToggle(item.id, $event)\"\n >\n {{ item.id | actionLabel }}\n </cds-checkbox>\n\n @if (item.id | actionDescription; as description) {\n <v-tooltip-icon [tooltip]=\"description\"></v-tooltip-icon>\n }\n </div>\n }\n </div>\n } @else {\n <p class=\"permission-form__hint\">\n {{ 'accessControl.editor.noActions' | translate }}\n </p>\n }\n </div>\n </div>\n </div>\n </cds-accordion-item>\n\n <cds-accordion-item\n [class.permission-form__section-configured]=\"conditionsArray.length > 0\"\n [expanded]=\"$openSection() === 'conditions'\"\n [title]=\"'accessControl.editor.conditions' | translate\"\n (selected)=\"onSectionToggle('conditions', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.conditionsHint' | translate}\n \"\n ></ng-container>\n\n <valtimo-condition-tree\n [conditions]=\"conditionsArray\"\n [disabled]=\"disabled\"\n [resourceType]=\"resourceTypeValue\"\n ></valtimo-condition-tree>\n </div>\n </cds-accordion-item>\n\n <cds-accordion-item\n [class.permission-form__section-configured]=\"hasContext\"\n [expanded]=\"$openSection() === 'context'\"\n [title]=\"'accessControl.editor.contextSection' | translate\"\n (selected)=\"onSectionToggle('context', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.contextHint' | translate}\n \"\n ></ng-container>\n\n <cds-content-switcher\n class=\"permission-form__context-switcher\"\n [attr.data-test-id]=\"testIds.contextToggle\"\n [class.permission-form__context-switcher--disabled]=\"disabled\"\n size=\"sm\"\n >\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'none'\"\n (selected)=\"onContextModeChange('none')\"\n >\n {{ 'accessControl.editor.contextModeNone' | translate }}\n </button>\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'noContext'\"\n (selected)=\"onContextModeChange('noContext')\"\n >\n {{ 'accessControl.editor.contextModeNoContext' | translate }}\n </button>\n @if (hasContextTargets) {\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'specific'\"\n (selected)=\"onContextModeChange('specific')\"\n >\n {{ 'accessControl.editor.contextModeSpecific' | translate }}\n </button>\n }\n </cds-content-switcher>\n\n @switch (contextMode) {\n @case ('noContext') {\n <cds-inline-notification\n class=\"permission-form__notification\"\n [notificationObj]=\"{\n type: 'info',\n message: 'accessControl.editor.noContextHint' | translate,\n lowContrast: true,\n showClose: false,\n }\"\n ></cds-inline-notification>\n }\n @case ('specific') {\n <v-select\n class=\"permission-form__resource-type\"\n formControlName=\"contextResourceType\"\n [cdsLayer]=\"1\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.contextResourceTypeSelect\"\n [defaultSelectionId]=\"contextResourceTypeValue || ''\"\n [dropUp]=\"false\"\n [items]=\"contextResourceTypeItems\"\n [placeholder]=\"'accessControl.editor.contextResourceTypePlaceholder' | translate\"\n [tooltip]=\"'accessControl.editor.tooltips.contextResourceType' | translate\"\n titleTranslationKey=\"accessControl.editor.contextResourceType\"\n ></v-select>\n\n <valtimo-condition-tree\n [conditions]=\"contextConditionsArray\"\n [disabled]=\"disabled\"\n [resourceType]=\"contextResourceTypeValue\"\n ></valtimo-condition-tree>\n }\n }\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <div class=\"permission-form__footer\">\n <button\n cdsButton=\"danger--ghost\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.removePermissionButton\"\n [disabled]=\"disabled\"\n (click)=\"openRemoveModal()\"\n >\n {{ 'accessControl.editor.removePermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"accessControl.editor.removePermission\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"accessControl.editor.removePermissionModal.content\"\n titleTranslationKey=\"accessControl.editor.removePermissionModal.title\"\n [showModalSubject$]=\"showRemoveModal$\"\n (confirmEvent)=\"onRemove()\"\n ></valtimo-confirmation-modal>\n\n <!-- Lightweight inline hint: a blue information icon with italic secondary text. The message is\n passed in via context so the icon and styling are defined in a single place. -->\n <ng-template #infoNote let-message>\n <p class=\"permission-form__info-note\">\n <svg class=\"permission-form__info-icon\" cdsIcon=\"information\" size=\"16\"></svg>\n\n <span>{{ message }}</span>\n </p>\n </ng-template>\n</div>\n", styles: [".permission-form{display:flex;flex-direction:column}.permission-form v-select{display:block;width:100%}.permission-form__loading{align-items:center;display:flex;justify-content:center;padding:1.5rem 0}.permission-form__body{display:flex;flex-direction:column;gap:1rem}.permission-form__body--hidden{display:none}.permission-form__accordion{width:100%}.permission-form__header{border-bottom:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex-direction:column;gap:1rem;padding-bottom:1.5rem}.permission-form__preview{display:flex;flex-direction:column;gap:.5rem}.permission-form__preview-heading{display:flex;flex-direction:column;gap:.125rem}.permission-form__preview-title{font-size:1.25rem;font-weight:400;line-height:1.4;margin:0;overflow-wrap:anywhere}.permission-form__preview-subtitle{color:var(--cds-text-secondary, #525252);font-size:.75rem;font-weight:400;line-height:1.34;overflow-wrap:anywhere}.permission-form__preview-row{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.permission-form__preview-row ::ng-deep .cds--tag{margin:0;max-width:none}.permission-form__preview-label{color:var(--cds-text-secondary, #525252);font-size:.875rem;font-weight:600;padding-right:.5rem}.permission-form__row{display:flex;flex-direction:column;gap:1rem}.permission-form__context-switcher{display:block;width:100%}.permission-form__context-switcher--disabled{opacity:.5;pointer-events:none}.permission-form__actions-field{display:flex;flex-direction:column;gap:.5rem}.permission-form__actions-grid{display:grid;gap:.25rem 1rem;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr))}.permission-form__actions-grid--invalid{border-left:2px solid var(--cds-support-error, #da1e28);margin-left:-.75rem;padding-left:calc(.75rem - 2px)}.permission-form__action{align-items:center;display:flex;gap:.25rem}.permission-form .label-with-tooltip{align-items:center;display:inline-flex;gap:.25rem}.permission-form__section{display:flex;flex-direction:column;gap:.75rem}.permission-form__hint{color:var(--cds-text-secondary, #525252);font-size:.875rem;margin:0}.permission-form__info-note{align-items:flex-start;color:var(--cds-text-secondary, #525252);display:flex;font-size:.875rem;gap:.375rem;line-height:1.34;margin-bottom:8px}.permission-form__info-icon{color:var(--cds-support-info, #0043ce);flex-shrink:0;margin-top:.0625rem}.permission-form__footer{display:flex;justify-content:flex-end;padding-top:.25rem}:host ::ng-deep .permission-form__accordion .cds--accordion__item:first-of-type{border-top:0}:host ::ng-deep .permission-form__accordion .cds--accordion__content{padding:1rem 1rem 1.5rem}:host ::ng-deep .permission-form__accordion .permission-form__section-configured .cds--accordion__title:after{background:var(--cds-support-info, #0043ce);border-radius:50%;content:\"\";display:inline-block;height:.5rem;margin-left:.5rem;vertical-align:middle;width:.5rem}:host ::ng-deep .permission-form__notification.cds--inline-notification{inline-size:100%;margin-block-end:0;max-inline-size:100%;min-inline-size:0}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3$1.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "component", type: i2$1.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i2$1.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: i3$1.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "dropUp", "invalid", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "clearable", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme", "appendInline", "warn", "warnText", "dataTestId"], outputs: ["selectedChange"] }, { kind: "component", type: i3$1.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i2$1.ContentSwitcher, selector: "cds-content-switcher, ibm-content-switcher", inputs: ["ariaLabel", "size"], outputs: ["selected"] }, { kind: "directive", type: i2$1.ContentSwitcherOption, selector: "[cdsContentOption], [ibmContentOption]", inputs: ["active", "name"], outputs: ["selected", "onClick", "onFocus"] }, { kind: "component", type: i2$1.Accordion, selector: "cds-accordion, ibm-accordion", inputs: ["align", "size", "skeleton"] }, { kind: "component", type: i2$1.AccordionItem, selector: "cds-accordion-item, ibm-accordion-item", inputs: ["title", "context", "id", "skeleton", "expanded", "disabled"], outputs: ["selected"] }, { kind: "component", type: i2$1.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "directive", type: i2$1.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "component", type: i2$1.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: ConditionTreeComponent, selector: "valtimo-condition-tree", inputs: ["conditions", "resourceType", "disabled", "depth"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }, { kind: "pipe", type: ActionDescriptionPipe, name: "actionDescription" }, { kind: "pipe", type: ActionTagTypePipe, name: "actionTagType" }] }); }
1736
1736
  }
1737
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: PermissionFormComponent, decorators: [{
1737
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PermissionFormComponent, decorators: [{
1738
1738
  type: Component,
1739
1739
  args: [{ standalone: false, selector: 'valtimo-permission-form', template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"permission-form\"\n [attr.data-test-id]=\"testIds.permissionCard\"\n [cdsLayer]=\"0\"\n [formGroup]=\"group\"\n>\n @if ($loading()) {\n <div class=\"permission-form__loading\">\n <cds-loading [isActive]=\"true\" [overlay]=\"false\" size=\"sm\"></cds-loading>\n </div>\n }\n\n <div class=\"permission-form__body\" [class.permission-form__body--hidden]=\"$loading()\">\n <!-- Header block: the permission preview followed by an editor-level note, separated from the\n editable sections below by a subtle divider. -->\n <div class=\"permission-form__header\">\n <!-- A larger preview of the permission (the same information shown in the sidebar list), so\n the rule being edited is recognisable at the top of the panel. The full resource type is\n shown here (the sidebar only shows the short name). -->\n <div class=\"permission-form__preview\">\n <div class=\"permission-form__preview-heading\">\n <h4 class=\"permission-form__preview-title\">\n @if (resourceTypeValue) {\n {{ resourceShortName }}\n } @else {\n {{ 'accessControl.editor.newPermission' | translate }}\n }\n </h4>\n\n @if (resourceTypeValue) {\n <span class=\"permission-form__preview-subtitle\">{{ resourceTypeValue }}</span>\n }\n </div>\n\n @if (conditionsArray.length || hasContext) {\n <div class=\"permission-form__preview-row\">\n <span class=\"permission-form__preview-label\">{{\n 'accessControl.editor.preview.includes' | translate\n }}</span>\n\n @if (conditionsArray.length) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasConditions' | translate\n }}</cds-tag>\n }\n @if (hasContext) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasContext' | translate\n }}</cds-tag>\n }\n </div>\n }\n\n @if (selectedActions.length) {\n <div class=\"permission-form__preview-row\">\n <span class=\"permission-form__preview-label\">{{\n 'accessControl.editor.preview.actions' | translate\n }}</span>\n\n @for (action of selectedActions; track action) {\n <cds-tag size=\"sm\" [type]=\"action | actionTagType\">{{\n action | actionLabel\n }}</cds-tag>\n }\n </div>\n }\n </div>\n\n <!-- Editor-level note: applies to the role selected on this page, and only system-supported\n options can be selected. -->\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {\n $implicit: resourceShortName\n ? ('accessControl.editor.permissionsHint'\n | translate: {resource: resourceShortName, role: roleKey})\n : ('accessControl.editor.permissionsHintNew' | translate: {role: roleKey}),\n }\n \"\n ></ng-container>\n </div>\n\n <cds-accordion class=\"permission-form__accordion\">\n <cds-accordion-item\n [expanded]=\"$openSection() === 'resourceActions'\"\n [title]=\"'accessControl.editor.resourceAndActions' | translate\"\n (selected)=\"onSectionToggle('resourceActions', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.resourceActionsHint' | translate}\n \"\n ></ng-container>\n\n <div class=\"permission-form__row\">\n <v-select\n class=\"permission-form__resource-type\"\n formControlName=\"resourceType\"\n [cdsLayer]=\"1\"\n [dataTestId]=\"testIds.resourceTypeSelect\"\n [defaultSelectionId]=\"resourceTypeValue\"\n [dropUp]=\"false\"\n [invalid]=\"group.get('resourceType')!.invalid && group.get('resourceType')!.touched\"\n [items]=\"resourceTypeItems\"\n [placeholder]=\"'accessControl.editor.resourceTypePlaceholder' | translate\"\n [required]=\"true\"\n [tooltip]=\"'accessControl.editor.tooltips.resourceType' | translate\"\n titleTranslationKey=\"accessControl.editor.resourceType\"\n ></v-select>\n\n <div class=\"permission-form__actions-field\">\n <label class=\"cds--label label-with-tooltip\">\n {{ 'accessControl.editor.actions' | translate }} ({{\n 'interface.required' | translate\n }})\n <v-tooltip-icon\n [tooltip]=\"'accessControl.editor.tooltips.actions' | translate\"\n ></v-tooltip-icon>\n </label>\n\n @if (actionItems.length) {\n <div\n class=\"permission-form__actions-grid\"\n [attr.data-test-id]=\"testIds.actionsSelect\"\n [class.permission-form__actions-grid--invalid]=\"\n actionsControl.invalid && actionsControl.touched\n \"\n >\n @for (item of actionItems; track item.id) {\n <div class=\"permission-form__action\">\n <cds-checkbox\n [checked]=\"selectedActions.includes(item.id)\"\n [disabled]=\"disabled\"\n (checkedChange)=\"onActionToggle(item.id, $event)\"\n >\n {{ item.id | actionLabel }}\n </cds-checkbox>\n\n @if (item.id | actionDescription; as description) {\n <v-tooltip-icon [tooltip]=\"description\"></v-tooltip-icon>\n }\n </div>\n }\n </div>\n } @else {\n <p class=\"permission-form__hint\">\n {{ 'accessControl.editor.noActions' | translate }}\n </p>\n }\n </div>\n </div>\n </div>\n </cds-accordion-item>\n\n <cds-accordion-item\n [class.permission-form__section-configured]=\"conditionsArray.length > 0\"\n [expanded]=\"$openSection() === 'conditions'\"\n [title]=\"'accessControl.editor.conditions' | translate\"\n (selected)=\"onSectionToggle('conditions', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.conditionsHint' | translate}\n \"\n ></ng-container>\n\n <valtimo-condition-tree\n [conditions]=\"conditionsArray\"\n [disabled]=\"disabled\"\n [resourceType]=\"resourceTypeValue\"\n ></valtimo-condition-tree>\n </div>\n </cds-accordion-item>\n\n <cds-accordion-item\n [class.permission-form__section-configured]=\"hasContext\"\n [expanded]=\"$openSection() === 'context'\"\n [title]=\"'accessControl.editor.contextSection' | translate\"\n (selected)=\"onSectionToggle('context', $event)\"\n >\n <div class=\"permission-form__section\">\n <ng-container\n *ngTemplateOutlet=\"\n infoNote;\n context: {$implicit: 'accessControl.editor.contextHint' | translate}\n \"\n ></ng-container>\n\n <cds-content-switcher\n class=\"permission-form__context-switcher\"\n [attr.data-test-id]=\"testIds.contextToggle\"\n [class.permission-form__context-switcher--disabled]=\"disabled\"\n size=\"sm\"\n >\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'none'\"\n (selected)=\"onContextModeChange('none')\"\n >\n {{ 'accessControl.editor.contextModeNone' | translate }}\n </button>\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'noContext'\"\n (selected)=\"onContextModeChange('noContext')\"\n >\n {{ 'accessControl.editor.contextModeNoContext' | translate }}\n </button>\n @if (hasContextTargets) {\n <button\n cdsContentOption\n type=\"button\"\n [active]=\"contextMode === 'specific'\"\n (selected)=\"onContextModeChange('specific')\"\n >\n {{ 'accessControl.editor.contextModeSpecific' | translate }}\n </button>\n }\n </cds-content-switcher>\n\n @switch (contextMode) {\n @case ('noContext') {\n <cds-inline-notification\n class=\"permission-form__notification\"\n [notificationObj]=\"{\n type: 'info',\n message: 'accessControl.editor.noContextHint' | translate,\n lowContrast: true,\n showClose: false,\n }\"\n ></cds-inline-notification>\n }\n @case ('specific') {\n <v-select\n class=\"permission-form__resource-type\"\n formControlName=\"contextResourceType\"\n [cdsLayer]=\"1\"\n [clearable]=\"false\"\n [dataTestId]=\"testIds.contextResourceTypeSelect\"\n [defaultSelectionId]=\"contextResourceTypeValue || ''\"\n [dropUp]=\"false\"\n [items]=\"contextResourceTypeItems\"\n [placeholder]=\"'accessControl.editor.contextResourceTypePlaceholder' | translate\"\n [tooltip]=\"'accessControl.editor.tooltips.contextResourceType' | translate\"\n titleTranslationKey=\"accessControl.editor.contextResourceType\"\n ></v-select>\n\n <valtimo-condition-tree\n [conditions]=\"contextConditionsArray\"\n [disabled]=\"disabled\"\n [resourceType]=\"contextResourceTypeValue\"\n ></valtimo-condition-tree>\n }\n }\n </div>\n </cds-accordion-item>\n </cds-accordion>\n\n <div class=\"permission-form__footer\">\n <button\n cdsButton=\"danger--ghost\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.removePermissionButton\"\n [disabled]=\"disabled\"\n (click)=\"openRemoveModal()\"\n >\n {{ 'accessControl.editor.removePermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </div>\n </div>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"accessControl.editor.removePermission\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"accessControl.editor.removePermissionModal.content\"\n titleTranslationKey=\"accessControl.editor.removePermissionModal.title\"\n [showModalSubject$]=\"showRemoveModal$\"\n (confirmEvent)=\"onRemove()\"\n ></valtimo-confirmation-modal>\n\n <!-- Lightweight inline hint: a blue information icon with italic secondary text. The message is\n passed in via context so the icon and styling are defined in a single place. -->\n <ng-template #infoNote let-message>\n <p class=\"permission-form__info-note\">\n <svg class=\"permission-form__info-icon\" cdsIcon=\"information\" size=\"16\"></svg>\n\n <span>{{ message }}</span>\n </p>\n </ng-template>\n</div>\n", styles: [".permission-form{display:flex;flex-direction:column}.permission-form v-select{display:block;width:100%}.permission-form__loading{align-items:center;display:flex;justify-content:center;padding:1.5rem 0}.permission-form__body{display:flex;flex-direction:column;gap:1rem}.permission-form__body--hidden{display:none}.permission-form__accordion{width:100%}.permission-form__header{border-bottom:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex-direction:column;gap:1rem;padding-bottom:1.5rem}.permission-form__preview{display:flex;flex-direction:column;gap:.5rem}.permission-form__preview-heading{display:flex;flex-direction:column;gap:.125rem}.permission-form__preview-title{font-size:1.25rem;font-weight:400;line-height:1.4;margin:0;overflow-wrap:anywhere}.permission-form__preview-subtitle{color:var(--cds-text-secondary, #525252);font-size:.75rem;font-weight:400;line-height:1.34;overflow-wrap:anywhere}.permission-form__preview-row{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.permission-form__preview-row ::ng-deep .cds--tag{margin:0;max-width:none}.permission-form__preview-label{color:var(--cds-text-secondary, #525252);font-size:.875rem;font-weight:600;padding-right:.5rem}.permission-form__row{display:flex;flex-direction:column;gap:1rem}.permission-form__context-switcher{display:block;width:100%}.permission-form__context-switcher--disabled{opacity:.5;pointer-events:none}.permission-form__actions-field{display:flex;flex-direction:column;gap:.5rem}.permission-form__actions-grid{display:grid;gap:.25rem 1rem;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr))}.permission-form__actions-grid--invalid{border-left:2px solid var(--cds-support-error, #da1e28);margin-left:-.75rem;padding-left:calc(.75rem - 2px)}.permission-form__action{align-items:center;display:flex;gap:.25rem}.permission-form .label-with-tooltip{align-items:center;display:inline-flex;gap:.25rem}.permission-form__section{display:flex;flex-direction:column;gap:.75rem}.permission-form__hint{color:var(--cds-text-secondary, #525252);font-size:.875rem;margin:0}.permission-form__info-note{align-items:flex-start;color:var(--cds-text-secondary, #525252);display:flex;font-size:.875rem;gap:.375rem;line-height:1.34;margin-bottom:8px}.permission-form__info-icon{color:var(--cds-support-info, #0043ce);flex-shrink:0;margin-top:.0625rem}.permission-form__footer{display:flex;justify-content:flex-end;padding-top:.25rem}:host ::ng-deep .permission-form__accordion .cds--accordion__item:first-of-type{border-top:0}:host ::ng-deep .permission-form__accordion .cds--accordion__content{padding:1rem 1rem 1.5rem}:host ::ng-deep .permission-form__accordion .permission-form__section-configured .cds--accordion__title:after{background:var(--cds-support-info, #0043ce);border-radius:50%;content:\"\";display:inline-block;height:.5rem;margin-left:.5rem;vertical-align:middle;width:.5rem}:host ::ng-deep .permission-form__notification.cds--inline-notification{inline-size:100%;margin-block-end:0;max-inline-size:100%;min-inline-size:0}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1740
1740
  }], ctorParameters: () => [{ type: AccessControlFormEditorService }, { type: i2$1.IconService }, { type: i0.ChangeDetectorRef }], propDecorators: { group: [{
@@ -1988,10 +1988,10 @@ class AccessControlFormEditorTabComponent {
1988
1988
  return [];
1989
1989
  }
1990
1990
  }
1991
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlFormEditorTabComponent, deps: [{ token: AccessControlFormEditorService }, { token: PermissionSchemaMetadataService }, { token: i2$1.IconService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1992
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: AccessControlFormEditorTabComponent, isStandalone: false, selector: "valtimo-access-control-form-editor-tab", inputs: { model: "model", disabled: "disabled", roleKey: "roleKey" }, outputs: { validEvent: "validEvent", valueChangeEvent: "valueChangeEvent" }, providers: [AccessControlFormEditorService], viewQueries: [{ propertyName: "_permissionList", first: true, predicate: ["permissionList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<!-- fitPage sizes this container to the viewport so the sidebar and panel each scroll on their own. -->\n<div *ngIf=\"ready && permissionsArray as permissions\" class=\"form-editor\" fitPage>\n <aside class=\"form-editor__sidebar\">\n <div class=\"form-editor__sidebar-header\">\n <span class=\"form-editor__sidebar-title\">{{\n 'accessControl.editor.permissions' | translate\n }}</span>\n\n <button\n cdsButton=\"primary\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.addPermissionButton\"\n [disabled]=\"!!disabled\"\n (click)=\"addPermission()\"\n >\n {{ 'accessControl.editor.newPermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n\n <ul class=\"form-editor__list\" #permissionList>\n @for (item of orderedPermissions(); track item.control) {\n <li class=\"form-editor__list-item\">\n <button\n class=\"form-editor__item\"\n type=\"button\"\n [attr.data-test-id]=\"testIds.permissionListItem\"\n [class.form-editor__item--selected]=\"$selectedIndex() === item.index\"\n (click)=\"selectPermission(item.index)\"\n >\n <span class=\"form-editor__item-name\" [title]=\"shortName(item.control)\">\n @if (shortName(item.control)) {\n {{ shortName(item.control) }}\n } @else {\n {{ 'accessControl.editor.newPermission' | translate }}\n }\n </span>\n\n @if (hasConditions(item.control) || hasContext(item.control)) {\n <span class=\"form-editor__item-status\">\n <span class=\"form-editor__item-label\">{{\n 'accessControl.editor.preview.includes' | translate\n }}</span>\n\n @if (hasConditions(item.control)) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasConditions' | translate\n }}</cds-tag>\n }\n @if (hasContext(item.control)) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasContext' | translate\n }}</cds-tag>\n }\n </span>\n }\n\n @if (actionsOf(item.control).length) {\n <span class=\"form-editor__item-tags\">\n <span class=\"form-editor__item-label\">{{\n 'accessControl.editor.preview.actions' | translate\n }}</span>\n\n @for (action of actionsOf(item.control); track action) {\n <cds-tag size=\"sm\" [type]=\"action | actionTagType\">{{\n action | actionLabel\n }}</cds-tag>\n }\n </span>\n }\n </button>\n </li>\n }\n </ul>\n </aside>\n\n <section class=\"form-editor__panel\">\n @for (group of selectedControls(); track group) {\n <valtimo-permission-form\n [disabled]=\"!!disabled\"\n [group]=\"$any(group)\"\n [index]=\"$selectedIndex() ?? 0\"\n [roleKey]=\"roleKey\"\n (removeEvent)=\"removePermission($selectedIndex() ?? 0)\"\n ></valtimo-permission-form>\n } @empty {\n <div class=\"form-editor__empty\">\n <h4 class=\"form-editor__empty-title\">\n {{ 'accessControl.editor.empty.title' | translate }}\n </h4>\n <p class=\"form-editor__empty-message\">\n {{ 'accessControl.editor.empty.message' | translate }}\n </p>\n\n <button cdsButton=\"primary\" size=\"sm\" [disabled]=\"!!disabled\" (click)=\"addPermission()\">\n {{ 'accessControl.editor.addPermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n }\n </section>\n</div>\n", styles: [".form-editor{display:flex;border:1px solid var(--cds-border-subtle, #e0e0e0);overflow:hidden}.form-editor__sidebar{background:var(--cds-layer-01, #f4f4f4);border-right:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex:0 0 22rem;flex-direction:column;min-height:0}.form-editor__sidebar-header{align-items:center;border-bottom:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex:0 0 auto;justify-content:space-between;padding:12px}.form-editor__sidebar-title{color:var(--cds-text-secondary, #525252);font-size:14px;line-height:24px;font-weight:600}.form-editor__list{flex:1 1 auto;list-style:none;margin:0;min-height:0;overflow-y:auto;padding:0}.form-editor__list-item{margin:0}.form-editor__item{background:transparent;border:0;border-left:3px solid transparent;cursor:pointer;display:flex;flex-direction:column;gap:.375rem;padding:.75rem 1rem;text-align:left;width:100%}.form-editor__item:hover{background:var(--cds-layer-hover-01, #e8e8e8)}.form-editor__item:focus-visible{outline:2px solid var(--cds-focus, #0f62fe);outline-offset:-2px}.form-editor__item--selected{background:var(--cds-layer-selected-01, #e0e0e0);border-left-color:var(--cds-border-interactive, #0f62fe)}.form-editor__item--selected:hover{background:var(--cds-layer-selected-hover-01, #d1d1d1)}.form-editor__item-name{color:var(--cds-text-primary, #161616);font-size:.875rem;font-weight:600;line-height:1.29;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.form-editor__item-status{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.form-editor__item-status ::ng-deep .cds--tag{margin:0;max-width:none;box-shadow:0 0 0 1px var(--cds-layer-01)}.form-editor__item-tags{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.form-editor__item-tags ::ng-deep .cds--tag{margin:0;max-width:none;box-shadow:0 0 0 1px var(--cds-layer-01)}.form-editor__item-label{color:var(--cds-text-secondary, #525252);font-size:.75rem;font-weight:600;padding-right:.25rem}.form-editor__panel{flex:1 1 auto;min-width:0;overflow-y:auto;padding:1rem 1.5rem 1.5rem}.form-editor__empty{align-items:center;border:1px dashed var(--cds-border-strong, #8d8d8d);display:flex;flex-direction:column;gap:.5rem;margin:2rem auto;max-width:30rem;padding:2rem;text-align:center}.form-editor__empty-title{margin:0}.form-editor__empty-message{color:var(--cds-text-secondary, #525252);margin:0 0 .5rem}:host ::ng-deep .cds--checkbox-label-text{color:var(--cds-text-primary)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i3$1.FitPageDirective, selector: "[fitPage]", inputs: ["spaceAdjustment", "fitPageDisabled", "disableOverflow", "bottomMargin"] }, { kind: "component", type: i2$1.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: PermissionFormComponent, selector: "valtimo-permission-form", inputs: ["group", "index", "disabled", "roleKey"], outputs: ["removeEvent"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }, { kind: "pipe", type: ActionTagTypePipe, name: "actionTagType" }] }); }
1991
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlFormEditorTabComponent, deps: [{ token: AccessControlFormEditorService }, { token: PermissionSchemaMetadataService }, { token: i2$1.IconService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1992
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: AccessControlFormEditorTabComponent, isStandalone: false, selector: "valtimo-access-control-form-editor-tab", inputs: { model: "model", disabled: "disabled", roleKey: "roleKey" }, outputs: { validEvent: "validEvent", valueChangeEvent: "valueChangeEvent" }, providers: [AccessControlFormEditorService], viewQueries: [{ propertyName: "_permissionList", first: true, predicate: ["permissionList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<!-- fitPage sizes this container to the viewport so the sidebar and panel each scroll on their own. -->\n<div *ngIf=\"ready && permissionsArray as permissions\" class=\"form-editor\" fitPage>\n <aside class=\"form-editor__sidebar\">\n <div class=\"form-editor__sidebar-header\">\n <span class=\"form-editor__sidebar-title\">{{\n 'accessControl.editor.permissions' | translate\n }}</span>\n\n <button\n cdsButton=\"primary\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.addPermissionButton\"\n [disabled]=\"!!disabled\"\n (click)=\"addPermission()\"\n >\n {{ 'accessControl.editor.newPermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n\n <ul class=\"form-editor__list\" #permissionList>\n @for (item of orderedPermissions(); track item.control) {\n <li class=\"form-editor__list-item\">\n <button\n class=\"form-editor__item\"\n type=\"button\"\n [attr.data-test-id]=\"testIds.permissionListItem\"\n [class.form-editor__item--selected]=\"$selectedIndex() === item.index\"\n (click)=\"selectPermission(item.index)\"\n >\n <span class=\"form-editor__item-name\" [title]=\"shortName(item.control)\">\n @if (shortName(item.control)) {\n {{ shortName(item.control) }}\n } @else {\n {{ 'accessControl.editor.newPermission' | translate }}\n }\n </span>\n\n @if (hasConditions(item.control) || hasContext(item.control)) {\n <span class=\"form-editor__item-status\">\n <span class=\"form-editor__item-label\">{{\n 'accessControl.editor.preview.includes' | translate\n }}</span>\n\n @if (hasConditions(item.control)) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasConditions' | translate\n }}</cds-tag>\n }\n @if (hasContext(item.control)) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasContext' | translate\n }}</cds-tag>\n }\n </span>\n }\n\n @if (actionsOf(item.control).length) {\n <span class=\"form-editor__item-tags\">\n <span class=\"form-editor__item-label\">{{\n 'accessControl.editor.preview.actions' | translate\n }}</span>\n\n @for (action of actionsOf(item.control); track action) {\n <cds-tag size=\"sm\" [type]=\"action | actionTagType\">{{\n action | actionLabel\n }}</cds-tag>\n }\n </span>\n }\n </button>\n </li>\n }\n </ul>\n </aside>\n\n <section class=\"form-editor__panel\">\n @for (group of selectedControls(); track group) {\n <valtimo-permission-form\n [disabled]=\"!!disabled\"\n [group]=\"$any(group)\"\n [index]=\"$selectedIndex() ?? 0\"\n [roleKey]=\"roleKey\"\n (removeEvent)=\"removePermission($selectedIndex() ?? 0)\"\n ></valtimo-permission-form>\n } @empty {\n <div class=\"form-editor__empty\">\n <h4 class=\"form-editor__empty-title\">\n {{ 'accessControl.editor.empty.title' | translate }}\n </h4>\n <p class=\"form-editor__empty-message\">\n {{ 'accessControl.editor.empty.message' | translate }}\n </p>\n\n <button cdsButton=\"primary\" size=\"sm\" [disabled]=\"!!disabled\" (click)=\"addPermission()\">\n {{ 'accessControl.editor.addPermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n }\n </section>\n</div>\n", styles: [".form-editor{display:flex;border:1px solid var(--cds-border-subtle, #e0e0e0);overflow:hidden}.form-editor__sidebar{background:var(--cds-layer-01, #f4f4f4);border-right:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex:0 0 22rem;flex-direction:column;min-height:0}.form-editor__sidebar-header{align-items:center;border-bottom:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex:0 0 auto;justify-content:space-between;padding:12px}.form-editor__sidebar-title{color:var(--cds-text-secondary, #525252);font-size:14px;line-height:24px;font-weight:600}.form-editor__list{flex:1 1 auto;list-style:none;margin:0;min-height:0;overflow-y:auto;padding:0}.form-editor__list-item{margin:0}.form-editor__item{background:transparent;border:0;border-left:3px solid transparent;cursor:pointer;display:flex;flex-direction:column;gap:.375rem;padding:.75rem 1rem;text-align:left;width:100%}.form-editor__item:hover{background:var(--cds-layer-hover-01, #e8e8e8)}.form-editor__item:focus-visible{outline:2px solid var(--cds-focus, #0f62fe);outline-offset:-2px}.form-editor__item--selected{background:var(--cds-layer-selected-01, #e0e0e0);border-left-color:var(--cds-border-interactive, #0f62fe)}.form-editor__item--selected:hover{background:var(--cds-layer-selected-hover-01, #d1d1d1)}.form-editor__item-name{color:var(--cds-text-primary, #161616);font-size:.875rem;font-weight:600;line-height:1.29;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.form-editor__item-status{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.form-editor__item-status ::ng-deep .cds--tag{margin:0;max-width:none;box-shadow:0 0 0 1px var(--cds-layer-01)}.form-editor__item-tags{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.form-editor__item-tags ::ng-deep .cds--tag{margin:0;max-width:none;box-shadow:0 0 0 1px var(--cds-layer-01)}.form-editor__item-label{color:var(--cds-text-secondary, #525252);font-size:.75rem;font-weight:600;padding-right:.25rem}.form-editor__panel{flex:1 1 auto;min-width:0;overflow-y:auto;padding:1rem 1.5rem 1.5rem}.form-editor__empty{align-items:center;border:1px dashed var(--cds-border-strong, #8d8d8d);display:flex;flex-direction:column;gap:.5rem;margin:2rem auto;max-width:30rem;padding:2rem;text-align:center}.form-editor__empty-title{margin:0}.form-editor__empty-message{color:var(--cds-text-secondary, #525252);margin:0 0 .5rem}:host ::ng-deep .cds--checkbox-label-text{color:var(--cds-text-primary)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i3$1.FitPageDirective, selector: "[fitPage]", inputs: ["spaceAdjustment", "fitPageDisabled", "disableOverflow", "bottomMargin"] }, { kind: "component", type: i2$1.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class", "skeleton"] }, { kind: "component", type: PermissionFormComponent, selector: "valtimo-permission-form", inputs: ["group", "index", "disabled", "roleKey"], outputs: ["removeEvent"] }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: ActionLabelPipe, name: "actionLabel" }, { kind: "pipe", type: ActionTagTypePipe, name: "actionTagType" }] }); }
1993
1993
  }
1994
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlFormEditorTabComponent, decorators: [{
1994
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlFormEditorTabComponent, decorators: [{
1995
1995
  type: Component,
1996
1996
  args: [{ standalone: false, selector: 'valtimo-access-control-form-editor-tab', providers: [AccessControlFormEditorService], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<!-- fitPage sizes this container to the viewport so the sidebar and panel each scroll on their own. -->\n<div *ngIf=\"ready && permissionsArray as permissions\" class=\"form-editor\" fitPage>\n <aside class=\"form-editor__sidebar\">\n <div class=\"form-editor__sidebar-header\">\n <span class=\"form-editor__sidebar-title\">{{\n 'accessControl.editor.permissions' | translate\n }}</span>\n\n <button\n cdsButton=\"primary\"\n size=\"sm\"\n [attr.data-test-id]=\"testIds.addPermissionButton\"\n [disabled]=\"!!disabled\"\n (click)=\"addPermission()\"\n >\n {{ 'accessControl.editor.newPermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n\n <ul class=\"form-editor__list\" #permissionList>\n @for (item of orderedPermissions(); track item.control) {\n <li class=\"form-editor__list-item\">\n <button\n class=\"form-editor__item\"\n type=\"button\"\n [attr.data-test-id]=\"testIds.permissionListItem\"\n [class.form-editor__item--selected]=\"$selectedIndex() === item.index\"\n (click)=\"selectPermission(item.index)\"\n >\n <span class=\"form-editor__item-name\" [title]=\"shortName(item.control)\">\n @if (shortName(item.control)) {\n {{ shortName(item.control) }}\n } @else {\n {{ 'accessControl.editor.newPermission' | translate }}\n }\n </span>\n\n @if (hasConditions(item.control) || hasContext(item.control)) {\n <span class=\"form-editor__item-status\">\n <span class=\"form-editor__item-label\">{{\n 'accessControl.editor.preview.includes' | translate\n }}</span>\n\n @if (hasConditions(item.control)) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasConditions' | translate\n }}</cds-tag>\n }\n @if (hasContext(item.control)) {\n <cds-tag size=\"sm\" type=\"high-contrast\">{{\n 'accessControl.editor.hasContext' | translate\n }}</cds-tag>\n }\n </span>\n }\n\n @if (actionsOf(item.control).length) {\n <span class=\"form-editor__item-tags\">\n <span class=\"form-editor__item-label\">{{\n 'accessControl.editor.preview.actions' | translate\n }}</span>\n\n @for (action of actionsOf(item.control); track action) {\n <cds-tag size=\"sm\" [type]=\"action | actionTagType\">{{\n action | actionLabel\n }}</cds-tag>\n }\n </span>\n }\n </button>\n </li>\n }\n </ul>\n </aside>\n\n <section class=\"form-editor__panel\">\n @for (group of selectedControls(); track group) {\n <valtimo-permission-form\n [disabled]=\"!!disabled\"\n [group]=\"$any(group)\"\n [index]=\"$selectedIndex() ?? 0\"\n [roleKey]=\"roleKey\"\n (removeEvent)=\"removePermission($selectedIndex() ?? 0)\"\n ></valtimo-permission-form>\n } @empty {\n <div class=\"form-editor__empty\">\n <h4 class=\"form-editor__empty-title\">\n {{ 'accessControl.editor.empty.title' | translate }}\n </h4>\n <p class=\"form-editor__empty-message\">\n {{ 'accessControl.editor.empty.message' | translate }}\n </p>\n\n <button cdsButton=\"primary\" size=\"sm\" [disabled]=\"!!disabled\" (click)=\"addPermission()\">\n {{ 'accessControl.editor.addPermission' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n </div>\n }\n </section>\n</div>\n", styles: [".form-editor{display:flex;border:1px solid var(--cds-border-subtle, #e0e0e0);overflow:hidden}.form-editor__sidebar{background:var(--cds-layer-01, #f4f4f4);border-right:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex:0 0 22rem;flex-direction:column;min-height:0}.form-editor__sidebar-header{align-items:center;border-bottom:1px solid var(--cds-border-subtle, #e0e0e0);display:flex;flex:0 0 auto;justify-content:space-between;padding:12px}.form-editor__sidebar-title{color:var(--cds-text-secondary, #525252);font-size:14px;line-height:24px;font-weight:600}.form-editor__list{flex:1 1 auto;list-style:none;margin:0;min-height:0;overflow-y:auto;padding:0}.form-editor__list-item{margin:0}.form-editor__item{background:transparent;border:0;border-left:3px solid transparent;cursor:pointer;display:flex;flex-direction:column;gap:.375rem;padding:.75rem 1rem;text-align:left;width:100%}.form-editor__item:hover{background:var(--cds-layer-hover-01, #e8e8e8)}.form-editor__item:focus-visible{outline:2px solid var(--cds-focus, #0f62fe);outline-offset:-2px}.form-editor__item--selected{background:var(--cds-layer-selected-01, #e0e0e0);border-left-color:var(--cds-border-interactive, #0f62fe)}.form-editor__item--selected:hover{background:var(--cds-layer-selected-hover-01, #d1d1d1)}.form-editor__item-name{color:var(--cds-text-primary, #161616);font-size:.875rem;font-weight:600;line-height:1.29;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.form-editor__item-status{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.form-editor__item-status ::ng-deep .cds--tag{margin:0;max-width:none;box-shadow:0 0 0 1px var(--cds-layer-01)}.form-editor__item-tags{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}.form-editor__item-tags ::ng-deep .cds--tag{margin:0;max-width:none;box-shadow:0 0 0 1px var(--cds-layer-01)}.form-editor__item-label{color:var(--cds-text-secondary, #525252);font-size:.75rem;font-weight:600;padding-right:.25rem}.form-editor__panel{flex:1 1 auto;min-width:0;overflow-y:auto;padding:1rem 1.5rem 1.5rem}.form-editor__empty{align-items:center;border:1px dashed var(--cds-border-strong, #8d8d8d);display:flex;flex-direction:column;gap:.5rem;margin:2rem auto;max-width:30rem;padding:2rem;text-align:center}.form-editor__empty-title{margin:0}.form-editor__empty-message{color:var(--cds-text-secondary, #525252);margin:0 0 .5rem}:host ::ng-deep .cds--checkbox-label-text{color:var(--cds-text-primary)}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
1997
1997
  }], ctorParameters: () => [{ type: AccessControlFormEditorService }, { type: PermissionSchemaMetadataService }, { type: i2$1.IconService }, { type: i0.ChangeDetectorRef }], propDecorators: { _permissionList: [{
@@ -2150,10 +2150,10 @@ class AccessControlJsonEditorTabComponent {
2150
2150
  return [];
2151
2151
  }
2152
2152
  }
2153
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlJsonEditorTabComponent, deps: [{ token: i1$3.ActivatedRoute }, { token: i2$1.IconService }, { token: PermissionSchemaMetadataService }, { token: i1$3.Router }, { token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
2154
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: AccessControlJsonEditorTabComponent, isStandalone: true, selector: "valtimo-access-control-json-editor-tab", inputs: { disabled: "disabled", model: "model" }, outputs: { validEvent: "validEvent", valueChangeEvent: "valueChangeEvent" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n filteredModel: filteredModel$ | async,\n editorDisabled: editorDisabled$ | async,\n permissionSchema: permissionSchema$ | async,\n } as obs\"\n class=\"json-editor-tab\"\n>\n <div class=\"json-editor-tab__toolbar\">\n <v-overflow-menu placement=\"bottom-end\" [closeOnSelect]=\"false\">\n <button\n overflowTrigger\n cdsButton=\"ghost\"\n class=\"json-editor-tab__filter-trigger\"\n [class.json-editor-tab__filter-trigger--active]=\"isFilterActive$ | async\"\n [iconOnly]=\"true\"\n >\n <svg cdsIcon=\"filter\" size=\"16\"></svg>\n </button>\n\n <div overflowPane>\n <ng-container *ngTemplateOutlet=\"filterPane\"></ng-container>\n </div>\n </v-overflow-menu>\n </div>\n\n <valtimo-editor\n *ngIf=\"obs.permissionSchema\"\n [disabled]=\"obs.editorDisabled || disabled\"\n [fitPage]=\"true\"\n [jsonSchema]=\"obs.permissionSchema\"\n [model]=\"obs.filteredModel\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-editor>\n</div>\n\n<ng-template #filterPane>\n <form class=\"json-editor-tab__filter\" (click)=\"$event.stopImmediatePropagation()\">\n <cds-dropdown\n [appendInline]=\"true\"\n [label]=\"'accessControl.filter.resourceType' | translate\"\n [placeholder]=\"'accessControl.filter.allResourceTypes' | translate\"\n (selected)=\"onResourceTypeSelected($event)\"\n >\n <cds-dropdown-list [items]=\"resourceTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [appendInline]=\"true\"\n [label]=\"'accessControl.filter.action' | translate\"\n [placeholder]=\"'accessControl.filter.allActions' | translate\"\n (selected)=\"onActionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"actionItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n\n <button cdsButton=\"tertiary\" type=\"button\" (click)=\"onClearFilter()\">\n {{ 'interface.clear' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n</ng-template>\n", styles: [":host{display:block;height:100%}.json-editor-tab{display:flex;flex-direction:column;height:100%}.json-editor-tab__toolbar{display:flex;justify-content:flex-end}.json-editor-tab__filter-trigger{position:relative}.json-editor-tab__filter-trigger--active:after{content:\"\";position:absolute;top:.375rem;right:.375rem;width:.5rem;height:.5rem;border-radius:50%;background-color:var(--cds-support-info, #0f62fe)}.json-editor-tab__filter{display:flex;flex-direction:column;gap:1rem;padding:1rem;min-width:16rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2$1.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2$1.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: EditorModule }, { kind: "component", type: i3$1.EditorComponent, selector: "valtimo-editor", inputs: ["editorOptions", "model", "disabled", "formatOnLoad", "widthPx", "heightPx", "heightStyle", "jsonSchema", "fitPage"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlJsonEditorTabComponent, deps: [{ token: i1$3.ActivatedRoute }, { token: i2$1.IconService }, { token: PermissionSchemaMetadataService }, { token: i1$3.Router }, { token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
2154
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: AccessControlJsonEditorTabComponent, isStandalone: true, selector: "valtimo-access-control-json-editor-tab", inputs: { disabled: "disabled", model: "model" }, outputs: { validEvent: "validEvent", valueChangeEvent: "valueChangeEvent" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n *ngIf=\"{\n filteredModel: filteredModel$ | async,\n editorDisabled: editorDisabled$ | async,\n permissionSchema: permissionSchema$ | async,\n } as obs\"\n class=\"json-editor-tab\"\n>\n <div class=\"json-editor-tab__toolbar\">\n <v-overflow-menu placement=\"bottom-end\" [closeOnSelect]=\"false\">\n <button\n overflowTrigger\n cdsButton=\"ghost\"\n class=\"json-editor-tab__filter-trigger\"\n [class.json-editor-tab__filter-trigger--active]=\"isFilterActive$ | async\"\n [iconOnly]=\"true\"\n >\n <svg cdsIcon=\"filter\" size=\"16\"></svg>\n </button>\n\n <div overflowPane>\n <ng-container *ngTemplateOutlet=\"filterPane\"></ng-container>\n </div>\n </v-overflow-menu>\n </div>\n\n <valtimo-editor\n *ngIf=\"obs.permissionSchema\"\n [disabled]=\"obs.editorDisabled || disabled\"\n [fitPage]=\"true\"\n [jsonSchema]=\"obs.permissionSchema\"\n [model]=\"obs.filteredModel\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-editor>\n</div>\n\n<ng-template #filterPane>\n <form class=\"json-editor-tab__filter\" (click)=\"$event.stopImmediatePropagation()\">\n <cds-dropdown\n [appendInline]=\"true\"\n [label]=\"'accessControl.filter.resourceType' | translate\"\n [placeholder]=\"'accessControl.filter.allResourceTypes' | translate\"\n (selected)=\"onResourceTypeSelected($event)\"\n >\n <cds-dropdown-list [items]=\"resourceTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n\n <cds-dropdown\n [appendInline]=\"true\"\n [label]=\"'accessControl.filter.action' | translate\"\n [placeholder]=\"'accessControl.filter.allActions' | translate\"\n (selected)=\"onActionSelected($event)\"\n >\n <cds-dropdown-list [items]=\"actionItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n\n <button cdsButton=\"tertiary\" type=\"button\" (click)=\"onClearFilter()\">\n {{ 'interface.clear' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n</ng-template>\n", styles: [":host{display:block;height:100%}.json-editor-tab{display:flex;flex-direction:column;height:100%}.json-editor-tab__toolbar{display:flex;justify-content:flex-end}.json-editor-tab__filter-trigger{position:relative}.json-editor-tab__filter-trigger--active:after{content:\"\";position:absolute;top:.375rem;right:.375rem;width:.5rem;height:.5rem;border-radius:50%;background-color:var(--cds-support-info, #0f62fe)}.json-editor-tab__filter{display:flex;flex-direction:column;gap:1rem;padding:1rem;min-width:16rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2$1.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "readonly", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp", "fluid"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2$1.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: EditorModule }, { kind: "component", type: i3$1.EditorComponent, selector: "valtimo-editor", inputs: ["editorOptions", "model", "disabled", "formatOnLoad", "widthPx", "heightPx", "heightStyle", "jsonSchema", "fitPage"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2155
2155
  }
2156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlJsonEditorTabComponent, decorators: [{
2156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlJsonEditorTabComponent, decorators: [{
2157
2157
  type: Component,
2158
2158
  args: [{ standalone: true, selector: 'valtimo-access-control-json-editor-tab', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2159
2159
  CommonModule,
@@ -2198,10 +2198,10 @@ class ResourceTypeLabelPipe {
2198
2198
  return '';
2199
2199
  return formatResourceType(this.translateService, fqn);
2200
2200
  }
2201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourceTypeLabelPipe, deps: [{ token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
2202
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: ResourceTypeLabelPipe, isStandalone: true, name: "resourceTypeLabel" }); }
2201
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ResourceTypeLabelPipe, deps: [{ token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
2202
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.25", ngImport: i0, type: ResourceTypeLabelPipe, isStandalone: true, name: "resourceTypeLabel" }); }
2203
2203
  }
2204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: ResourceTypeLabelPipe, decorators: [{
2204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ResourceTypeLabelPipe, decorators: [{
2205
2205
  type: Pipe,
2206
2206
  args: [{
2207
2207
  standalone: true,
@@ -2326,10 +2326,10 @@ class AccessControlOverviewTabComponent {
2326
2326
  customResource: !this.metadataService.isResourceTypeKnown(condition.resourceType),
2327
2327
  };
2328
2328
  }
2329
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlOverviewTabComponent, deps: [{ token: PermissionSchemaMetadataService }, { token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
2330
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: AccessControlOverviewTabComponent, isStandalone: true, selector: "valtimo-access-control-overview-tab", inputs: { roleKey: "roleKey", permissions: "permissions" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"overview$ | async as overview\" class=\"ac\">\n @for (resource of overview; track resource.resourceType) {\n <section class=\"ac__group\">\n <h4 class=\"ac__heading\">\n @if (roleKey) {\n <a\n class=\"ac__heading-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{filterResourceType: resource.resourceType}\"\n >\n {{ resource.resourceType | resourceTypeLabel }}\n <span class=\"ac__fqn\">({{ resource.resourceType }})</span>\n </a>\n } @else {\n {{ resource.resourceType | resourceTypeLabel }}\n <span class=\"ac__fqn\">({{ resource.resourceType }})</span>\n }\n </h4>\n\n @for (entry of resource.actions; track entry.action) {\n <div class=\"ac__action\">\n @if (entry.grants.length) {\n <span class=\"ac__connective\">{{ 'accessControl.overview.can' | translate }}</span>\n @if (roleKey) {\n <a\n class=\"ac__action-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{\n filterResourceType: resource.resourceType,\n filterAction: entry.action,\n }\"\n >\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n </a>\n } @else {\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n }\n\n @for (perm of entry.grants; track $index; let isFirst = $first) {\n @if (!isFirst) {\n <div class=\"ac__or ac__connective\">{{\n 'accessControl.overview.or' | translate\n }}</div>\n }\n <div class=\"ac__grant\">\n @if (perm.conditions?.length) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.when' | translate\n }}</div>\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: perm.conditions,\n resourceType: perm.resourceType,\n }\n \"\n ></ng-container>\n } @else if (!perm.contextResourceType) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.unconditional' | translate\n }}</div>\n }\n\n @if (perm.contextResourceType) {\n @if (isNoContext(perm.contextResourceType)) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.noContext' | translate\n }}</div>\n } @else {\n <div>\n <span class=\"ac__connective\">{{\n 'accessControl.overview.inContextOf' | translate\n }}</span>\n <span class=\"ac__resource-type\">{{\n perm.contextResourceType | resourceTypeLabel\n }}</span>\n @if (perm.contextConditions?.length) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.where' | translate\n }}</span>\n }\n </div>\n @if (perm.contextConditions?.length) {\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: perm.contextConditions,\n resourceType: perm.contextResourceType,\n }\n \"\n ></ng-container>\n }\n }\n }\n </div>\n }\n } @else {\n <span class=\"ac__no-access\">{{\n 'accessControl.overview.cannot' | translate\n }}</span>\n @if (roleKey) {\n <a\n class=\"ac__action-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{\n filterResourceType: resource.resourceType,\n filterAction: entry.action,\n }\"\n >\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n </a>\n } @else {\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n }\n }\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template #conditionsTpl let-conditions=\"conditions\" let-resourceType=\"resourceType\">\n <div class=\"ac__conditions\">\n @for (\n condition of formatConditions(conditions, resourceType);\n track $index;\n let isFirst = $first\n ) {\n <div class=\"ac__condition\">\n @if (!isFirst) {\n <span class=\"ac__connective\">{{ 'accessControl.overview.and' | translate }}</span>\n }\n @switch (condition.kind) {\n @case ('field') {\n <span>{{ condition.field }}</span>\n @if (condition.customField) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customField' | translate\n }}</span>\n }\n <span class=\"ac__operator\">{{ condition.operator }}</span>\n <span>{{ condition.value }}</span>\n }\n\n @case ('expression') {\n <span>{{ condition.field }}</span>\n @if (condition.customField) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customField' | translate\n }}</span>\n }\n <span class=\"ac__connective\">{{\n 'accessControl.overview.atJsonPath' | translate\n }}</span>\n <code class=\"ac__path\" [title]=\"condition.clazz\">{{ condition.path }}</code>\n <span class=\"ac__operator\">{{ condition.operator }}</span>\n <span>{{ condition.value }}</span>\n }\n\n @case ('container') {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.relatedResource' | translate\n }}</span>\n <span class=\"ac__resource-type\">{{\n condition.resourceType | resourceTypeLabel\n }}</span>\n @if (condition.customResource) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customResource' | translate\n }}</span>\n }\n <span class=\"ac__connective\">{{\n 'accessControl.overview.where' | translate\n }}</span>\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: condition.conditions,\n resourceType: condition.resourceType,\n }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [".ac{display:flex;flex-direction:column;gap:2rem;padding:1rem}.ac__group{display:flex;flex-direction:column;gap:.75rem}.ac__heading{border-bottom:1px solid var(--cds-border-subtle, #c6c6c6);margin:0 0 .5rem;padding-bottom:.25rem}.ac__heading-link{color:inherit;text-decoration:none}.ac__heading-link:hover,.ac__heading-link:focus-visible{text-decoration:underline}.ac__action-link{color:inherit;text-decoration:none}.ac__action-link:hover,.ac__action-link:focus-visible{text-decoration:underline}.ac__fqn{color:var(--cds-text-secondary, #525252);font-family:var(--cds-code-01-font-family, monospace);font-size:.875rem;font-weight:400;margin-left:.5rem}.ac__action{line-height:1.6}.ac__action-name,.ac__resource-type{font-weight:600}.ac__operator{font-style:italic}.ac__connective{color:var(--cds-text-secondary, #525252);font-style:italic}.ac__no-access{color:var(--cds-text-error, #da1e28);font-style:italic}.ac__grant,.ac__or,.ac__conditions{padding-left:1.5rem}.ac__path{background-color:var(--cds-layer-accent, #e0e0e0);border-radius:2px;font-family:var(--cds-code-01-font-family, monospace);padding:0 .25rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: ResourceTypeLabelPipe, name: "resourceTypeLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
2329
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlOverviewTabComponent, deps: [{ token: PermissionSchemaMetadataService }, { token: i1$2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
2330
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: AccessControlOverviewTabComponent, isStandalone: true, selector: "valtimo-access-control-overview-tab", inputs: { roleKey: "roleKey", permissions: "permissions" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"overview$ | async as overview\" class=\"ac\">\n @for (resource of overview; track resource.resourceType) {\n <section class=\"ac__group\">\n <h4 class=\"ac__heading\">\n @if (roleKey) {\n <a\n class=\"ac__heading-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{filterResourceType: resource.resourceType}\"\n >\n {{ resource.resourceType | resourceTypeLabel }}\n <span class=\"ac__fqn\">({{ resource.resourceType }})</span>\n </a>\n } @else {\n {{ resource.resourceType | resourceTypeLabel }}\n <span class=\"ac__fqn\">({{ resource.resourceType }})</span>\n }\n </h4>\n\n @for (entry of resource.actions; track entry.action) {\n <div class=\"ac__action\">\n @if (entry.grants.length) {\n <span class=\"ac__connective\">{{ 'accessControl.overview.can' | translate }}</span>\n @if (roleKey) {\n <a\n class=\"ac__action-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{\n filterResourceType: resource.resourceType,\n filterAction: entry.action,\n }\"\n >\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n </a>\n } @else {\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n }\n\n @for (perm of entry.grants; track $index; let isFirst = $first) {\n @if (!isFirst) {\n <div class=\"ac__or ac__connective\">{{\n 'accessControl.overview.or' | translate\n }}</div>\n }\n <div class=\"ac__grant\">\n @if (perm.conditions?.length) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.when' | translate\n }}</div>\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: perm.conditions,\n resourceType: perm.resourceType,\n }\n \"\n ></ng-container>\n } @else if (!perm.contextResourceType) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.unconditional' | translate\n }}</div>\n }\n\n @if (perm.contextResourceType) {\n @if (isNoContext(perm.contextResourceType)) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.noContext' | translate\n }}</div>\n } @else {\n <div>\n <span class=\"ac__connective\">{{\n 'accessControl.overview.inContextOf' | translate\n }}</span>\n <span class=\"ac__resource-type\">{{\n perm.contextResourceType | resourceTypeLabel\n }}</span>\n @if (perm.contextConditions?.length) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.where' | translate\n }}</span>\n }\n </div>\n @if (perm.contextConditions?.length) {\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: perm.contextConditions,\n resourceType: perm.contextResourceType,\n }\n \"\n ></ng-container>\n }\n }\n }\n </div>\n }\n } @else {\n <span class=\"ac__no-access\">{{\n 'accessControl.overview.cannot' | translate\n }}</span>\n @if (roleKey) {\n <a\n class=\"ac__action-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{\n filterResourceType: resource.resourceType,\n filterAction: entry.action,\n }\"\n >\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n </a>\n } @else {\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n }\n }\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template #conditionsTpl let-conditions=\"conditions\" let-resourceType=\"resourceType\">\n <div class=\"ac__conditions\">\n @for (\n condition of formatConditions(conditions, resourceType);\n track $index;\n let isFirst = $first\n ) {\n <div class=\"ac__condition\">\n @if (!isFirst) {\n <span class=\"ac__connective\">{{ 'accessControl.overview.and' | translate }}</span>\n }\n @switch (condition.kind) {\n @case ('field') {\n <span>{{ condition.field }}</span>\n @if (condition.customField) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customField' | translate\n }}</span>\n }\n <span class=\"ac__operator\">{{ condition.operator }}</span>\n <span>{{ condition.value }}</span>\n }\n\n @case ('expression') {\n <span>{{ condition.field }}</span>\n @if (condition.customField) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customField' | translate\n }}</span>\n }\n <span class=\"ac__connective\">{{\n 'accessControl.overview.atJsonPath' | translate\n }}</span>\n <code class=\"ac__path\" [title]=\"condition.clazz\">{{ condition.path }}</code>\n <span class=\"ac__operator\">{{ condition.operator }}</span>\n <span>{{ condition.value }}</span>\n }\n\n @case ('container') {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.relatedResource' | translate\n }}</span>\n <span class=\"ac__resource-type\">{{\n condition.resourceType | resourceTypeLabel\n }}</span>\n @if (condition.customResource) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customResource' | translate\n }}</span>\n }\n <span class=\"ac__connective\">{{\n 'accessControl.overview.where' | translate\n }}</span>\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: condition.conditions,\n resourceType: condition.resourceType,\n }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [".ac{display:flex;flex-direction:column;gap:2rem;padding:1rem}.ac__group{display:flex;flex-direction:column;gap:.75rem}.ac__heading{border-bottom:1px solid var(--cds-border-subtle, #c6c6c6);margin:0 0 .5rem;padding-bottom:.25rem}.ac__heading-link{color:inherit;text-decoration:none}.ac__heading-link:hover,.ac__heading-link:focus-visible{text-decoration:underline}.ac__action-link{color:inherit;text-decoration:none}.ac__action-link:hover,.ac__action-link:focus-visible{text-decoration:underline}.ac__fqn{color:var(--cds-text-secondary, #525252);font-family:var(--cds-code-01-font-family, monospace);font-size:.875rem;font-weight:400;margin-left:.5rem}.ac__action{line-height:1.6}.ac__action-name,.ac__resource-type{font-weight:600}.ac__operator{font-style:italic}.ac__connective{color:var(--cds-text-secondary, #525252);font-style:italic}.ac__no-access{color:var(--cds-text-error, #da1e28);font-style:italic}.ac__grant,.ac__or,.ac__conditions{padding-left:1.5rem}.ac__path{background-color:var(--cds-layer-accent, #e0e0e0);border-radius:2px;font-family:var(--cds-code-01-font-family, monospace);padding:0 .25rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "pipe", type: ResourceTypeLabelPipe, name: "resourceTypeLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true }); }
2331
2331
  }
2332
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlOverviewTabComponent, decorators: [{
2332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlOverviewTabComponent, decorators: [{
2333
2333
  type: Component,
2334
2334
  args: [{ standalone: true, selector: 'valtimo-access-control-overview-tab', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: true, imports: [CommonModule, RouterModule, TranslateModule, ResourceTypeLabelPipe], template: "<!--\n ~ Copyright 2015-2026 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div *ngIf=\"overview$ | async as overview\" class=\"ac\">\n @for (resource of overview; track resource.resourceType) {\n <section class=\"ac__group\">\n <h4 class=\"ac__heading\">\n @if (roleKey) {\n <a\n class=\"ac__heading-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{filterResourceType: resource.resourceType}\"\n >\n {{ resource.resourceType | resourceTypeLabel }}\n <span class=\"ac__fqn\">({{ resource.resourceType }})</span>\n </a>\n } @else {\n {{ resource.resourceType | resourceTypeLabel }}\n <span class=\"ac__fqn\">({{ resource.resourceType }})</span>\n }\n </h4>\n\n @for (entry of resource.actions; track entry.action) {\n <div class=\"ac__action\">\n @if (entry.grants.length) {\n <span class=\"ac__connective\">{{ 'accessControl.overview.can' | translate }}</span>\n @if (roleKey) {\n <a\n class=\"ac__action-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{\n filterResourceType: resource.resourceType,\n filterAction: entry.action,\n }\"\n >\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n </a>\n } @else {\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n }\n\n @for (perm of entry.grants; track $index; let isFirst = $first) {\n @if (!isFirst) {\n <div class=\"ac__or ac__connective\">{{\n 'accessControl.overview.or' | translate\n }}</div>\n }\n <div class=\"ac__grant\">\n @if (perm.conditions?.length) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.when' | translate\n }}</div>\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: perm.conditions,\n resourceType: perm.resourceType,\n }\n \"\n ></ng-container>\n } @else if (!perm.contextResourceType) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.unconditional' | translate\n }}</div>\n }\n\n @if (perm.contextResourceType) {\n @if (isNoContext(perm.contextResourceType)) {\n <div class=\"ac__connective\">{{\n 'accessControl.overview.noContext' | translate\n }}</div>\n } @else {\n <div>\n <span class=\"ac__connective\">{{\n 'accessControl.overview.inContextOf' | translate\n }}</span>\n <span class=\"ac__resource-type\">{{\n perm.contextResourceType | resourceTypeLabel\n }}</span>\n @if (perm.contextConditions?.length) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.where' | translate\n }}</span>\n }\n </div>\n @if (perm.contextConditions?.length) {\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: perm.contextConditions,\n resourceType: perm.contextResourceType,\n }\n \"\n ></ng-container>\n }\n }\n }\n </div>\n }\n } @else {\n <span class=\"ac__no-access\">{{\n 'accessControl.overview.cannot' | translate\n }}</span>\n @if (roleKey) {\n <a\n class=\"ac__action-link\"\n [routerLink]=\"['/access-control', roleKey, 'json-editor']\"\n [queryParams]=\"{\n filterResourceType: resource.resourceType,\n filterAction: entry.action,\n }\"\n >\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n </a>\n } @else {\n <span class=\"ac__action-name\">{{\n 'accessControl.actions.' + entry.action | translate\n }}</span>\n }\n }\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template #conditionsTpl let-conditions=\"conditions\" let-resourceType=\"resourceType\">\n <div class=\"ac__conditions\">\n @for (\n condition of formatConditions(conditions, resourceType);\n track $index;\n let isFirst = $first\n ) {\n <div class=\"ac__condition\">\n @if (!isFirst) {\n <span class=\"ac__connective\">{{ 'accessControl.overview.and' | translate }}</span>\n }\n @switch (condition.kind) {\n @case ('field') {\n <span>{{ condition.field }}</span>\n @if (condition.customField) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customField' | translate\n }}</span>\n }\n <span class=\"ac__operator\">{{ condition.operator }}</span>\n <span>{{ condition.value }}</span>\n }\n\n @case ('expression') {\n <span>{{ condition.field }}</span>\n @if (condition.customField) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customField' | translate\n }}</span>\n }\n <span class=\"ac__connective\">{{\n 'accessControl.overview.atJsonPath' | translate\n }}</span>\n <code class=\"ac__path\" [title]=\"condition.clazz\">{{ condition.path }}</code>\n <span class=\"ac__operator\">{{ condition.operator }}</span>\n <span>{{ condition.value }}</span>\n }\n\n @case ('container') {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.relatedResource' | translate\n }}</span>\n <span class=\"ac__resource-type\">{{\n condition.resourceType | resourceTypeLabel\n }}</span>\n @if (condition.customResource) {\n <span class=\"ac__connective\">{{\n 'accessControl.overview.customResource' | translate\n }}</span>\n }\n <span class=\"ac__connective\">{{\n 'accessControl.overview.where' | translate\n }}</span>\n <ng-container\n *ngTemplateOutlet=\"\n conditionsTpl;\n context: {\n conditions: condition.conditions,\n resourceType: condition.resourceType,\n }\n \"\n ></ng-container>\n }\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [".ac{display:flex;flex-direction:column;gap:2rem;padding:1rem}.ac__group{display:flex;flex-direction:column;gap:.75rem}.ac__heading{border-bottom:1px solid var(--cds-border-subtle, #c6c6c6);margin:0 0 .5rem;padding-bottom:.25rem}.ac__heading-link{color:inherit;text-decoration:none}.ac__heading-link:hover,.ac__heading-link:focus-visible{text-decoration:underline}.ac__action-link{color:inherit;text-decoration:none}.ac__action-link:hover,.ac__action-link:focus-visible{text-decoration:underline}.ac__fqn{color:var(--cds-text-secondary, #525252);font-family:var(--cds-code-01-font-family, monospace);font-size:.875rem;font-weight:400;margin-left:.5rem}.ac__action{line-height:1.6}.ac__action-name,.ac__resource-type{font-weight:600}.ac__operator{font-style:italic}.ac__connective{color:var(--cds-text-secondary, #525252);font-style:italic}.ac__no-access{color:var(--cds-text-error, #da1e28);font-style:italic}.ac__grant,.ac__or,.ac__conditions{padding-left:1.5rem}.ac__path{background-color:var(--cds-layer-accent, #e0e0e0);border-radius:2px;font-family:var(--cds-code-01-font-family, monospace);padding:0 .25rem}\n/*!\n * Copyright 2015-2026 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2335
2335
  }], ctorParameters: () => [{ type: PermissionSchemaMetadataService }, { type: i1$2.TranslateService }], propDecorators: { roleKey: [{
@@ -2582,10 +2582,10 @@ class AccessControlEditorComponent extends PendingChangesComponent {
2582
2582
  type: 'success',
2583
2583
  });
2584
2584
  }
2585
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlEditorComponent, deps: [{ token: AccessControlService }, { token: i1$3.ActivatedRoute }, { token: i3$1.PageTitleService }, { token: i1$3.Router }, { token: i1$1.GlobalNotificationService }, { token: i1$2.TranslateService }, { token: AccessControlExportService }, { token: i3$1.PageHeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
2586
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: AccessControlEditorComponent, isStandalone: false, selector: "ng-component", viewQueries: [{ propertyName: "_formEditorTab", first: true, predicate: AccessControlFormEditorTabComponent, descendants: true }, { propertyName: "_tabs", predicate: Tab, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"model$ | async as model; else loading\">\n <!-- The headers only switch the active tab; the tab content is rendered below (gated by the\n active-tab signal) instead of inside the Carbon tab panes. Carbon removes a pane's content\n as soon as another header is clicked, which would destroy the editor's unsaved form before\n the leave-page confirmation is resolved. -->\n <cds-tabs type=\"contained\">\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.EDITOR\"\n [heading]=\"'accessControl.roles.tabs.editor' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.EDITOR)\"\n ></cds-tab>\n\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.SUMMARY\"\n [heading]=\"'accessControl.roles.tabs.summary' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.SUMMARY)\"\n ></cds-tab>\n\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.JSON_EDITOR\"\n [heading]=\"'accessControl.roles.tabs.jsonEditor' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.JSON_EDITOR)\"\n ></cds-tab>\n </cds-tabs>\n\n <!-- White surface for the tab content. The Carbon tab pane used to provide this; since the\n content is now rendered outside the panes, the wrapper supplies the layer background. -->\n <div class=\"access-control-editor__content\">\n @if ($activeTab() === AccessControlEditorTab.EDITOR) {\n <valtimo-access-control-form-editor-tab\n [disabled]=\"editorDisabled$ | async\"\n [model]=\"model\"\n [roleKey]=\"roleKey$ | async\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-access-control-form-editor-tab>\n }\n\n @if ($activeTab() === AccessControlEditorTab.SUMMARY) {\n <valtimo-access-control-overview-tab\n [permissions]=\"permissions$ | async\"\n [roleKey]=\"roleKey$ | async\"\n ></valtimo-access-control-overview-tab>\n }\n\n @if ($activeTab() === AccessControlEditorTab.JSON_EDITOR) {\n <valtimo-access-control-json-editor-tab\n [disabled]=\"editorDisabled$ | async\"\n [model]=\"model\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-access-control-json-editor-tab>\n }\n </div>\n</ng-container>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div\n *ngIf=\"{\n model: model$ | async,\n moreDisabled: moreDisabled$ | async,\n compactMode: compactMode$ | async,\n } as obs\"\n class=\"buttons-container\"\n >\n <v-overflow-menu class=\"overflow-button\" placement=\"bottom-end\">\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n <v-overflow-menu-option [disabled]=\"obs.moreDisabled\" (selected)=\"showEditModal()\">{{\n 'accessControl.roles.editMetadata' | translate\n }}</v-overflow-menu-option>\n\n <v-overflow-menu-option [disabled]=\"obs.moreDisabled\" (selected)=\"exportPermissions()\">{{\n 'interface.export' | translate\n }}</v-overflow-menu-option>\n\n <v-overflow-menu-option\n [disabled]=\"obs.moreDisabled\"\n type=\"danger\"\n (selected)=\"showDeleteModal()\"\n >{{ 'interface.delete' | translate }}</v-overflow-menu-option\n >\n </v-overflow-menu>\n\n <button\n [disabled]=\"saveDisabled$ | async\"\n cdsButton=\"primary\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n (click)=\"updatePermissions()\"\n >\n {{ 'interface.save' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"save\" size=\"16\"></svg>\n </button>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-delete-role-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-delete-role-modal>\n\n <valtimo-role-metadata-modal\n [defaultKeyValue]=\"obs.selectedRowKeys[0]\"\n [open]=\"showEditModal$ | async\"\n type=\"edit\"\n (closeEvent)=\"onEdit(obs.selectedRowKeys[0], $event)\"\n ></valtimo-role-metadata-modal>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".loading-container{display:flex;width:100%;justify-content:center}.overflow-button{margin-right:16px}.buttons-container{display:flex;flex-direction:row;align-items:center}.buttons-container button{height:min-content}:host ::ng-deep .cds--tab-content{background-color:var(--cds-layer);outline:none!important;padding:0}.access-control-editor__content{background-color:var(--cds-layer)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i3$1.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "component", type: i2$1.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i3$1.OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: i3$1.OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: i3$1.OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact"] }, { kind: "component", type: i2$1.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i2$1.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive", "tabContent", "templateContext"], outputs: ["selected"] }, { kind: "component", type: AccessControlJsonEditorTabComponent, selector: "valtimo-access-control-json-editor-tab", inputs: ["disabled", "model"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "component", type: AccessControlOverviewTabComponent, selector: "valtimo-access-control-overview-tab", inputs: ["roleKey", "permissions"] }, { kind: "component", type: RoleMetadataModalComponent, selector: "valtimo-role-metadata-modal", inputs: ["type", "open", "defaultKeyValue", "usedKeys"], outputs: ["closeEvent"] }, { kind: "component", type: AccessControlFormEditorTabComponent, selector: "valtimo-access-control-form-editor-tab", inputs: ["model", "disabled", "roleKey"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "component", type: DeleteRoleModalComponent, selector: "valtimo-delete-role-modal", inputs: ["deleteRowKeys", "showDeleteModal$"], outputs: ["deleteEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2585
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlEditorComponent, deps: [{ token: AccessControlService }, { token: i1$3.ActivatedRoute }, { token: i3$1.PageTitleService }, { token: i1$3.Router }, { token: i1$1.GlobalNotificationService }, { token: i1$2.TranslateService }, { token: AccessControlExportService }, { token: i3$1.PageHeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
2586
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: AccessControlEditorComponent, isStandalone: false, selector: "ng-component", viewQueries: [{ propertyName: "_formEditorTab", first: true, predicate: AccessControlFormEditorTabComponent, descendants: true }, { propertyName: "_tabs", predicate: Tab, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"model$ | async as model; else loading\">\n <!-- The headers only switch the active tab; the tab content is rendered below (gated by the\n active-tab signal) instead of inside the Carbon tab panes. Carbon removes a pane's content\n as soon as another header is clicked, which would destroy the editor's unsaved form before\n the leave-page confirmation is resolved. -->\n <cds-tabs type=\"contained\">\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.EDITOR\"\n [heading]=\"'accessControl.roles.tabs.editor' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.EDITOR)\"\n ></cds-tab>\n\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.SUMMARY\"\n [heading]=\"'accessControl.roles.tabs.summary' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.SUMMARY)\"\n ></cds-tab>\n\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.JSON_EDITOR\"\n [heading]=\"'accessControl.roles.tabs.jsonEditor' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.JSON_EDITOR)\"\n ></cds-tab>\n </cds-tabs>\n\n <!-- White surface for the tab content. The Carbon tab pane used to provide this; since the\n content is now rendered outside the panes, the wrapper supplies the layer background. -->\n <div class=\"access-control-editor__content\">\n @if ($activeTab() === AccessControlEditorTab.EDITOR) {\n <valtimo-access-control-form-editor-tab\n [disabled]=\"editorDisabled$ | async\"\n [model]=\"model\"\n [roleKey]=\"roleKey$ | async\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-access-control-form-editor-tab>\n }\n\n @if ($activeTab() === AccessControlEditorTab.SUMMARY) {\n <valtimo-access-control-overview-tab\n [permissions]=\"permissions$ | async\"\n [roleKey]=\"roleKey$ | async\"\n ></valtimo-access-control-overview-tab>\n }\n\n @if ($activeTab() === AccessControlEditorTab.JSON_EDITOR) {\n <valtimo-access-control-json-editor-tab\n [disabled]=\"editorDisabled$ | async\"\n [model]=\"model\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-access-control-json-editor-tab>\n }\n </div>\n</ng-container>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div\n *ngIf=\"{\n model: model$ | async,\n moreDisabled: moreDisabled$ | async,\n compactMode: compactMode$ | async,\n } as obs\"\n class=\"buttons-container\"\n >\n <v-overflow-menu class=\"overflow-button\" placement=\"bottom-end\">\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n <v-overflow-menu-option [disabled]=\"obs.moreDisabled\" (selected)=\"showEditModal()\">{{\n 'accessControl.roles.editMetadata' | translate\n }}</v-overflow-menu-option>\n\n <v-overflow-menu-option [disabled]=\"obs.moreDisabled\" (selected)=\"exportPermissions()\">{{\n 'interface.export' | translate\n }}</v-overflow-menu-option>\n\n <v-overflow-menu-option\n [disabled]=\"obs.moreDisabled\"\n type=\"danger\"\n (selected)=\"showDeleteModal()\"\n >{{ 'interface.delete' | translate }}</v-overflow-menu-option\n >\n </v-overflow-menu>\n\n <button\n [disabled]=\"saveDisabled$ | async\"\n cdsButton=\"primary\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n (click)=\"updatePermissions()\"\n >\n {{ 'interface.save' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"save\" size=\"16\"></svg>\n </button>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-delete-role-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-delete-role-modal>\n\n <valtimo-role-metadata-modal\n [defaultKeyValue]=\"obs.selectedRowKeys[0]\"\n [open]=\"showEditModal$ | async\"\n type=\"edit\"\n (closeEvent)=\"onEdit(obs.selectedRowKeys[0], $event)\"\n ></valtimo-role-metadata-modal>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".loading-container{display:flex;width:100%;justify-content:center}.overflow-button{margin-right:16px}.buttons-container{display:flex;flex-direction:row;align-items:center}.buttons-container button{height:min-content}:host ::ng-deep .cds--tab-content{background-color:var(--cds-layer);outline:none!important;padding:0}.access-control-editor__content{background-color:var(--cds-layer)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i2$1.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i3$1.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "component", type: i2$1.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i3$1.OverflowMenuComponent, selector: "v-overflow-menu", inputs: ["open", "placement", "menuWidth", "offsetX", "offsetY", "closeOnSelect", "useHostAsReference", "portalToBody"], outputs: ["openChange"] }, { kind: "component", type: i3$1.OverflowMenuOptionComponent, selector: "v-overflow-menu-option", inputs: ["disabled", "type", "testId", "optionId"], outputs: ["selected"] }, { kind: "component", type: i3$1.OverflowMenuTriggerComponent, selector: "v-overflow-menu-trigger", inputs: ["compact"] }, { kind: "component", type: i2$1.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i2$1.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive", "tabContent", "templateContext"], outputs: ["selected"] }, { kind: "component", type: AccessControlJsonEditorTabComponent, selector: "valtimo-access-control-json-editor-tab", inputs: ["disabled", "model"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "component", type: AccessControlOverviewTabComponent, selector: "valtimo-access-control-overview-tab", inputs: ["roleKey", "permissions"] }, { kind: "component", type: RoleMetadataModalComponent, selector: "valtimo-role-metadata-modal", inputs: ["type", "open", "defaultKeyValue", "usedKeys"], outputs: ["closeEvent"] }, { kind: "component", type: AccessControlFormEditorTabComponent, selector: "valtimo-access-control-form-editor-tab", inputs: ["model", "disabled", "roleKey"], outputs: ["validEvent", "valueChangeEvent"] }, { kind: "component", type: DeleteRoleModalComponent, selector: "valtimo-delete-role-modal", inputs: ["deleteRowKeys", "showDeleteModal$"], outputs: ["deleteEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2587
2587
  }
2588
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlEditorComponent, decorators: [{
2588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlEditorComponent, decorators: [{
2589
2589
  type: Component,
2590
2590
  args: [{ standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container *ngIf=\"model$ | async as model; else loading\">\n <!-- The headers only switch the active tab; the tab content is rendered below (gated by the\n active-tab signal) instead of inside the Carbon tab panes. Carbon removes a pane's content\n as soon as another header is clicked, which would destroy the editor's unsaved form before\n the leave-page confirmation is resolved. -->\n <cds-tabs type=\"contained\">\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.EDITOR\"\n [heading]=\"'accessControl.roles.tabs.editor' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.EDITOR)\"\n ></cds-tab>\n\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.SUMMARY\"\n [heading]=\"'accessControl.roles.tabs.summary' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.SUMMARY)\"\n ></cds-tab>\n\n <cds-tab\n [active]=\"$activeTab() === AccessControlEditorTab.JSON_EDITOR\"\n [heading]=\"'accessControl.roles.tabs.jsonEditor' | translate\"\n (selected)=\"setActiveTab(AccessControlEditorTab.JSON_EDITOR)\"\n ></cds-tab>\n </cds-tabs>\n\n <!-- White surface for the tab content. The Carbon tab pane used to provide this; since the\n content is now rendered outside the panes, the wrapper supplies the layer background. -->\n <div class=\"access-control-editor__content\">\n @if ($activeTab() === AccessControlEditorTab.EDITOR) {\n <valtimo-access-control-form-editor-tab\n [disabled]=\"editorDisabled$ | async\"\n [model]=\"model\"\n [roleKey]=\"roleKey$ | async\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-access-control-form-editor-tab>\n }\n\n @if ($activeTab() === AccessControlEditorTab.SUMMARY) {\n <valtimo-access-control-overview-tab\n [permissions]=\"permissions$ | async\"\n [roleKey]=\"roleKey$ | async\"\n ></valtimo-access-control-overview-tab>\n }\n\n @if ($activeTab() === AccessControlEditorTab.JSON_EDITOR) {\n <valtimo-access-control-json-editor-tab\n [disabled]=\"editorDisabled$ | async\"\n [model]=\"model\"\n (validEvent)=\"onValid($event)\"\n (valueChangeEvent)=\"onValueChange($event)\"\n ></valtimo-access-control-json-editor-tab>\n }\n </div>\n</ng-container>\n\n<ng-container renderInPageHeader>\n <ng-template>\n <div\n *ngIf=\"{\n model: model$ | async,\n moreDisabled: moreDisabled$ | async,\n compactMode: compactMode$ | async,\n } as obs\"\n class=\"buttons-container\"\n >\n <v-overflow-menu class=\"overflow-button\" placement=\"bottom-end\">\n <v-overflow-menu-trigger overflowTrigger></v-overflow-menu-trigger>\n <v-overflow-menu-option [disabled]=\"obs.moreDisabled\" (selected)=\"showEditModal()\">{{\n 'accessControl.roles.editMetadata' | translate\n }}</v-overflow-menu-option>\n\n <v-overflow-menu-option [disabled]=\"obs.moreDisabled\" (selected)=\"exportPermissions()\">{{\n 'interface.export' | translate\n }}</v-overflow-menu-option>\n\n <v-overflow-menu-option\n [disabled]=\"obs.moreDisabled\"\n type=\"danger\"\n (selected)=\"showDeleteModal()\"\n >{{ 'interface.delete' | translate }}</v-overflow-menu-option\n >\n </v-overflow-menu>\n\n <button\n [disabled]=\"saveDisabled$ | async\"\n cdsButton=\"primary\"\n [size]=\"obs.compactMode ? 'sm' : 'md'\"\n (click)=\"updatePermissions()\"\n >\n {{ 'interface.save' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"save\" size=\"16\"></svg>\n </button>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-container *ngIf=\"{selectedRowKeys: selectedRowKeys$ | async} as obs\">\n <valtimo-delete-role-modal\n [deleteRowKeys]=\"obs.selectedRowKeys\"\n [showDeleteModal$]=\"showDeleteModal$\"\n (deleteEvent)=\"onDelete($event)\"\n >\n </valtimo-delete-role-modal>\n\n <valtimo-role-metadata-modal\n [defaultKeyValue]=\"obs.selectedRowKeys[0]\"\n [open]=\"showEditModal$ | async\"\n type=\"edit\"\n (closeEvent)=\"onEdit(obs.selectedRowKeys[0], $event)\"\n ></valtimo-role-metadata-modal>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n</ng-template>\n", styles: [".loading-container{display:flex;width:100%;justify-content:center}.overflow-button{margin-right:16px}.buttons-container{display:flex;flex-direction:row;align-items:center}.buttons-container button{height:min-content}:host ::ng-deep .cds--tab-content{background-color:var(--cds-layer);outline:none!important;padding:0}.access-control-editor__content{background-color:var(--cds-layer)}\n/*!\n * Copyright 2015-2025 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
2591
2591
  }], ctorParameters: () => [{ type: AccessControlService }, { type: i1$3.ActivatedRoute }, { type: i3$1.PageTitleService }, { type: i1$3.Router }, { type: i1$1.GlobalNotificationService }, { type: i1$2.TranslateService }, { type: AccessControlExportService }, { type: i3$1.PageHeaderService }], propDecorators: { _tabs: [{
@@ -2653,11 +2653,11 @@ const routes = [
2653
2653
  },
2654
2654
  ];
2655
2655
  class AccessControlManagementRoutingModule {
2656
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2657
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementRoutingModule, imports: [CommonModule, i1$3.RouterModule], exports: [RouterModule] }); }
2658
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementRoutingModule, imports: [CommonModule, RouterModule.forChild(routes), RouterModule] }); }
2656
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2657
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementRoutingModule, imports: [CommonModule, i1$3.RouterModule], exports: [RouterModule] }); }
2658
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementRoutingModule, imports: [CommonModule, RouterModule.forChild(routes), RouterModule] }); }
2659
2659
  }
2660
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementRoutingModule, decorators: [{
2660
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementRoutingModule, decorators: [{
2661
2661
  type: NgModule,
2662
2662
  args: [{
2663
2663
  imports: [CommonModule, RouterModule.forChild(routes)],
@@ -2681,8 +2681,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
2681
2681
  * limitations under the License.
2682
2682
  */
2683
2683
  class AccessControlManagementModule {
2684
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2685
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementModule, declarations: [AccessControlOverviewComponent,
2684
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2685
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementModule, declarations: [AccessControlOverviewComponent,
2686
2686
  RoleMetadataModalComponent,
2687
2687
  AccessControlEditorComponent,
2688
2688
  AccessControlFormEditorTabComponent,
@@ -2722,7 +2722,7 @@ class AccessControlManagementModule {
2722
2722
  ActionLabelPipe,
2723
2723
  ActionDescriptionPipe,
2724
2724
  ActionTagTypePipe] }); }
2725
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementModule, imports: [CommonModule,
2725
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementModule, imports: [CommonModule,
2726
2726
  AccessControlManagementRoutingModule,
2727
2727
  ButtonModule,
2728
2728
  FormsModule,
@@ -2751,7 +2751,7 @@ class AccessControlManagementModule {
2751
2751
  AccessControlJsonEditorTabComponent,
2752
2752
  AccessControlOverviewTabComponent] }); }
2753
2753
  }
2754
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AccessControlManagementModule, decorators: [{
2754
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccessControlManagementModule, decorators: [{
2755
2755
  type: NgModule,
2756
2756
  args: [{
2757
2757
  declarations: [