@valtimo/access-control-management 13.36.1 → 13.38.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.
|
|
683
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
799
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
886
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
951
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1062
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1102
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1167
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1281
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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", "initialSearchValue", "searchDebounceMs", "invalidSearchFields", "searchFields", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled", "expandedRowTemplate", "expandedRowKey"], 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.
|
|
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.
|
|
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.
|
|
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.
|
|
1475
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1516
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1553
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1992
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
2154
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
2202
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
2586
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
2657
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.
|
|
2658
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
2685
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
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: [
|