{"version":3,"file":"valtimo-access-control-management.mjs","sources":["../../../../projects/valtimo/access-control-management/src/lib/models/access-control-editor-tab.model.ts","../../../../projects/valtimo/access-control-management/src/lib/models/pbac-editor.model.ts","../../../../projects/valtimo/access-control-management/src/lib/models/permission.model.ts","../../../../projects/valtimo/access-control-management/src/lib/models/permission-schema.model.ts","../../../../projects/valtimo/access-control-management/src/lib/models/role.model.ts","../../../../projects/valtimo/access-control-management/src/lib/models/index.ts","../../../../projects/valtimo/access-control-management/src/lib/constants/access-control-editor.test-ids.ts","../../../../projects/valtimo/access-control-management/src/lib/constants/access-control-labels.ts","../../../../projects/valtimo/access-control-management/src/lib/constants/index.ts","../../../../projects/valtimo/access-control-management/src/lib/utils/condition-value.ts","../../../../projects/valtimo/access-control-management/src/lib/utils/format-condition.ts","../../../../projects/valtimo/access-control-management/src/lib/utils/resource-name.ts","../../../../projects/valtimo/access-control-management/src/lib/utils/index.ts","../../../../projects/valtimo/access-control-management/src/lib/services/access-control-form-editor.service.ts","../../../../projects/valtimo/access-control-management/src/lib/services/access-control.service.ts","../../../../projects/valtimo/access-control-management/src/lib/services/permission-schema-metadata.service.ts","../../../../projects/valtimo/access-control-management/src/lib/services/index.ts","../../../../projects/valtimo/access-control-management/src/lib/services/access-control-export.service.ts","../../../../projects/valtimo/access-control-management/src/lib/components/role-metadata-modal/role-metadata-modal.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/role-metadata-modal/role-metadata-modal.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/delete-role-modal/delete-role-modal.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/delete-role-modal/delete-role-modal.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/export-role-modal/export-role-modal.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/export-role-modal/export-role-modal.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/overview/access-control-overview.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/overview/access-control-overview.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/condition-tree/condition-tree.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/condition-tree/condition-tree.component.html","../../../../projects/valtimo/access-control-management/src/lib/pipes/action-label.pipe.ts","../../../../projects/valtimo/access-control-management/src/lib/pipes/action-description.pipe.ts","../../../../projects/valtimo/access-control-management/src/lib/pipes/action-tag-type.pipe.ts","../../../../projects/valtimo/access-control-management/src/lib/components/permission-form/permission-form.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/permission-form/permission-form.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/access-control-form-editor-tab/access-control-form-editor-tab.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/access-control-form-editor-tab/access-control-form-editor-tab.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/access-control-json-editor-tab/access-control-json-editor-tab.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/access-control-json-editor-tab/access-control-json-editor-tab.component.html","../../../../projects/valtimo/access-control-management/src/lib/pipes/resource-type-label.pipe.ts","../../../../projects/valtimo/access-control-management/src/lib/pipes/index.ts","../../../../projects/valtimo/access-control-management/src/lib/components/access-control-overview-tab/access-control-overview-tab.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/access-control-overview-tab/access-control-overview-tab.component.html","../../../../projects/valtimo/access-control-management/src/lib/components/editor/access-control-editor.component.ts","../../../../projects/valtimo/access-control-management/src/lib/components/editor/access-control-editor.component.html","../../../../projects/valtimo/access-control-management/src/lib/access-control-management-routing.module.ts","../../../../projects/valtimo/access-control-management/src/lib/access-control-management.module.ts","../../../../projects/valtimo/access-control-management/src/public-api.ts","../../../../projects/valtimo/access-control-management/src/valtimo-access-control-management.ts"],"sourcesContent":["/*\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\nenum AccessControlEditorTab {\n  SUMMARY = 'summary',\n  EDITOR = 'editor',\n  JSON_EDITOR = 'jsonEditor',\n}\n\ninterface AccessControlFilter {\n  resourceType: string | null;\n  action: string | null;\n}\n\nexport {AccessControlEditorTab, AccessControlFilter};\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\nimport {PermissionCondition} from './permission.model';\n\n// The condition kinds supported by the form editor. Mirrors the backend\n// PermissionConditionType discriminator (serialized lowercase as the \"type\" property).\ntype ConditionType = 'field' | 'expression' | 'container';\n\n// The exact shape expected by PUT /api/management/v1/roles/{roleKey}/permissions\n// (com.ritense.authorization.web.request.UpdateRolePermissionRequest). The form editor\n// serializes its reactive form to a list of these.\ninterface UpdateRolePermission {\n  resourceType: string;\n  actions: string[];\n  conditions: PermissionCondition[];\n  contextResourceType?: string;\n  contextConditions?: PermissionCondition[];\n}\n\nexport {ConditionType, UpdateRolePermission};\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\ntype ConditionOperator = '==' | '!=' | '>' | '>=' | '<' | '<=' | 'in' | 'list_contains';\n\ninterface FieldCondition {\n  type: 'field';\n  field: string;\n  operator: ConditionOperator;\n  value: unknown;\n}\n\ninterface ExpressionCondition {\n  type: 'expression';\n  field: string;\n  path: string;\n  operator: ConditionOperator;\n  value: unknown;\n  clazz: string;\n}\n\ninterface ContainerCondition {\n  type: 'container';\n  resourceType: string;\n  conditions: PermissionCondition[];\n}\n\ntype PermissionCondition = FieldCondition | ExpressionCondition | ContainerCondition;\n\ninterface Permission {\n  resourceType: string;\n  action?: string;\n  actions?: string[];\n  roleKey: string;\n  conditions?: PermissionCondition[];\n  contextResourceType?: string;\n  contextConditions?: PermissionCondition[];\n}\n\ninterface ResourcePermissionGroup {\n  resourceType: string;\n  permissions: Permission[];\n}\n\nexport {\n  ConditionOperator,\n  ContainerCondition,\n  ExpressionCondition,\n  FieldCondition,\n  Permission,\n  PermissionCondition,\n  ResourcePermissionGroup,\n};\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\n// JSON Schema returned by GET /api/management/v1/permissions/schema. Passed to the Monaco\n// JSON editor (via valtimo-editor [jsonSchema]) to drive validation and autocomplete.\ntype PermissionSchema = object;\n\ninterface SchemaAllOfBranch {\n  if?: {properties?: {resourceType?: {const?: string}}};\n  then?: {properties?: {action?: {enum?: string[]}}};\n}\n\ninterface SchemaOneOfEntry {\n  const?: string;\n}\n\ninterface SchemaCondListVariant {\n  allOf?: Array<{$ref?: string; properties?: {field?: {enum?: string[]}}}>;\n}\n\ninterface SchemaCondListDefinition {\n  items?: {oneOf?: SchemaCondListVariant[]};\n}\n\ninterface SchemaShape {\n  items?: {\n    allOf?: SchemaAllOfBranch[];\n    properties?: {resourceType?: {oneOf?: SchemaOneOfEntry[]}};\n  };\n  definitions?: Record<string, SchemaCondListDefinition>;\n}\n\nexport {PermissionSchema, SchemaShape};\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\ninterface Role {\n  roleKey: string;\n}\n\ninterface DeleteRolesRequest {\n  roles: Array<string>;\n}\n\ntype RoleMetadataModal = 'add' | 'edit';\n\ntype RoleExport = 'unified' | 'separate';\n\ninterface ExportRoleOutput {\n  roleKeys: Array<string>;\n  type: RoleExport;\n}\n\nexport {Role, DeleteRolesRequest, RoleMetadataModal, RoleExport, ExportRoleOutput};\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\nexport * from './access-control-editor-tab.model';\nexport * from './pbac-editor.model';\nexport * from './permission.model';\nexport * from './permission-schema.model';\nexport * from './role.model';\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\nconst ACCESS_CONTROL_EDITOR_TEST_IDS = {\n  addPermissionButton: 'accessControlEditorAddPermission',\n  permissionListItem: 'accessControlEditorPermissionListItem',\n  permissionCard: 'accessControlEditorPermissionCard',\n  removePermissionButton: 'accessControlEditorRemovePermission',\n  resourceTypeSelect: 'accessControlEditorResourceType',\n  actionsSelect: 'accessControlEditorActions',\n  contextToggle: 'accessControlEditorContextToggle',\n  contextResourceTypeSelect: 'accessControlEditorContextResourceType',\n  addConditionButton: 'accessControlEditorAddCondition',\n  removeConditionButton: 'accessControlEditorRemoveCondition',\n  conditionTypeSelect: 'accessControlEditorConditionType',\n  conditionFieldSelect: 'accessControlEditorConditionField',\n  conditionOperatorSelect: 'accessControlEditorConditionOperator',\n  conditionValueInput: 'accessControlEditorConditionValue',\n  conditionPathInput: 'accessControlEditorConditionPath',\n  conditionClazzInput: 'accessControlEditorConditionClazz',\n} as const;\n\nexport {ACCESS_CONTROL_EDITOR_TEST_IDS};\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\nimport {ConditionOperator} from '../models';\n\nconst OPERATOR_LABEL: Record<ConditionOperator, string> = {\n  '==': 'accessControl.overview.operators.eq',\n  '!=': 'accessControl.overview.operators.neq',\n  '>': 'accessControl.overview.operators.gt',\n  '>=': 'accessControl.overview.operators.gte',\n  '<': 'accessControl.overview.operators.lt',\n  '<=': 'accessControl.overview.operators.lte',\n  in: 'accessControl.overview.operators.in',\n  list_contains: 'accessControl.overview.operators.list_contains',\n};\n\nconst NO_CONTEXT_RESOURCE_TYPE = 'com.ritense.authorization.NoContext';\n\n// Each permission action is shown as a Carbon tag; every kind gets its own colour so they are\n// distinguishable at a glance. The palette combines Carbon's built-in tag colours with the extended\n// case-widget colours (orange, yellow, periwinkle, light-green, brown — registered globally in\n// carbon.scss), avoiding high-contrast, outline and the grays. Related actions share a hue family:\n// create/complete are greens, modify/inspect_modify are purples.\nconst ACTION_TAG_TYPE: Record<string, string> = {\n  view: 'blue',\n  view_list: 'cyan',\n  inspect: 'teal',\n  inspect_modify: 'periwinkle',\n  modify: 'purple',\n  create: 'green',\n  complete: 'light-green',\n  delete: 'red',\n  assign: 'orange',\n  assignable: 'yellow',\n  claim: 'magenta',\n  export: 'brown',\n};\n\n// Fallback colour for any action not listed above (an unmapped/custom action).\nconst DEFAULT_ACTION_TAG_TYPE = 'gray';\n\nexport {ACTION_TAG_TYPE, DEFAULT_ACTION_TAG_TYPE, NO_CONTEXT_RESOURCE_TYPE, OPERATOR_LABEL};\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\nexport * from './access-control-editor.test-ids';\nexport * from './access-control-labels';\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\n// A permission condition value is generically typed on the backend (a string, number, boolean,\n// null, list or object). The form editor edits it through a single text field, so we need a\n// lossless-as-possible bridge between the stored value and its text representation.\n\n/**\n * Render a stored condition value as editable text.\n * - undefined -> empty string (no value set, e.g. a freshly-added condition)\n * - null -> the literal \"null\" (so an intentional null reads as deliberate rather than an unfilled\n *   field, and still round-trips back to null through textToValue)\n * - string -> the raw string (so '${currentUserId}' and 'someKey' show without quotes)\n * - everything else (number, boolean, array, object) -> its JSON representation\n */\nfunction valueToText(value: unknown): string {\n  if (value === undefined) return '';\n  if (value === null) return 'null';\n  if (typeof value === 'string') return value;\n  return JSON.stringify(value);\n}\n\n/**\n * Parse editable text back into a stored condition value.\n * - empty string -> null\n * - valid JSON (number, boolean, null, array, object, quoted string) -> the parsed value\n * - anything else -> the raw string (so 'view' or '${currentUserId}' stay strings)\n */\nfunction textToValue(text: string): unknown {\n  const trimmed = (text ?? '').trim();\n  if (trimmed === '') return null;\n  try {\n    return JSON.parse(trimmed);\n  } catch {\n    return text;\n  }\n}\n\nexport {textToValue, valueToText};\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\nimport {TranslateService} from '@ngx-translate/core';\nimport {OPERATOR_LABEL} from '../constants';\nimport {ConditionOperator} from '../models';\n\nconst SPECIAL_VALUE_PATTERN = /^\\$\\{([A-Za-z_$][A-Za-z0-9_$]*)\\}$/;\n\nfunction lowerFirst(s: string): string {\n  return s.charAt(0).toLowerCase() + s.slice(1);\n}\n\nfunction upperFirst(s: string): string {\n  return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction resourceTypeI18nKey(fqn: string): string | null {\n  const lastSegment = fqn.split('.').pop();\n  if (!lastSegment) return null;\n  return `accessControl.resourceTypes.${lowerFirst(lastSegment)}`;\n}\n\nfunction fieldI18nKey(resourceType: string, field: string): string | null {\n  const resourceSegment = resourceType.split('.').pop();\n  if (!resourceSegment || !field) return null;\n  const fieldSegment = field\n    .split('.')\n    .map((part, i) => (i === 0 ? part : upperFirst(part)))\n    .join('');\n  return `accessControl.overview.fields.${lowerFirst(resourceSegment)}.${fieldSegment}`;\n}\n\nfunction tryTranslate(translate: TranslateService, key: string): string | null {\n  const translated = translate.instant(key);\n  return translated === key ? null : translated;\n}\n\nfunction formatResourceType(translate: TranslateService, fqn: string): string {\n  const key = resourceTypeI18nKey(fqn);\n  const translated = key ? tryTranslate(translate, key) : null;\n  if (translated !== null) return translated;\n  const segments = fqn.split('.');\n  return segments[segments.length - 1] || fqn;\n}\n\nfunction formatField(translate: TranslateService, resourceType: string, field: string): string {\n  const key = fieldI18nKey(resourceType, field);\n  const translated = key ? tryTranslate(translate, key) : null;\n  if (translated !== null) return translated;\n  return humanizeFieldPath(field);\n}\n\nfunction formatOperator(translate: TranslateService, operator: ConditionOperator): string {\n  const key = OPERATOR_LABEL[operator];\n  return key ? translate.instant(key) : operator;\n}\n\nfunction formatValue(translate: TranslateService, value: unknown): string {\n  if (value === null) {\n    return translate.instant('accessControl.overview.specialValues.null');\n  }\n  if (typeof value === 'string') {\n    if (value === '') return translate.instant('accessControl.overview.specialValues.empty');\n    const match = SPECIAL_VALUE_PATTERN.exec(value);\n    if (match) {\n      const key = `accessControl.overview.specialValues.${match[1]}`;\n      const translated = tryTranslate(translate, key);\n      if (translated !== null) return translated;\n    }\n    return value;\n  }\n  if (Array.isArray(value)) {\n    return value.map(item => formatValue(translate, item)).join(', ');\n  }\n  // Objects (and any other non-primitive) are shown as JSON rather than \"[object Object]\".\n  return JSON.stringify(value);\n}\n\nfunction humanizeFieldPath(field: string): string {\n  return field\n    .split('.')\n    .map(part => part.replace(/([a-z0-9])([A-Z])/g, '$1 $2').toLowerCase())\n    .join(' ');\n}\n\nexport {formatField, formatOperator, formatResourceType, formatValue, humanizeFieldPath};\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\nimport {SelectItem} from '@valtimo/components';\n\n// The short (simple) name of a fully-qualified type, e.g. \"CaseDefinition\" for\n// \"com.ritense.case_.domain.definition.CaseDefinition\".\nfunction shortTypeName(fullyQualifiedName: string): string {\n  if (!fullyQualifiedName) return '';\n  return fullyQualifiedName.substring(fullyQualifiedName.lastIndexOf('.') + 1);\n}\n\n// A select item labelled \"ShortName (fully.qualified.Name)\", keeping the fully-qualified name as the\n// stored id. Used for the resource-type, related-resource and value-type dropdowns so the readable\n// name is shown while the exact technical type is what gets persisted.\nfunction fqnSelectItem(fullyQualifiedName: string): SelectItem {\n  return {\n    id: fullyQualifiedName,\n    text: `${shortTypeName(fullyQualifiedName)} (${fullyQualifiedName})`,\n  };\n}\n\nexport {fqnSelectItem, shortTypeName};\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\nexport * from './condition-value';\nexport * from './format-condition';\nexport * from './resource-name';\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\nimport {Injectable} from '@angular/core';\nimport {\n  AbstractControl,\n  FormArray,\n  FormBuilder,\n  FormGroup,\n  ValidationErrors,\n  ValidatorFn,\n  Validators,\n} from '@angular/forms';\nimport {SelectItem} from '@valtimo/components';\nimport {PbacRegistryDto, PbacResourceDto} from '@valtimo/shared';\nimport {NO_CONTEXT_RESOURCE_TYPE, OPERATOR_LABEL} from '../constants';\nimport {\n  ConditionOperator,\n  ConditionType,\n  Permission,\n  PermissionCondition,\n  UpdateRolePermission,\n} from '../models';\nimport {fqnSelectItem, shortTypeName, textToValue, valueToText} from '../utils';\n\n// Common Java value types offered in the \"Value type\" dropdown for JSON-field (expression)\n// conditions. Users can still enter any other fully-qualified type manually; String is the default.\nconst VALUE_TYPE_OPTIONS = [\n  'java.lang.String',\n  'java.lang.Boolean',\n  'java.lang.Integer',\n  'java.lang.Long',\n  'java.lang.Double',\n  'java.math.BigDecimal',\n  'java.util.Collection',\n  'java.time.LocalDate',\n  'java.time.LocalDateTime',\n];\nconst DEFAULT_VALUE_TYPE = 'java.lang.String';\n\n@Injectable()\nexport class AccessControlFormEditorService {\n  private _resources: PbacResourceDto[] = [];\n  private _resourceByType: Record<string, PbacResourceDto> = {};\n  private _operatorKeys: ConditionOperator[] = [];\n\n  constructor(private readonly fb: FormBuilder) {}\n\n  public setRegistry(registry: PbacRegistryDto): void {\n    this._resources = registry.resources;\n    this._resourceByType = registry.resources.reduce<Record<string, PbacResourceDto>>(\n      (acc, resource) => {\n        acc[resource.resourceType] = resource;\n        return acc;\n      },\n      {}\n    );\n    this._operatorKeys = registry.operators.map(operator => operator.key as ConditionOperator);\n  }\n\n  // ----- Form construction -----\n\n  public buildPermissionsArray(permissions: Permission[]): FormArray {\n    return this.fb.array(permissions.map(permission => this.createPermissionGroup(permission)));\n  }\n\n  public createPermissionGroup(permission?: Permission): FormGroup {\n    const conditions = permission?.conditions ?? [];\n    const contextConditions = permission?.contextConditions ?? [];\n\n    return this.fb.group({\n      resourceType: this.fb.control(permission?.resourceType ?? '', Validators.required),\n      actions: this.fb.control(this.normalizeActions(permission), minSelectedArrayValidator(1)),\n      conditions: this.fb.array(conditions.map(condition => this.createConditionGroup(condition))),\n      // Context is opt-in via a toggle. `hasContext` off means \"no context at all\" — nothing about\n      // context is serialized. On means the permission is scoped to the selected context resource,\n      // which may be a real related resource or the \"No context\" marker (itself a deliberate,\n      // distinct choice, as opposed to leaving context off entirely). The resource defaults to the\n      // marker so the dropdown always has a valid, non-empty value while the toggle is on.\n      hasContext: this.fb.control(!!permission?.contextResourceType),\n      contextResourceType: this.fb.control(\n        permission?.contextResourceType || NO_CONTEXT_RESOURCE_TYPE\n      ),\n      contextConditions: this.fb.array(\n        contextConditions.map(condition => this.createConditionGroup(condition))\n      ),\n    });\n  }\n\n  public createConditionGroup(condition?: PermissionCondition, type?: ConditionType): FormGroup {\n    const conditionType: ConditionType = condition?.type ?? type ?? 'field';\n    const nested = condition && condition.type === 'container' ? (condition.conditions ?? []) : [];\n\n    return this.fb.group(\n      {\n        type: this.fb.control<ConditionType>(conditionType),\n        field: this.fb.control(this.conditionField(condition)),\n        operator: this.fb.control<ConditionOperator>(this.conditionOperator(condition)),\n        value: this.fb.control(valueToText(this.conditionValue(condition))),\n        path: this.fb.control(condition && condition.type === 'expression' ? condition.path : ''),\n        clazz: this.fb.control(this.conditionClazz(condition)),\n        // Whether the value type is entered manually (a custom class) rather than picked from the\n        // preset dropdown. UI-only; not serialized.\n        clazzManual: this.fb.control(this.isCustomValueType(this.conditionClazz(condition))),\n        resourceType: this.fb.control(\n          condition && condition.type === 'container' ? condition.resourceType : ''\n        ),\n        conditions: this.fb.array(nested.map(child => this.createConditionGroup(child))),\n      },\n      {validators: conditionValidator}\n    );\n  }\n\n  // ----- Serialization back to the PUT contract -----\n\n  public serialize(permissionsArray: FormArray): UpdateRolePermission[] {\n    return permissionsArray.controls.map(control => this.serializePermission(control as FormGroup));\n  }\n\n  public serializePermission(group: FormGroup): UpdateRolePermission {\n    const result: UpdateRolePermission = {\n      resourceType: group.get('resourceType')!.value,\n      actions: group.get('actions')!.value ?? [],\n      conditions: this.serializeConditions(group.get('conditions') as FormArray),\n    };\n\n    // Context is only written when the toggle is on. The selected resource may be a real related\n    // resource or the \"No context\" marker (a distinct, deliberate choice); either way it is\n    // persisted. Toggling context off drops the context fields entirely.\n    if (group.get('hasContext')!.value) {\n      result.contextResourceType = group.get('contextResourceType')!.value;\n      result.contextConditions = this.serializeConditions(\n        group.get('contextConditions') as FormArray\n      );\n    }\n\n    return result;\n  }\n\n  private serializeConditions(conditionsArray: FormArray): PermissionCondition[] {\n    return conditionsArray.controls.map(control => {\n      const group = control as FormGroup;\n      const type: ConditionType = group.get('type')!.value;\n\n      if (type === 'container') {\n        return {\n          type: 'container',\n          resourceType: group.get('resourceType')!.value,\n          conditions: this.serializeConditions(group.get('conditions') as FormArray),\n        };\n      }\n\n      if (type === 'expression') {\n        return {\n          type: 'expression',\n          field: group.get('field')!.value,\n          path: group.get('path')!.value,\n          operator: group.get('operator')!.value,\n          value: textToValue(group.get('value')!.value),\n          clazz: group.get('clazz')!.value,\n        };\n      }\n\n      return {\n        type: 'field',\n        field: group.get('field')!.value,\n        operator: group.get('operator')!.value,\n        value: textToValue(group.get('value')!.value),\n      };\n    });\n  }\n\n  // ----- Registry-driven select options -----\n\n  // Resource types, fields and container targets are shown by their raw technical name (the exact\n  // value written to the permission JSON). Actions, operators and condition types instead use\n  // natural-language labels (actions fall back to the technical key when untranslated).\n  public resourceTypeItems(include?: string | string[] | null): SelectItem[] {\n    // Shown as \"ShortName (fully.qualified.Name)\" — the readable short name up front, with the exact\n    // technical type it maps to in parentheses. The stored value (id) stays the fully-qualified name.\n    const items = this._resources.map(resource => ({\n      id: resource.resourceType,\n      text: `${resource.shortName || shortTypeName(resource.resourceType)} (${resource.resourceType})`,\n    }));\n    return this.sortByText(this.withIncluded(items, include));\n  }\n\n  // The context options are \"No context\" plus the resource types reachable from the permission's\n  // resource type via an entity mapper (the same set as the container-condition targets). \"No\n  // context\" maps to the backend NoContext marker.\n  public contextResourceTypeItems(\n    resourceType: string,\n    include?: string | string[] | null\n  ): SelectItem[] {\n    const noContext: SelectItem = {\n      id: NO_CONTEXT_RESOURCE_TYPE,\n      translationKey: 'accessControl.overview.noContext',\n    };\n    // \"No context\" is added explicitly here, so the NoContext marker must never also be\n    // force-included among the container targets: doing so appends a second item with the same id\n    // (the marker is not a real target), which renders as a duplicate row and two selected\n    // checkmarks. Only real resources are kept visible via `include`.\n    const targetInclude = Array.isArray(include)\n      ? include.filter(value => value !== NO_CONTEXT_RESOURCE_TYPE)\n      : include === NO_CONTEXT_RESOURCE_TYPE\n        ? null\n        : include;\n    return [noContext, ...this.containerTargetItems(resourceType, targetInclude)];\n  }\n\n  public actionItems(resourceType: string, include?: string | string[] | null): SelectItem[] {\n    // Actions come straight from the resource in the PBAC registry (the backend discovers every\n    // ResourceActionProvider on the classpath), so no separate action map is needed.\n    const actions = this._resourceByType[resourceType]?.actions ?? [];\n    const items = actions.map(action => ({\n      id: action,\n      text: action,\n    }));\n    return this.withIncluded(items, include);\n  }\n\n  public fieldItems(resourceType: string, include?: string | string[] | null): SelectItem[] {\n    const resource = this._resourceByType[resourceType];\n    const names = new Set<string>();\n    // Only string names are kept; a malformed registry entry must not render as \"[object Object]\".\n    for (const field of resource?.fields ?? []) {\n      if (typeof field?.name === 'string' && field.name) names.add(field.name);\n    }\n    for (const alias of resource?.fieldAliases ?? []) {\n      if (typeof alias?.alias === 'string' && alias.alias) names.add(alias.alias);\n    }\n    // Fields are shown by their technical name (e.g. \"isFinal\", \"createdBy\") since that is the\n    // exact value used in the permission condition.\n    const items = Array.from(names).map(name => ({id: name, text: name}));\n    return this.sortByText(this.withIncluded(items, include));\n  }\n\n  public containerTargetItems(\n    resourceType: string,\n    include?: string | string[] | null\n  ): SelectItem[] {\n    const targets = this._resourceByType[resourceType]?.containerTargets ?? [];\n    // Shown as \"ShortName (fully.qualified.Name)\", like the resource-type dropdown. The stored value\n    // (id) stays the fully-qualified name.\n    const items = targets.map(fqnSelectItem);\n    return this.sortByText(this.withIncluded(items, include));\n  }\n\n  public operatorItems(): SelectItem[] {\n    // Operators are shown in natural language (e.g. \"equals\", \"is greater than\") via their\n    // translation key; the stored value stays the technical symbol (the item id).\n    return this._operatorKeys.map(key => ({\n      id: key,\n      translationKey: OPERATOR_LABEL[key],\n    }));\n  }\n\n  // Preset value types for JSON-field (expression) conditions, shown as \"ShortName (fully.qualified\n  // .Name)\". Any current custom value is kept selectable via `include`.\n  public valueTypeItems(include?: string | string[] | null): SelectItem[] {\n    const items = VALUE_TYPE_OPTIONS.map(fqnSelectItem);\n    return this.withIncluded(items, include);\n  }\n\n  public get defaultValueType(): string {\n    return DEFAULT_VALUE_TYPE;\n  }\n\n  // A value type is \"custom\" (i.e. entered manually) when it is set but not one of the presets.\n  public isCustomValueType(clazz: string): boolean {\n    return !!clazz && !VALUE_TYPE_OPTIONS.includes(clazz);\n  }\n\n  // ----- Helpers -----\n\n  private normalizeActions(permission?: Permission): string[] {\n    if (permission?.actions?.length) return [...permission.actions];\n    if (permission?.action) return [permission.action];\n    return [];\n  }\n\n  private conditionField(condition?: PermissionCondition): string {\n    if (condition && (condition.type === 'field' || condition.type === 'expression')) {\n      return condition.field;\n    }\n    return '';\n  }\n\n  private conditionOperator(condition?: PermissionCondition): ConditionOperator {\n    if (condition && (condition.type === 'field' || condition.type === 'expression')) {\n      return condition.operator;\n    }\n    return '==';\n  }\n\n  private conditionValue(condition?: PermissionCondition): unknown {\n    if (condition && (condition.type === 'field' || condition.type === 'expression')) {\n      return condition.value;\n    }\n    // A freshly-added field/expression row has no value yet; default it to null, which renders as\n    // the literal \"null\". The value field is required and may not be left empty — to express \"no\n    // value\" the user types null explicitly.\n    return null;\n  }\n\n  private conditionClazz(condition?: PermissionCondition): string {\n    // Expression conditions carry a value type; default it to the preset so the dropdown starts on a\n    // valid selection. Other condition types don't use it.\n    if (condition && condition.type === 'expression') {\n      return condition.clazz || DEFAULT_VALUE_TYPE;\n    }\n    return '';\n  }\n\n  private withIncluded(items: SelectItem[], include?: string | string[] | null): SelectItem[] {\n    // Only genuine, non-empty strings are added. A truthy non-string (e.g. an object that somehow\n    // reached a field/value control) would otherwise be pushed as {id, text} and render as\n    // \"[object Object]\" — guard against that here rather than trusting the caller.\n    const values = (Array.isArray(include) ? include : [include]).filter(\n      (value): value is string => typeof value === 'string' && !!value\n    );\n    const result = [...items];\n    for (const value of values) {\n      if (!result.some(item => item.id === value)) result.push({id: value, text: value});\n    }\n    return result;\n  }\n\n  private sortByText(items: SelectItem[]): SelectItem[] {\n    return [...items].sort((a, b) => (a.text ?? '').localeCompare(b.text ?? ''));\n  }\n}\n\nfunction minSelectedArrayValidator(min: number): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    const value = control.value;\n    return Array.isArray(value) && value.length >= min ? null : {minSelected: {min}};\n  };\n}\n\nfunction conditionValidator(group: AbstractControl): ValidationErrors | null {\n  const type: ConditionType = group.get('type')?.value;\n  const errors: ValidationErrors = {};\n\n  if (type === 'container') {\n    if (!group.get('resourceType')?.value) errors['resourceTypeRequired'] = true;\n  } else {\n    if (!group.get('field')?.value) errors['fieldRequired'] = true;\n    // The value may not be left empty; \"null\" must be typed for an explicit null value.\n    if (!group.get('value')?.value) errors['valueRequired'] = true;\n    if (type === 'expression') {\n      if (!group.get('path')?.value) errors['pathRequired'] = true;\n      if (!group.get('clazz')?.value) errors['clazzRequired'] = true;\n    }\n  }\n\n  return Object.keys(errors).length ? errors : null;\n}\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\nimport {HttpClient} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {ConfigService, InterceptorSkipHeader, PbacRegistryDto} from '@valtimo/shared';\nimport {BehaviorSubject, catchError, Observable, of, switchMap, take, tap} from 'rxjs';\nimport {DeleteRolesRequest, Permission, PermissionSchema, Role} from '../models';\n\n@Injectable({providedIn: 'root'})\nexport class AccessControlService {\n  public readonly roles$ = new BehaviorSubject<Role[]>([]);\n  public readonly loading$ = new BehaviorSubject<boolean>(false);\n\n  private valtimoEndpointUri: string;\n  private readonly apiEndpointUri: string;\n\n  private get roleDtos$(): Observable<Role[]> {\n    return this.http.get<Role[]>(`${this.valtimoEndpointUri}v1/roles`);\n  }\n\n  constructor(\n    private readonly configService: ConfigService,\n    private readonly http: HttpClient\n  ) {\n    this.apiEndpointUri = this.configService.config.valtimoApi.endpointUri;\n    this.valtimoEndpointUri = `${this.apiEndpointUri}management/`;\n  }\n\n  // The roles known to the identity provider (e.g. Keycloak realm roles), optionally filtered by a\n  // name prefix. Used to let an admin pick an existing role when configuring access control instead\n  // of typing its key by hand. Degrades to an empty list (and stays silent) when the endpoint is\n  // unavailable — e.g. a deployment using a different IAM — so the caller can fall back to manual\n  // entry.\n  public getExternalRoles(externalRoleNamePrefix?: string): Observable<string[]> {\n    const params = externalRoleNamePrefix\n      ? `?externalRoleNamePrefix=${encodeURIComponent(externalRoleNamePrefix)}`\n      : '';\n    return this.http\n      .get<string[]>(`${this.apiEndpointUri}v1/external-role${params}`, {\n        headers: InterceptorSkipHeader,\n      })\n      .pipe(catchError(() => of([])));\n  }\n\n  public addRole(role: Role): Observable<Role> {\n    return this.http.post<Role>(`${this.valtimoEndpointUri}v1/roles`, role);\n  }\n\n  public deleteRoles(request: DeleteRolesRequest): Observable<null> {\n    return this.http.delete<null>(`${this.valtimoEndpointUri}v1/roles`, {body: request});\n  }\n\n  public dispatchAction(actionResult: Observable<Role | null>): void {\n    actionResult\n      .pipe(\n        tap(() => {\n          this.loading$.next(true);\n        }),\n        switchMap(() => this.roleDtos$),\n        take(1),\n        catchError(error => of(error))\n      )\n      .subscribe({\n        next: (roles: Role[]) => {\n          this.roles$.next(roles);\n          this.loading$.next(false);\n        },\n        error: error => {\n          console.error(error);\n        },\n      });\n  }\n\n  public loadRoles(): void {\n    this.roleDtos$\n      .pipe(\n        tap(() => {\n          this.loading$.next(true);\n        }),\n        take(1)\n      )\n      .subscribe({\n        next: (items: Role[]) => {\n          this.roles$.next(items);\n          this.loading$.next(false);\n        },\n        error: error => {\n          console.error(error);\n        },\n      });\n  }\n\n  public getRolePermissions(roleKey: string): Observable<Permission[]> {\n    return this.http.get<Permission[]>(`${this.valtimoEndpointUri}v1/roles/${roleKey}/permissions`);\n  }\n\n  public exportRolePermissions(roles: string[]): Observable<object[]> {\n    return this.http.post<object[]>(`${this.valtimoEndpointUri}v1/permissions/search`, {roles});\n  }\n\n  public updateRolePermissions(roleKey: string, updatedPermission: object): Observable<object> {\n    return this.http.put<object>(\n      `${this.valtimoEndpointUri}v1/roles/${roleKey}/permissions`,\n      updatedPermission\n    );\n  }\n\n  public getPermissionSchema(): Observable<PermissionSchema> {\n    return this.http.get<PermissionSchema>(`${this.valtimoEndpointUri}v1/permissions/schema`);\n  }\n\n  public getPbacRegistry(): Observable<PbacRegistryDto> {\n    return this.http.get<PbacRegistryDto>(`${this.valtimoEndpointUri}v1/pbac/registry`);\n  }\n\n  public updateRole(roleKey: string, request: Role): Observable<object> {\n    return this.http.put<object>(`${this.valtimoEndpointUri}v1/roles/${roleKey}`, request);\n  }\n}\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\nimport {Injectable} from '@angular/core';\nimport {\n  PbacConditionTypeDto,\n  PbacEntityMapperDto,\n  PbacOperatorDto,\n  PbacRegistryDto,\n  PbacResourceDto,\n} from '@valtimo/shared';\nimport {BehaviorSubject, map, Observable, shareReplay, tap} from 'rxjs';\nimport {PermissionSchema} from '../models';\nimport {AccessControlService} from './access-control.service';\n\n@Injectable({providedIn: 'root'})\nexport class PermissionSchemaMetadataService {\n  private readonly _knownResourceTypes$ = new BehaviorSubject<Set<string>>(new Set());\n  private readonly _fieldsByResourceType$ = new BehaviorSubject<Record<string, Set<string>>>({});\n\n  /**\n   * The full PBAC registry served by GET /api/management/v1/pbac/registry. This is the\n   * authoritative, purpose-built description of every resource type, its actions and fields,\n   * the available operators and condition types, the entity-mapper pairs that define which\n   * context resources a permission can be scoped to, and the configured roles. It drives both\n   * the read-only overview and the form-based editor.\n   */\n  public readonly registry$: Observable<PbacRegistryDto> = this.accessControlService\n    .getPbacRegistry()\n    .pipe(\n      tap(registry => {\n        this._knownResourceTypes$.next(this.extractKnownResourceTypes(registry));\n        this._fieldsByResourceType$.next(this.extractFieldsByResourceType(registry));\n      }),\n      shareReplay({bufferSize: 1, refCount: false})\n    );\n\n  public readonly resources$: Observable<PbacResourceDto[]> = this.registry$.pipe(\n    map(registry => registry.resources)\n  );\n\n  public readonly resourceByType$: Observable<Record<string, PbacResourceDto>> =\n    this.resources$.pipe(\n      map(resources =>\n        resources.reduce<Record<string, PbacResourceDto>>((acc, resource) => {\n          acc[resource.resourceType] = resource;\n          return acc;\n        }, {})\n      )\n    );\n\n  /**\n   * Raw JSON schema served by GET /api/management/v1/permissions/schema. Drives validation and\n   * autocomplete in the Monaco JSON editor.\n   */\n  public readonly schema$: Observable<PermissionSchema> = this.accessControlService\n    .getPermissionSchema()\n    .pipe(shareReplay({bufferSize: 1, refCount: false}));\n\n  // The available actions per resource type come straight from the PBAC registry. The backend\n  // discovers every ResourceActionProvider on the classpath — not only the ones registered as\n  // Spring beans — so each resource's action list is complete.\n  public readonly actionsByResourceType$: Observable<Record<string, string[]>> =\n    this.resources$.pipe(\n      map(resources =>\n        resources.reduce<Record<string, string[]>>((acc, resource) => {\n          acc[resource.resourceType] = [...resource.actions];\n          return acc;\n        }, {})\n      )\n    );\n\n  public readonly allResourceTypes$: Observable<string[]> = this.resources$.pipe(\n    map(resources => resources.map(resource => resource.resourceType))\n  );\n\n  public readonly operators$: Observable<PbacOperatorDto[]> = this.registry$.pipe(\n    map(registry => registry.operators)\n  );\n\n  public readonly conditionTypes$: Observable<PbacConditionTypeDto[]> = this.registry$.pipe(\n    map(registry => registry.conditionTypes)\n  );\n\n  public readonly entityMappers$: Observable<PbacEntityMapperDto[]> = this.registry$.pipe(\n    map(registry => registry.entityMappers)\n  );\n\n  public readonly roles$: Observable<string[]> = this.registry$.pipe(\n    map(registry => registry.roles)\n  );\n\n  constructor(private readonly accessControlService: AccessControlService) {}\n\n  public isResourceTypeKnown(fqn: string): boolean {\n    return this._knownResourceTypes$.value.has(fqn);\n  }\n\n  public isFieldKnown(resourceType: string, field: string): boolean {\n    return this._fieldsByResourceType$.value[resourceType]?.has(field) ?? false;\n  }\n\n  private extractKnownResourceTypes(registry: PbacRegistryDto): Set<string> {\n    return new Set(registry.resources.map(resource => resource.resourceType));\n  }\n\n  private extractFieldsByResourceType(registry: PbacRegistryDto): Record<string, Set<string>> {\n    const result: Record<string, Set<string>> = {};\n    for (const resource of registry.resources) {\n      const fields = new Set<string>();\n      for (const field of resource.fields) fields.add(field.name);\n      for (const alias of resource.fieldAliases) fields.add(alias.alias);\n      result[resource.resourceType] = fields;\n    }\n    return result;\n  }\n}\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\nexport * from './access-control-form-editor.service';\nexport * from './access-control.service';\nexport * from './permission-schema-metadata.service';\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\nimport {Injectable} from '@angular/core';\nimport {AccessControlService} from './access-control.service';\nimport {ExportRoleOutput, RoleExport} from '../models';\nimport {catchError, combineLatest, map, Observable, of, tap} from 'rxjs';\n\n@Injectable({providedIn: 'root'})\nexport class AccessControlExportService {\n  constructor(private readonly accessControlService: AccessControlService) {}\n\n  public exportRoles(event: ExportRoleOutput): Observable<boolean> {\n    return (\n      event.type === 'unified'\n        ? this.accessControlService.exportRolePermissions(event.roleKeys).pipe(\n            tap(res => {\n              this.downloadJson(res, event.type);\n            })\n          )\n        : combineLatest(\n            event.roleKeys.map((roleKey: string) =>\n              this.accessControlService.exportRolePermissions([roleKey])\n            )\n          ).pipe(\n            tap(res => {\n              res.forEach((permissions, index) => {\n                const roleKey = event.roleKeys[index];\n                this.downloadJson(permissions, event.type, roleKey);\n              });\n            })\n          )\n    ).pipe(\n      map(() => true),\n      catchError(() => of(false))\n    );\n  }\n\n  private downloadJson(permissions: Array<object>, type: RoleExport, roleKey?: string): void {\n    const sJson = JSON.stringify({permissions}, null, 2);\n    const element = document.createElement('a');\n    element.setAttribute('href', 'data:text/json;charset=UTF-8,' + encodeURIComponent(sJson));\n    element.setAttribute(\n      'download',\n      `${type === 'separate' ? roleKey : 'combined'}.permission.json`\n    );\n    element.style.display = 'none';\n    document.body.appendChild(element);\n    element.click(); // simulate click\n    document.body.removeChild(element);\n  }\n}\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\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  signal,\n} from '@angular/core';\nimport {FormBuilder, Validators} from '@angular/forms';\nimport {CARBON_CONSTANTS, SelectItem} from '@valtimo/components';\nimport {Role, RoleMetadataModal} from '../../models';\nimport {AccessControlService} from '../../services';\n\n@Component({\n  standalone: false,\n  selector: 'valtimo-role-metadata-modal',\n  templateUrl: './role-metadata-modal.component.html',\n  styleUrls: ['./role-metadata-modal.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RoleMetadataModalComponent implements OnInit {\n  @Input() public type: RoleMetadataModal = 'add';\n  @Input() public set open(value: boolean) {\n    this._open = value;\n    // Fetch the selectable roles the first time the modal is opened.\n    if (value && !this._rolesRequested) this.loadRoleKeyItems();\n  }\n  public get open(): boolean {\n    return this._open;\n  }\n  @Input() public set defaultKeyValue(value: string) {\n    this._defaultKeyValue = value;\n    this.setDefaultKeyValue(value);\n  }\n  // Role keys already configured; excluded from the picker so a role can't be added twice.\n  @Input() public usedKeys: string[] | null = [];\n\n  @Output() public closeEvent = new EventEmitter<Role | null>();\n\n  // Selectable role keys, fetched from the identity provider (e.g. Keycloak realm roles). The picker\n  // only lists these; a custom key is entered via manual mode.\n  public readonly $roleKeyItems = signal<SelectItem[]>([]);\n  public readonly $loadingRoles = signal<boolean>(false);\n  // Whether the key is typed manually rather than picked from the dropdown.\n  public readonly $keyManual = signal<boolean>(false);\n\n  public form = this.fb.group({\n    key: this.fb.control('', Validators.required),\n  });\n\n  private _open = false;\n  private _defaultKeyValue!: string;\n  private _rolesRequested = false;\n\n  public get key() {\n    return this.form.get('key')!;\n  }\n\n  constructor(\n    private readonly fb: FormBuilder,\n    private readonly accessControlService: AccessControlService\n  ) {}\n\n  public ngOnInit(): void {\n    // Editing starts in manual mode so the existing key is shown for renaming; adding starts on the\n    // role picker.\n    this.$keyManual.set(this.type === 'edit');\n  }\n\n  public onCancel(): void {\n    this.closeEvent.emit(null);\n    this.resetForm();\n  }\n\n  public onConfirm(): void {\n    if (this.form.invalid) {\n      return;\n    }\n\n    this.closeEvent.emit({roleKey: this.key.value});\n    this.resetForm();\n  }\n\n  // Switches between picking a role and typing one. Returning to the picker drops a value that isn't\n  // one of the listed roles, so a valid option must be chosen.\n  public onKeyManualToggle(manual: boolean): void {\n    this.$keyManual.set(manual);\n    if (!manual && !this.$roleKeyItems().some(item => item.id === this.key.value)) {\n      this.key.setValue('');\n    }\n  }\n\n  private loadRoleKeyItems(): void {\n    this._rolesRequested = true;\n    this.$loadingRoles.set(true);\n    // Only application roles (ROLE_*) are offered; roles already configured are filtered out (except\n    // when editing, where the current key must remain selectable).\n    this.accessControlService.getExternalRoles('ROLE_').subscribe(roles => {\n      const used = this.usedKeys ?? [];\n      this.$roleKeyItems.set(\n        roles\n          .filter(role => this.type === 'edit' || !used.includes(role))\n          .map(role => ({id: role, text: role}))\n      );\n      // With no roles to pick from, fall back to manual entry so the field stays usable.\n      if (this.type === 'add' && this.$roleKeyItems().length === 0) this.$keyManual.set(true);\n      this.$loadingRoles.set(false);\n    });\n  }\n\n  private setDefaultKeyValue(value: string): void {\n    this.key.setValue(value);\n  }\n\n  private resetForm(): void {\n    setTimeout(() => {\n      this.form.reset();\n      this.$keyManual.set(this.type === 'edit');\n      if (this.type === 'edit') {\n        this.setDefaultKeyValue(this._defaultKeyValue);\n      }\n    }, CARBON_CONSTANTS.modalAnimationMs);\n  }\n}\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\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","/*\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\nimport {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\nimport {Observable} from 'rxjs';\n\n@Component({\n  standalone: false,\n  selector: 'valtimo-delete-role-modal',\n  templateUrl: './delete-role-modal.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DeleteRoleModalComponent {\n  @Input() deleteRowKeys: Array<string>;\n  @Input() showDeleteModal$: Observable<boolean>;\n  @Output() deleteEvent = new EventEmitter<Array<string>>();\n\n  public onDelete(roles: Array<string>): void {\n    this.deleteEvent.emit(roles);\n  }\n}\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\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","/*\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\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n} from '@angular/core';\nimport {ExportRoleOutput, RoleExport} from '../../models';\nimport {BehaviorSubject, Observable, Subscription} from 'rxjs';\nimport {CARBON_CONSTANTS} from '@valtimo/components';\n\n@Component({\n  standalone: false,\n  selector: 'valtimo-export-role-modal',\n  templateUrl: './export-role-modal.component.html',\n  styleUrls: ['./export-role-modal.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ExportRoleModalComponent implements OnInit, OnDestroy {\n  @Input() open = false;\n  @Input() exportRowKeys: Array<string>;\n  @Input() reset$!: Observable<null>;\n  @Input() disabled: boolean;\n\n  @Output() exportEvent = new EventEmitter<ExportRoleOutput>();\n  @Output() closeEvent = new EventEmitter<any>();\n\n  public readonly selectedType$ = new BehaviorSubject<RoleExport | null>(null);\n\n  private _resetSubscription!: Subscription;\n\n  public ngOnInit(): void {\n    this.openResetSubscription();\n  }\n\n  public ngOnDestroy(): void {\n    this._resetSubscription?.unsubscribe();\n  }\n\n  public onCancel(): void {\n    if (!this.disabled) {\n      this.resetType();\n      this.closeEvent.emit();\n    }\n  }\n\n  public onConfirm(type: RoleExport): void {\n    this.exportEvent.emit({type, roleKeys: this.exportRowKeys});\n  }\n\n  public selectType(type: RoleExport): void {\n    this.selectedType$.next(type);\n  }\n\n  private resetType(): void {\n    setTimeout(() => {\n      this.selectedType$.next(null);\n    }, CARBON_CONSTANTS.modalAnimationMs);\n  }\n\n  private openResetSubscription(): void {\n    this._resetSubscription = this.reset$?.subscribe(() => {\n      this.closeEvent.emit();\n      this.resetType();\n    });\n  }\n}\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\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","/*\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 */\nimport {ChangeDetectionStrategy, Component, OnInit, ViewChild} from '@angular/core';\nimport {Router} from '@angular/router';\nimport {CARBON_CONSTANTS, CarbonListComponent, ColumnConfig, ViewType} from '@valtimo/components';\nimport {BehaviorSubject, delay, finalize, map, Observable, Subject, tap} from 'rxjs';\nimport {ExportRoleOutput, Role} from '../../models';\nimport {AccessControlExportService} from '../../services/access-control-export.service';\nimport {AccessControlService} from '../../services/access-control.service';\n\n@Component({\n  standalone: false,\n  templateUrl: './access-control-overview.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccessControlOverviewComponent implements OnInit {\n  @ViewChild(CarbonListComponent) carbonList: CarbonListComponent;\n\n  public fields: ColumnConfig[] = [\n    {\n      viewType: ViewType.TEXT,\n      key: 'roleKey',\n      label: 'accessControl.roles.key',\n    },\n  ];\n\n  public readonly roles$: Observable<Role[]> = this.accessControlService.roles$;\n  // Keys of already-configured roles, used to keep them out of the add-role picker.\n  public readonly existingRoleKeys$: Observable<string[]> = this.roles$.pipe(\n    map(roles => roles.map(role => role.roleKey))\n  );\n  public readonly loading$: Observable<boolean> = this.accessControlService.loading$;\n  public readonly skeleton$ = new BehaviorSubject<boolean>(false);\n  public readonly showAddModal$ = new BehaviorSubject<boolean>(false);\n  public readonly showDeleteModal$ = new BehaviorSubject<boolean>(false);\n  public readonly showExportModal$ = new BehaviorSubject<boolean>(false);\n  public readonly selectedRowKeys$ = new BehaviorSubject<Array<string>>([]);\n  public readonly resetExportType$ = new Subject<null>();\n  public readonly exportDisabled$ = new BehaviorSubject<boolean>(false);\n\n  constructor(\n    private readonly accessControlService: AccessControlService,\n    private readonly accessControlExportService: AccessControlExportService,\n    private readonly router: Router\n  ) {}\n\n  public ngOnInit(): void {\n    this.accessControlService.loadRoles();\n  }\n\n  public openAddModal(): void {\n    this.showAddModal$.next(true);\n  }\n\n  public onAdd(data: Role | null): void {\n    this.showAddModal$.next(false);\n\n    if (!data) {\n      return;\n    }\n\n    this.accessControlService.dispatchAction(\n      this.accessControlService.addRole(data).pipe(\n        finalize(() => {\n          this.showAddModal$.next(false);\n        })\n      )\n    );\n  }\n\n  public showDeleteModal(): void {\n    this.setSelectedRoleKeys();\n    this.showDeleteModal$.next(true);\n  }\n\n  public showExportModal(): void {\n    this.setSelectedRoleKeys();\n    this.showExportModal$.next(true);\n  }\n\n  public closeExportModal(): void {\n    this.showExportModal$.next(false);\n  }\n\n  public onDelete(roles: Array<string>): void {\n    this.enableSkeleton();\n\n    this.accessControlService.dispatchAction(\n      this.accessControlService.deleteRoles({roles}).pipe(\n        finalize(() => {\n          this.disableSkeleton();\n        })\n      )\n    );\n  }\n\n  public onExport(event: ExportRoleOutput): void {\n    this.exportDisabled$.next(true);\n\n    this.accessControlExportService\n      .exportRoles(event)\n      .pipe(\n        tap(() => {\n          this.resetExportType$.next(null);\n        }),\n        delay(CARBON_CONSTANTS.modalAnimationMs),\n        tap(() => {\n          this.exportDisabled$.next(false);\n        })\n      )\n      .subscribe();\n  }\n\n  public onRowClick(role: Role): void {\n    this.router.navigate([`/access-control/${role.roleKey}`]);\n  }\n\n  private enableSkeleton(): void {\n    this.skeleton$.next(true);\n  }\n\n  private disableSkeleton(): void {\n    this.skeleton$.next(false);\n  }\n\n  private setSelectedRoleKeys(): void {\n    this.selectedRowKeys$.next(this.carbonList.selectedItems.map((role: Role) => role.roleKey));\n  }\n}\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\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","/*\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\nimport {Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core';\nimport {AbstractControl, FormArray, FormGroup} from '@angular/forms';\nimport {Add16, TrashCan16} from '@carbon/icons';\nimport {SelectItem} from '@valtimo/components';\nimport {IconService} from 'carbon-components-angular';\nimport {ACCESS_CONTROL_EDITOR_TEST_IDS} from '../../constants';\nimport {ConditionType} from '../../models';\nimport {AccessControlFormEditorService} from '../../services';\n\n@Component({\n  standalone: false,\n  selector: 'valtimo-condition-tree',\n  templateUrl: './condition-tree.component.html',\n  styleUrls: ['./condition-tree.component.scss'],\n})\nexport class ConditionTreeComponent implements OnInit, OnChanges {\n  @Input() public conditions!: FormArray;\n  @Input() public resourceType: string | null = null;\n  @Input() public disabled = false;\n  @Input() public depth = 0;\n\n  public fieldItems: SelectItem[] = [];\n  public containerTargetItems: SelectItem[] = [];\n  public operatorItems: SelectItem[] = [];\n  // Preset value types for JSON-field conditions (String, Boolean, …). The dropdown only ever holds\n  // presets — custom types are entered via manual mode — so this list is stable.\n  public valueTypeItems: SelectItem[] = [];\n\n  // Condition types are shown in natural language. \"Related resource\" (container) is only offered\n  // when the resource can be related to another resource (see recomputeItems).\n  public typeItems: SelectItem[] = [];\n\n  protected readonly testIds = ACCESS_CONTROL_EDITOR_TEST_IDS;\n\n  // Carbon only provides three layer tokens, and they alternate (layer 0 and 2 share a surface\n  // colour, layer 1 is the contrasting one). To keep every nesting level visually distinct from\n  // the one it sits on, the condition rows alternate between layer 1 and 2 as they nest. The\n  // permission card sits on layer 0, so the first row level is layer 1.\n  public get rowLayerLevel(): 1 | 2 {\n    return this.depth % 2 === 0 ? 1 : 2;\n  }\n\n  // Inputs use the layer that contrasts with their row's surface, so the field background always\n  // stands out from the row it sits on (layer 1 ↔ layer 2).\n  public get inputLayerLevel(): 1 | 2 {\n    return this.rowLayerLevel === 1 ? 2 : 1;\n  }\n\n  constructor(\n    private readonly formEditorService: AccessControlFormEditorService,\n    private readonly iconService: IconService\n  ) {\n    this.iconService.registerAll([Add16, TrashCan16]);\n  }\n\n  public ngOnInit(): void {\n    this.operatorItems = this.formEditorService.operatorItems();\n    this.valueTypeItems = this.formEditorService.valueTypeItems();\n    this.recomputeItems();\n  }\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (changes['resourceType']) this.recomputeItems();\n  }\n\n  public groupAt(index: number): FormGroup {\n    return this.conditions.at(index) as FormGroup;\n  }\n\n  public asFormGroup(control: AbstractControl): FormGroup {\n    return control as FormGroup;\n  }\n\n  public typeOf(index: number): ConditionType {\n    return this.groupAt(index).get('type')!.value;\n  }\n\n  public nestedConditions(index: number): FormArray {\n    return this.groupAt(index).get('conditions') as FormArray;\n  }\n\n  public containerResourceType(index: number): string | null {\n    return this.groupAt(index).get('resourceType')!.value || null;\n  }\n\n  public containerResourceTypeAt(index: number): string {\n    return this.groupAt(index).get('resourceType')!.value || '';\n  }\n\n  public fieldValueAt(index: number): string {\n    return this.groupAt(index).get('field')!.value || '';\n  }\n\n  public operatorValueAt(index: number): string {\n    return this.groupAt(index).get('operator')!.value || '';\n  }\n\n  public clazzValueAt(index: number): string {\n    return this.groupAt(index).get('clazz')!.value || '';\n  }\n\n  // Whether the value type is entered manually (a custom class) rather than picked from the preset\n  // dropdown.\n  public clazzManualAt(index: number): boolean {\n    return !!this.groupAt(index).get('clazzManual')!.value;\n  }\n\n  public addCondition(): void {\n    this.conditions.push(this.formEditorService.createConditionGroup(undefined, 'field'));\n  }\n\n  public removeCondition(index: number): void {\n    this.conditions.removeAt(index);\n  }\n\n  // Toggles the value-type input between the preset dropdown and manual entry. Switching back to the\n  // dropdown with nothing entered yet falls back to the default type.\n  public onClazzManualToggle(index: number, manual: boolean): void {\n    const group = this.groupAt(index);\n    group.get('clazzManual')!.setValue(manual);\n    // The dropdown only lists presets, so entering it with an empty or custom value falls back to\n    // the default preset rather than leaving the dropdown with nothing selected.\n    const clazz = group.get('clazz')!.value;\n    if (!manual && (!clazz || this.formEditorService.isCustomValueType(clazz))) {\n      group.get('clazz')!.setValue(this.formEditorService.defaultValueType);\n    }\n  }\n\n  public onTypeChange(index: number): void {\n    const group = this.groupAt(index);\n    // Switching to a JSON field (expression) defaults the value type to a preset so its dropdown\n    // starts on a valid, selected option.\n    if (group.get('type')!.value === 'expression' && !group.get('clazz')!.value) {\n      group.get('clazz')!.setValue(this.formEditorService.defaultValueType);\n      group.get('clazzManual')!.setValue(false);\n    }\n    this.recomputeItems();\n  }\n\n  private recomputeItems(): void {\n    const resourceType = this.resourceType ?? '';\n    this.fieldItems = this.formEditorService.fieldItems(resourceType, this.collectFieldValues());\n    this.containerTargetItems = this.formEditorService.containerTargetItems(\n      resourceType,\n      this.collectContainerTargets()\n    );\n    // Only offer the \"related resource\" (container) type when the resource actually has related\n    // resources to point at; otherwise a container condition could never be completed.\n    const types: ConditionType[] = this.containerTargetItems.length\n      ? ['field', 'expression', 'container']\n      : ['field', 'expression'];\n    this.typeItems = types.map(type => ({\n      id: type,\n      translationKey: `accessControl.editor.conditionTypes.${type}`,\n    }));\n  }\n\n  private collectFieldValues(): string[] {\n    return this.conditions.controls\n      .map(control => (control as FormGroup).get('field')!.value)\n      .filter((value: string) => !!value);\n  }\n\n  private collectContainerTargets(): string[] {\n    return this.conditions.controls\n      .map(control => (control as FormGroup).get('resourceType')!.value)\n      .filter((value: string) => !!value);\n  }\n}\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\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","/*\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {TranslateService} from '@ngx-translate/core';\n\n// Renders a permission action key (e.g. \"view_list\") as its natural-language label, falling back to\n// the raw key when there is no translation. Impure so the label follows runtime language changes.\n@Pipe({\n  standalone: true,\n  name: 'actionLabel',\n  pure: false,\n})\nexport class ActionLabelPipe implements PipeTransform {\n  constructor(private readonly translateService: TranslateService) {}\n\n  public transform(action: string | null | undefined): string {\n    if (!action) return '';\n    const key = `accessControl.actions.${action}`;\n    const translated = this.translateService.instant(key);\n    return translated === key ? action : translated;\n  }\n}\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {TranslateService} from '@ngx-translate/core';\n\n// Resolves a short, human description for a permission action (e.g. \"view_list\") from\n// accessControl.actionDescriptions.<action>. Returns an empty string when no description is\n// configured, so callers can hide the tooltip. Impure so it follows runtime language changes.\n@Pipe({\n  standalone: true,\n  name: 'actionDescription',\n  pure: false,\n})\nexport class ActionDescriptionPipe implements PipeTransform {\n  constructor(private readonly translateService: TranslateService) {}\n\n  public transform(action: string | null | undefined): string {\n    if (!action) return '';\n    const key = `accessControl.actionDescriptions.${action}`;\n    const translated = this.translateService.instant(key);\n    return translated === key ? '' : translated;\n  }\n}\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {TagType} from 'carbon-components-angular';\nimport {ACTION_TAG_TYPE, DEFAULT_ACTION_TAG_TYPE} from '../constants';\n\n// Maps a permission action key (e.g. \"create\") to a tag colour, so each kind of action is shown with\n// its own distinct colour. The colour may be a Carbon built-in or one of the extended case-widget\n// colours registered globally in carbon.scss (e.g. \"orange\", \"periwinkle\"); the latter are cast to\n// TagType so they satisfy the cds-tag input. Falls back to a neutral colour for unknown actions.\n@Pipe({\n  standalone: true,\n  name: 'actionTagType',\n})\nexport class ActionTagTypePipe implements PipeTransform {\n  public transform(action: string | null | undefined): TagType {\n    if (!action) return DEFAULT_ACTION_TAG_TYPE as TagType;\n    return (ACTION_TAG_TYPE[action] ?? DEFAULT_ACTION_TAG_TYPE) as TagType;\n  }\n}\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\nimport {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  signal,\n} from '@angular/core';\nimport {FormArray, FormControl, FormGroup} from '@angular/forms';\nimport {Information16, TrashCan16} from '@carbon/icons';\nimport {SelectItem} from '@valtimo/components';\nimport {IconService} from 'carbon-components-angular';\nimport {BehaviorSubject, Subscription} from 'rxjs';\nimport {ACCESS_CONTROL_EDITOR_TEST_IDS, NO_CONTEXT_RESOURCE_TYPE} from '../../constants';\nimport {AccessControlFormEditorService} from '../../services';\nimport {shortTypeName} from '../../utils';\n\n@Component({\n  standalone: false,\n  selector: 'valtimo-permission-form',\n  templateUrl: './permission-form.component.html',\n  styleUrls: ['./permission-form.component.scss'],\n})\nexport class PermissionFormComponent implements OnInit, AfterViewInit, OnDestroy {\n  @Input() public group!: FormGroup;\n  @Input() public index = 0;\n  @Input() public disabled = false;\n  @Input() public roleKey: string | null = null;\n\n  @Output() public removeEvent = new EventEmitter<void>();\n\n  public resourceTypeItems: SelectItem[] = [];\n  public actionItems: SelectItem[] = [];\n  public contextResourceTypeItems: SelectItem[] = [];\n  // Whether the resource type has any related resources to scope to — gates the \"Specific context\"\n  // option in the context switcher.\n  public hasContextTargets = false;\n\n  // The form is rendered (but visually hidden) from the start so the wrapped comboboxes can\n  // initialize and fill in their preselected values. A spinner is shown until that has happened,\n  // after which the prefilled form is revealed.\n  public readonly $loading = signal<boolean>(true);\n\n  // The permission is shown as a three-section accordion. Only one section is open at a time;\n  // \"Resource & actions\" is open by default.\n  public readonly $openSection = signal<'resourceActions' | 'conditions' | 'context' | null>(\n    'resourceActions'\n  );\n\n  // Controls the \"remove permission\" confirmation modal. Removal only happens on confirm, and even\n  // then it just drops the permission from the editable list — nothing is persisted until the whole\n  // set of permissions is saved.\n  public readonly showRemoveModal$ = new BehaviorSubject<boolean>(false);\n\n  protected readonly testIds = ACCESS_CONTROL_EDITOR_TEST_IDS;\n\n  private readonly _subscriptions = new Subscription();\n  private _revealTimeoutId?: ReturnType<typeof setTimeout>;\n\n  constructor(\n    private readonly formEditorService: AccessControlFormEditorService,\n    private readonly iconService: IconService,\n    private readonly changeDetectorRef: ChangeDetectorRef\n  ) {\n    this.iconService.registerAll([Information16, TrashCan16]);\n  }\n\n  public get resourceTypeValue(): string {\n    return this.group.get('resourceType')!.value;\n  }\n\n  // The short (simple) class name of the resource type, e.g. \"CaseDefinition\" for\n  // \"com.ritense.case_.domain.definition.CaseDefinition\". Shown as the preview title, with the full\n  // technical name as a subtitle beneath it.\n  public get resourceShortName(): string {\n    return shortTypeName(this.resourceTypeValue);\n  }\n\n  public get contextResourceTypeValue(): string | null {\n    return this.group.get('contextResourceType')!.value;\n  }\n\n  // Whether context scoping is enabled (the toggle). Off means no context is written at all.\n  public get hasContext(): boolean {\n    return this.group.get('hasContext')!.value;\n  }\n\n  // True when a real context resource is selected (i.e. anything other than the \"No context\"\n  // marker). Gates the context condition tree — the marker has no fields to build conditions on.\n  public get hasContextResource(): boolean {\n    const value = this.contextResourceTypeValue;\n    return !!value && value !== NO_CONTEXT_RESOURCE_TYPE;\n  }\n\n  // The three-way context choice, derived from the form: 'none' (context is ignored), 'noContext'\n  // (only applies when there is no context) or 'specific' (restricted to a context resource).\n  public get contextMode(): 'none' | 'noContext' | 'specific' {\n    if (!this.hasContext) return 'none';\n    return this.hasContextResource ? 'specific' : 'noContext';\n  }\n\n  public get actionsControl(): FormControl {\n    return this.group.get('actions') as FormControl;\n  }\n\n  public get selectedActions(): string[] {\n    return this.actionsControl.value ?? [];\n  }\n\n  public get conditionsArray(): FormArray {\n    return this.group.get('conditions') as FormArray;\n  }\n\n  public get contextConditionsArray(): FormArray {\n    return this.group.get('contextConditions') as FormArray;\n  }\n\n  public ngOnInit(): void {\n    this.resourceTypeItems = this.formEditorService.resourceTypeItems(this.resourceTypeValue);\n    this.recomputeActionItems();\n    this.recomputeContextResourceTypeItems();\n\n    this._subscriptions.add(\n      this.group.get('resourceType')!.valueChanges.subscribe(() => {\n        this.recomputeActionItems();\n        this.recomputeContextResourceTypeItems();\n      })\n    );\n  }\n\n  public ngAfterViewInit(): void {\n    // The child comboboxes flush their preselected values in a setTimeout scheduled during their\n    // own view initialization (child hooks run first). This setTimeout therefore runs after them,\n    // at which point the form is prefilled and can be revealed.\n    this._revealTimeoutId = setTimeout(() => {\n      this.$loading.set(false);\n      this.changeDetectorRef.detectChanges();\n    });\n  }\n\n  public ngOnDestroy(): void {\n    this._subscriptions.unsubscribe();\n    this.showRemoveModal$.complete();\n    if (this._revealTimeoutId !== undefined) clearTimeout(this._revealTimeoutId);\n  }\n\n  // Applies a context-switcher choice to the form. 'none' clears context entirely; 'noContext'\n  // scopes the permission to the \"no context\" marker; 'specific' scopes it to a real context\n  // resource (keeping the current one, or defaulting to the first available target).\n  public onContextModeChange(mode: 'none' | 'noContext' | 'specific'): void {\n    if (this.disabled || mode === this.contextMode) return;\n\n    const hasContext = this.group.get('hasContext')!;\n    const contextResourceType = this.group.get('contextResourceType')!;\n\n    if (mode === 'none') {\n      hasContext.setValue(false);\n      return;\n    }\n\n    hasContext.setValue(true);\n    if (mode === 'noContext') {\n      contextResourceType.setValue(NO_CONTEXT_RESOURCE_TYPE);\n    } else if (!this.hasContextResource) {\n      const firstTarget = this.formEditorService.containerTargetItems(this.resourceTypeValue)[0]\n        ?.id;\n      contextResourceType.setValue(firstTarget ?? NO_CONTEXT_RESOURCE_TYPE);\n    }\n  }\n\n  public onActionToggle(action: string, checked: boolean): void {\n    const actions = new Set(this.selectedActions);\n    if (checked) {\n      actions.add(action);\n    } else {\n      actions.delete(action);\n    }\n    this.actionsControl.setValue([...actions]);\n    this.actionsControl.markAsTouched();\n  }\n\n  public onSectionToggle(\n    section: 'resourceActions' | 'conditions' | 'context',\n    event: {expanded?: boolean}\n  ): void {\n    // Only one section is open at a time: opening one collapses the others via the [expanded]\n    // bindings; collapsing the open one leaves all sections closed.\n    this.$openSection.set(event?.expanded ? section : null);\n  }\n\n  public openRemoveModal(): void {\n    this.showRemoveModal$.next(true);\n  }\n\n  public onRemove(): void {\n    this.removeEvent.emit();\n  }\n\n  private recomputeActionItems(): void {\n    this.actionItems = this.formEditorService.actionItems(\n      this.resourceTypeValue,\n      this.actionsControl.value ?? []\n    );\n  }\n\n  // The context choices depend on the selected resource type, so recompute on change. The \"specific\n  // context\" dropdown lists only real target resources (\"no context\" is its own switcher mode); if\n  // the selected resource is no longer a valid target, fall back to the \"no context\" marker.\n  private recomputeContextResourceTypeItems(): void {\n    const validTargets = this.formEditorService.containerTargetItems(this.resourceTypeValue);\n    this.hasContextTargets = validTargets.length > 0;\n\n    const current = this.contextResourceTypeValue;\n    if (\n      current &&\n      current !== NO_CONTEXT_RESOURCE_TYPE &&\n      !validTargets.some(target => target.id === current)\n    ) {\n      this.group.get('contextResourceType')!.setValue(NO_CONTEXT_RESOURCE_TYPE);\n    }\n\n    this.contextResourceTypeItems = this.formEditorService.containerTargetItems(\n      this.resourceTypeValue,\n      this.hasContextResource ? this.contextResourceTypeValue : null\n    );\n  }\n}\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\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","/*\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\nimport {\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnDestroy,\n  Output,\n  signal,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport {AbstractControl, FormArray, FormGroup} from '@angular/forms';\nimport {Add16} from '@carbon/icons';\nimport {EditorModel} from '@valtimo/components';\nimport {IconService} from 'carbon-components-angular';\nimport {Subscription, take} from 'rxjs';\nimport {ACCESS_CONTROL_EDITOR_TEST_IDS} from '../../constants';\nimport {Permission} from '../../models';\nimport {AccessControlFormEditorService, PermissionSchemaMetadataService} from '../../services';\nimport {shortTypeName} from '../../utils';\n\n@Component({\n  standalone: false,\n  selector: 'valtimo-access-control-form-editor-tab',\n  templateUrl: './access-control-form-editor-tab.component.html',\n  styleUrls: ['./access-control-form-editor-tab.component.scss'],\n  providers: [AccessControlFormEditorService],\n})\nexport class AccessControlFormEditorTabComponent implements OnChanges, OnDestroy {\n  @ViewChild('permissionList') private _permissionList?: ElementRef<HTMLElement>;\n\n  @Input() public model: EditorModel | null = null;\n  @Input() public disabled: boolean | null = false;\n  // The role being edited on this page; surfaced in the permission-form's editor note.\n  @Input() public roleKey: string | null = null;\n\n  @Output() public validEvent = new EventEmitter<boolean>();\n  @Output() public valueChangeEvent = new EventEmitter<string>();\n\n  public permissionsArray: FormArray | null = null;\n  public ready = false;\n\n  // Index of the permission shown in the detail panel. Null when there are no permissions.\n  public readonly $selectedIndex = signal<number | null>(null);\n\n  protected readonly testIds = ACCESS_CONTROL_EDITOR_TEST_IDS;\n\n  private _valueChangesSubscription?: Subscription;\n  // Armed by the parent right before a save (see prepareSelectionReopen): a one-shot instruction to\n  // re-open a specific permission on the next rebuild. Null otherwise, so ordinary (re)builds — the\n  // initial load and tab switches — simply select the first permission.\n  private _pendingReselect: {full: string; partial: string} | null = null;\n\n  constructor(\n    private readonly formEditorService: AccessControlFormEditorService,\n    private readonly metadataService: PermissionSchemaMetadataService,\n    private readonly iconService: IconService,\n    private readonly changeDetectorRef: ChangeDetectorRef\n  ) {\n    this.iconService.registerAll([Add16]);\n  }\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (changes['model']) {\n      this.rebuild();\n    } else if (changes['disabled']) {\n      this.applyDisabled();\n    }\n  }\n\n  public ngOnDestroy(): void {\n    this._valueChangesSubscription?.unsubscribe();\n  }\n\n  // ----- Sidebar item display -----\n\n  // The sidebar shows the resource's short (simple) name, e.g. \"CaseTab\" for\n  // \"com.ritense.case.domain.CaseTab\". The full technical name is still what is edited and stored.\n  public shortName(control: AbstractControl): string {\n    const resourceType = (control as FormGroup).get('resourceType')!.value as string;\n    return shortTypeName(resourceType);\n  }\n\n  public actionsOf(control: AbstractControl): string[] {\n    return ((control as FormGroup).get('actions')!.value as string[]) ?? [];\n  }\n\n  // Whether the permission has any conditions / a scoped context. Surfaced as status tags in the\n  // sidebar so a rule that carries extra configuration is recognisable at a glance (e.g. two\n  // entries for the same resource differ by their conditions).\n  public hasConditions(control: AbstractControl): boolean {\n    const conditions = (control as FormGroup).get('conditions') as FormArray | null;\n    return (conditions?.length ?? 0) > 0;\n  }\n\n  public hasContext(control: AbstractControl): boolean {\n    return !!(control as FormGroup).get('hasContext')!.value;\n  }\n\n  // The sidebar always lists permissions alphabetically by their (short) resource name, with\n  // not-yet-named new permissions kept at the bottom. The original array index is preserved so\n  // selection and serialization stay tied to the underlying form-array order.\n  public orderedPermissions(): {control: AbstractControl; index: number}[] {\n    if (!this.permissionsArray) return [];\n    return this.permissionsArray.controls\n      .map((control, index) => ({control, index}))\n      .sort((a, b) => {\n        const nameA = this.shortName(a.control);\n        const nameB = this.shortName(b.control);\n        if (!nameA) return nameB ? 1 : 0;\n        if (!nameB) return -1;\n        return nameA.localeCompare(nameB);\n      });\n  }\n\n  // ----- Selection -----\n\n  public selectPermission(index: number): void {\n    this.$selectedIndex.set(index);\n  }\n\n  // Returns the selected permission as a single-element array so the template can render it with a\n  // keyed @for: tracking by the FormGroup reference recreates the detail form (and re-runs its\n  // combobox prefill) whenever the selection changes.\n  public selectedControls(): AbstractControl[] {\n    const index = this.$selectedIndex();\n    if (index === null || !this.permissionsArray || index >= this.permissionsArray.length) {\n      return [];\n    }\n    return [this.permissionsArray.at(index)];\n  }\n\n  public addPermission(): void {\n    if (!this.permissionsArray) return;\n\n    const group = this.formEditorService.createPermissionGroup();\n    this.permissionsArray.push(group);\n    this.$selectedIndex.set(this.permissionsArray.length - 1);\n    this.changeDetectorRef.markForCheck();\n    this.scrollNewPermissionIntoView();\n  }\n\n  // The new permission is appended at the bottom of the sidebar list; once it has rendered, scroll\n  // the list so the freshly-added (and now selected) item is brought into view.\n  private scrollNewPermissionIntoView(): void {\n    setTimeout(() => {\n      const list = this._permissionList?.nativeElement;\n      if (list) list.scrollTo({top: list.scrollHeight, behavior: 'smooth'});\n    });\n  }\n\n  // After a save reloads the model and the previously-open rule is reselected, scroll that rule\n  // into view in the (alphabetically sorted) sidebar so it is visible without manual scrolling.\n  private scrollSelectedIntoView(): void {\n    setTimeout(() => {\n      const selected = this._permissionList?.nativeElement.querySelector(\n        '.form-editor__item--selected'\n      );\n      selected?.scrollIntoView({block: 'nearest', behavior: 'smooth'});\n    });\n  }\n\n  public removePermission(index: number): void {\n    if (!this.permissionsArray) return;\n\n    // After removal, select the permission shown directly above the deleted one in the\n    // (alphabetical) sidebar; if it was the first, fall back to the new first. The neighbour is\n    // captured by reference before removal so we can find its new array index afterwards.\n    const ordered = this.orderedPermissions();\n    const position = ordered.findIndex(item => item.index === index);\n    const neighbour =\n      position > 0 ? ordered[position - 1].control : (ordered[position + 1]?.control ?? null);\n\n    this.permissionsArray.removeAt(index);\n\n    const neighbourIndex = neighbour ? this.permissionsArray.controls.indexOf(neighbour) : -1;\n    // No neighbour left means the list is now empty → clear the selection so the empty state shows.\n    this.$selectedIndex.set(neighbourIndex === -1 ? null : neighbourIndex);\n    this.changeDetectorRef.markForCheck();\n  }\n\n  private rebuild(): void {\n    this.metadataService.registry$.pipe(take(1)).subscribe(registry => {\n      this.formEditorService.setRegistry(registry);\n      this.buildForm();\n    });\n  }\n\n  private buildForm(): void {\n    // Every (re)build selects the first permission, EXCEPT right after a save: the parent arms a\n    // one-shot reselect (prepareSelectionReopen) so the rule that was open at save time is re-opened\n    // once the saved model reloads. This is deliberately not preserved across ordinary reloads such\n    // as switching tabs — those always start at the first permission.\n    const reselect = this._pendingReselect;\n    this._pendingReselect = null;\n    this.permissionsArray = this.formEditorService.buildPermissionsArray(this.parsePermissions());\n    this.$selectedIndex.set(this.resolveSelectedIndex(reselect));\n    this.applyDisabled();\n\n    this._valueChangesSubscription?.unsubscribe();\n    this._valueChangesSubscription = this.permissionsArray.valueChanges.subscribe(() =>\n      this.emitState()\n    );\n\n    this.ready = true;\n    this.emitState();\n    this.changeDetectorRef.markForCheck();\n\n    // After a post-save reselect, bring the re-opened rule into view in the sidebar.\n    if (reselect) this.scrollSelectedIntoView();\n  }\n\n  // Called by the parent immediately before a save: captures the open permission so that, once the\n  // saved model reloads and the form rebuilds, the same rule is re-opened. One-shot — consumed by\n  // the next buildForm.\n  public prepareSelectionReopen(): void {\n    this._pendingReselect = this.selectedPermissionKeys();\n  }\n\n  // Identity of the currently-selected permission. Null when nothing is selected.\n  private selectedPermissionKeys(): {full: string; partial: string} | null {\n    const index = this.$selectedIndex();\n    if (index === null || !this.permissionsArray || index >= this.permissionsArray.length) {\n      return null;\n    }\n    return this.permissionKeys(this.permissionsArray.at(index) as FormGroup);\n  }\n\n  // Finds the rebuilt permission matching the previously-open one. Prefers an exact (full) match;\n  // falls back to a looser match on resource type + actions + context (so a permission whose\n  // conditions the backend normalized on save is still re-opened), then to the first permission.\n  private resolveSelectedIndex(previous: {full: string; partial: string} | null): number | null {\n    if (!this.permissionsArray || this.permissionsArray.length === 0) return null;\n\n    // Default to the permission shown at the top of the (alphabetically sorted) sidebar, not the\n    // raw form-array index 0 — the array order follows the stored JSON, which need not be\n    // alphabetical.\n    const firstListedIndex = this.orderedPermissions()[0]?.index ?? 0;\n    if (!previous) return firstListedIndex;\n\n    const keys = this.permissionsArray.controls.map(control =>\n      this.permissionKeys(control as FormGroup)\n    );\n    const fullMatch = keys.findIndex(key => key.full === previous.full);\n    if (fullMatch !== -1) return fullMatch;\n    const partialMatch = keys.findIndex(key => key.partial === previous.partial);\n    return partialMatch !== -1 ? partialMatch : firstListedIndex;\n  }\n\n  // Two identity keys for a permission: the full serialized permission (exact match) and a partial\n  // key of just resource type + sorted actions + context resource (order-independent, condition-\n  // agnostic).\n  private permissionKeys(group: FormGroup): {full: string; partial: string} {\n    const serialized = this.formEditorService.serializePermission(group);\n    const partial = JSON.stringify([\n      serialized.resourceType,\n      [...(serialized.actions ?? [])].sort(),\n      serialized.contextResourceType ?? null,\n    ]);\n    return {full: JSON.stringify(serialized), partial};\n  }\n\n  private applyDisabled(): void {\n    if (!this.permissionsArray) return;\n\n    if (this.disabled && this.permissionsArray.enabled) {\n      this.permissionsArray.disable({emitEvent: false});\n    } else if (!this.disabled && this.permissionsArray.disabled) {\n      this.permissionsArray.enable({emitEvent: false});\n    }\n  }\n\n  private emitState(): void {\n    if (!this.permissionsArray) return;\n\n    this.valueChangeEvent.emit(\n      JSON.stringify(this.formEditorService.serialize(this.permissionsArray))\n    );\n    this.validEvent.emit(this.permissionsArray.valid);\n  }\n\n  private parsePermissions(): Permission[] {\n    if (!this.model?.value) return [];\n    try {\n      const parsed = JSON.parse(this.model.value);\n      return Array.isArray(parsed) ? (parsed as Permission[]) : [];\n    } catch {\n      return [];\n    }\n  }\n}\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\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","/*\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\nimport {CommonModule} from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  SimpleChanges,\n} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {Filter16, TrashCan16} from '@carbon/icons';\nimport {EditorModel, EditorModule, OverflowMenuComponent} from '@valtimo/components';\nimport {\n  ButtonModule,\n  DropdownModule,\n  IconModule,\n  IconService,\n  ListItem,\n} from 'carbon-components-angular';\nimport {BehaviorSubject, combineLatest, map, Observable, skip, Subscription, take} from 'rxjs';\nimport {AccessControlFilter, Permission, PermissionSchema} from '../../models';\nimport {PermissionSchemaMetadataService} from '../../services';\nimport {formatResourceType} from '../../utils';\n\n@Component({\n  standalone: true,\n  selector: 'valtimo-access-control-json-editor-tab',\n  templateUrl: './access-control-json-editor-tab.component.html',\n  styleUrls: ['./access-control-json-editor-tab.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    TranslateModule,\n    ButtonModule,\n    DropdownModule,\n    EditorModule,\n    IconModule,\n    OverflowMenuComponent,\n  ],\n})\nexport class AccessControlJsonEditorTabComponent implements OnInit, OnChanges, OnDestroy {\n  @Input() public disabled: boolean | null = false;\n  @Input() public model!: EditorModel;\n\n  @Output() public validEvent = new EventEmitter<boolean>();\n  @Output() public valueChangeEvent = new EventEmitter<string>();\n\n  private readonly _sourceModel$ = new BehaviorSubject<EditorModel | null>(null);\n  private readonly _filter$ = new BehaviorSubject<AccessControlFilter>({\n    resourceType: null,\n    action: null,\n  });\n  private readonly _subscriptions = new Subscription();\n\n  public readonly isFilterActive$: Observable<boolean> = this._filter$.pipe(\n    map(({resourceType, action}) => !!resourceType || !!action)\n  );\n  public readonly resourceTypeItems$: Observable<ListItem[]> = combineLatest([\n    this._sourceModel$,\n    this._filter$,\n  ]).pipe(\n    map(([sourceModel, currentFilter]) => {\n      const permissions = this.parsePermissions(sourceModel);\n      const resourceTypes = Array.from(\n        new Set(permissions.map(p => p.resourceType).filter(Boolean))\n      ).sort();\n\n      return resourceTypes.map(resourceType => ({\n        content: formatResourceType(this.translateService, resourceType),\n        resourceType,\n        selected: currentFilter.resourceType === resourceType,\n      }));\n    })\n  );\n\n  public readonly actionItems$: Observable<ListItem[]> = combineLatest([\n    this._sourceModel$,\n    this._filter$,\n  ]).pipe(\n    map(([sourceModel, currentFilter]) => {\n      const permissions = this.parsePermissions(sourceModel);\n      const scoped = currentFilter.resourceType\n        ? permissions.filter(p => p.resourceType === currentFilter.resourceType)\n        : permissions;\n      const actions = Array.from(\n        new Set(\n          scoped.flatMap(p => [...(p.actions ?? []), ...(p.action ? [p.action] : [])])\n        )\n      ).sort();\n\n      return actions.map(action => ({\n        content: this.translateService.instant(`accessControl.actions.${action}`),\n        action,\n        selected: currentFilter.action === action,\n      }));\n    })\n  );\n\n  public readonly filteredModel$: Observable<EditorModel | null> = combineLatest([\n    this._sourceModel$,\n    this._filter$,\n  ]).pipe(\n    map(([sourceModel, currentFilter]) => {\n      if (!sourceModel) return null;\n      if (!currentFilter.resourceType && !currentFilter.action) return sourceModel;\n\n      const permissions = this.parsePermissions(sourceModel);\n      const filtered = permissions.filter(permission => {\n        const resourceMatch =\n          !currentFilter.resourceType || permission.resourceType === currentFilter.resourceType;\n        const actionMatch =\n          !currentFilter.action ||\n          (permission.actions ?? []).includes(currentFilter.action) ||\n          permission.action === currentFilter.action;\n        return resourceMatch && actionMatch;\n      });\n\n      return {\n        ...sourceModel,\n        value: JSON.stringify(filtered, null, 2),\n      };\n    })\n  );\n\n  public readonly editorDisabled$: Observable<boolean> = this._filter$.pipe(\n    map(({resourceType, action}) => !!resourceType || !!action)\n  );\n\n  public readonly permissionSchema$: Observable<PermissionSchema> = this.metadataService.schema$;\n\n  constructor(\n    private readonly activatedRoute: ActivatedRoute,\n    private readonly iconService: IconService,\n    private readonly metadataService: PermissionSchemaMetadataService,\n    private readonly router: Router,\n    private readonly translateService: TranslateService\n  ) {\n    this.iconService.registerAll([Filter16, TrashCan16]);\n  }\n\n  public ngOnInit(): void {\n    this.activatedRoute.queryParamMap.pipe(take(1)).subscribe(params => {\n      this._filter$.next({\n        resourceType: params.get('filterResourceType'),\n        action: params.get('filterAction'),\n      });\n    });\n\n    this._subscriptions.add(\n      this._filter$.pipe(skip(1)).subscribe(currentFilter => {\n        this.router.navigate([], {\n          relativeTo: this.activatedRoute,\n          queryParams: {\n            filterResourceType: currentFilter.resourceType ?? null,\n            filterAction: currentFilter.action ?? null,\n          },\n          queryParamsHandling: 'merge',\n          replaceUrl: true,\n        });\n      })\n    );\n  }\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (changes['model']) {\n      this._sourceModel$.next(this.model);\n    }\n  }\n\n  public ngOnDestroy(): void {\n    this._subscriptions.unsubscribe();\n  }\n\n  public onValid(valid: boolean): void {\n    this.validEvent.emit(valid);\n  }\n\n  public onValueChange(value: string): void {\n    if (this._filter$.getValue().resourceType || this._filter$.getValue().action) return;\n    this.valueChangeEvent.emit(value);\n  }\n\n  public onResourceTypeSelected(event: {item?: ListItem & {resourceType?: string}}): void {\n    const resourceType = event.item?.resourceType ?? null;\n    this._filter$.next({...this._filter$.getValue(), resourceType, action: null});\n  }\n\n  public onActionSelected(event: {item?: ListItem & {action?: string}}): void {\n    const action = event.item?.action ?? null;\n    this._filter$.next({...this._filter$.getValue(), action});\n  }\n\n  public onClearFilter(): void {\n    this._filter$.next({resourceType: null, action: null});\n  }\n\n  private parsePermissions(model: EditorModel | null): Permission[] {\n    if (!model?.value) return [];\n    try {\n      const parsed = JSON.parse(model.value);\n      return Array.isArray(parsed) ? (parsed as Permission[]) : [];\n    } catch {\n      return [];\n    }\n  }\n}\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\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","/*\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\nimport {Pipe, PipeTransform} from '@angular/core';\nimport {TranslateService} from '@ngx-translate/core';\nimport {formatResourceType} from '../utils';\n\n@Pipe({\n  standalone: true,\n  name: 'resourceTypeLabel',\n})\nexport class ResourceTypeLabelPipe implements PipeTransform {\n  constructor(private readonly translateService: TranslateService) {}\n\n  public transform(fqn: string | null | undefined): string {\n    if (!fqn) return '';\n    return formatResourceType(this.translateService, fqn);\n  }\n}\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\nexport * from './action-description.pipe';\nexport * from './action-label.pipe';\nexport * from './action-tag-type.pipe';\nexport * from './resource-type-label.pipe';\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\nimport {CommonModule} from '@angular/common';\nimport {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {RouterModule} from '@angular/router';\nimport {TranslateModule, TranslateService} from '@ngx-translate/core';\nimport {BehaviorSubject, combineLatest, map, Observable} from 'rxjs';\nimport {NO_CONTEXT_RESOURCE_TYPE} from '../../constants';\nimport {\n  ContainerCondition,\n  ExpressionCondition,\n  FieldCondition,\n  Permission,\n  PermissionCondition,\n} from '../../models';\nimport {ResourceTypeLabelPipe} from '../../pipes';\nimport {PermissionSchemaMetadataService} from '../../services';\nimport {formatField, formatOperator, formatValue} from '../../utils';\n\ninterface FormattedFieldCondition {\n  kind: 'field';\n  field: string;\n  operator: string;\n  value: string;\n  customField: boolean;\n}\n\ninterface FormattedExpressionCondition {\n  kind: 'expression';\n  field: string;\n  path: string;\n  operator: string;\n  value: string;\n  clazz: string;\n  customField: boolean;\n}\n\ninterface FormattedContainerCondition {\n  kind: 'container';\n  resourceType: string;\n  conditions: PermissionCondition[];\n  customResource: boolean;\n}\n\ntype FormattedCondition =\n  | FormattedFieldCondition\n  | FormattedExpressionCondition\n  | FormattedContainerCondition;\n\ninterface ActionOverview {\n  action: string;\n  grants: Permission[];\n}\n\ninterface ResourceOverview {\n  resourceType: string;\n  actions: ActionOverview[];\n}\n\n@Component({\n  standalone: true,\n  selector: 'valtimo-access-control-overview-tab',\n  templateUrl: './access-control-overview-tab.component.html',\n  styleUrls: ['./access-control-overview-tab.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  preserveWhitespaces: true,\n  imports: [CommonModule, RouterModule, TranslateModule, ResourceTypeLabelPipe],\n})\nexport class AccessControlOverviewTabComponent {\n  @Input() public roleKey: string | null = null;\n\n  @Input()\n  public set permissions(value: Permission[] | null) {\n    this._permissions$.next(value ?? []);\n  }\n\n  private readonly _permissions$ = new BehaviorSubject<Permission[]>([]);\n\n  public readonly overview$: Observable<ResourceOverview[]> = combineLatest([\n    this._permissions$,\n    this.metadataService.allResourceTypes$,\n    this.metadataService.actionsByResourceType$,\n  ]).pipe(\n    map(([permissions, allResourceTypes, actionsByResourceType]) =>\n      this.buildOverview(permissions, allResourceTypes, actionsByResourceType)\n    )\n  );\n\n  constructor(\n    private readonly metadataService: PermissionSchemaMetadataService,\n    private readonly translateService: TranslateService\n  ) {}\n\n  public formatConditions(\n    conditions: PermissionCondition[] | null | undefined,\n    resourceType: string\n  ): FormattedCondition[] {\n    return (conditions ?? []).map(condition => this.formatCondition(condition, resourceType));\n  }\n\n  public isNoContext(contextResourceType: string | null | undefined): boolean {\n    return contextResourceType === NO_CONTEXT_RESOURCE_TYPE;\n  }\n\n  private buildOverview(\n    permissions: Permission[],\n    allResourceTypes: string[],\n    actionsByResourceType: Record<string, string[]>\n  ): ResourceOverview[] {\n    const knownResourceTypes = new Set(allResourceTypes);\n    const extraResourceTypes = permissions\n      .map(p => p.resourceType)\n      .filter(rt => !!rt && !knownResourceTypes.has(rt));\n    const resourceTypes = [...allResourceTypes, ...Array.from(new Set(extraResourceTypes))];\n\n    return resourceTypes.map(resourceType => {\n      const forResource = permissions.filter(p => p.resourceType === resourceType);\n      const allowedActions = actionsByResourceType[resourceType] ?? [];\n      const allowedSet = new Set(allowedActions);\n      const extraActions = forResource\n        .flatMap(p => [...(p.actions ?? []), ...(p.action ? [p.action] : [])])\n        .filter(a => !!a && !allowedSet.has(a));\n      const actions = [...allowedActions, ...Array.from(new Set(extraActions))];\n\n      return {\n        resourceType,\n        actions: actions.map(action => ({\n          action,\n          grants: forResource.filter(p => this.permissionGrants(p, action)),\n        })),\n      };\n    });\n  }\n\n  private permissionGrants(permission: Permission, action: string): boolean {\n    if (permission.action === action) return true;\n    return (permission.actions ?? []).includes(action);\n  }\n\n  private formatCondition(\n    condition: PermissionCondition,\n    resourceType: string\n  ): FormattedCondition {\n    if (condition.type === 'container') {\n      return this.formatContainer(condition);\n    }\n    if (condition.type === 'expression') {\n      return this.formatExpression(condition, resourceType);\n    }\n    return this.formatField(condition, resourceType);\n  }\n\n  private formatField(condition: FieldCondition, resourceType: string): FormattedFieldCondition {\n    return {\n      kind: 'field',\n      field: formatField(this.translateService, resourceType, condition.field),\n      operator: formatOperator(this.translateService, condition.operator),\n      value: formatValue(this.translateService, condition.value),\n      customField: !this.metadataService.isFieldKnown(resourceType, condition.field),\n    };\n  }\n\n  private formatExpression(\n    condition: ExpressionCondition,\n    resourceType: string\n  ): FormattedExpressionCondition {\n    return {\n      kind: 'expression',\n      field: formatField(this.translateService, resourceType, condition.field),\n      path: condition.path,\n      operator: formatOperator(this.translateService, condition.operator),\n      value: formatValue(this.translateService, condition.value),\n      clazz: condition.clazz,\n      customField: !this.metadataService.isFieldKnown(resourceType, condition.field),\n    };\n  }\n\n  private formatContainer(condition: ContainerCondition): FormattedContainerCondition {\n    return {\n      kind: 'container',\n      resourceType: condition.resourceType,\n      conditions: condition.conditions ?? [],\n      customResource: !this.metadataService.isResourceTypeKnown(condition.resourceType),\n    };\n  }\n}\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\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","/*\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\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  OnDestroy,\n  OnInit,\n  QueryList,\n  signal,\n  ViewChild,\n  ViewChildren,\n} from '@angular/core';\nimport {AccessControlService} from '../../services/access-control.service';\nimport {AccessControlFormEditorTabComponent} from '../access-control-form-editor-tab/access-control-form-editor-tab.component';\nimport {BehaviorSubject, filter, finalize, map, Subscription, switchMap, take, tap} from 'rxjs';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {\n  EditorModel,\n  PageHeaderService,\n  PageTitleService,\n  PendingChangesComponent,\n} from '@valtimo/components';\nimport {Tab} from 'carbon-components-angular';\nimport {AccessControlEditorTab, Permission, Role} from '../../models';\nimport {TranslateService} from '@ngx-translate/core';\nimport {AccessControlExportService} from '../../services/access-control-export.service';\nimport {GlobalNotificationService} from '@valtimo/shared';\n\n@Component({\n  standalone: false,\n  templateUrl: './access-control-editor.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styleUrls: ['./access-control-editor.component.scss'],\n})\nexport class AccessControlEditorComponent\n  extends PendingChangesComponent\n  implements OnInit, OnDestroy\n{\n  public readonly model$ = new BehaviorSubject<EditorModel | null>(null);\n  public readonly permissions$ = new BehaviorSubject<Permission[] | null>(null);\n  public readonly roleKey$ = new BehaviorSubject<string | null>(null);\n  public readonly saveDisabled$ = new BehaviorSubject<boolean>(true);\n  public readonly editorDisabled$ = new BehaviorSubject<boolean>(false);\n  public readonly moreDisabled$ = new BehaviorSubject<boolean>(true);\n  public readonly showDeleteModal$ = new BehaviorSubject<boolean>(false);\n  public readonly showEditModal$ = new BehaviorSubject<boolean>(false);\n  public readonly selectedRowKeys$ = new BehaviorSubject<Array<string> | null>(null);\n  public readonly compactMode$ = this.pageHeaderService.compactMode$;\n\n  public readonly $activeTab = signal<AccessControlEditorTab>(AccessControlEditorTab.EDITOR);\n\n  protected readonly AccessControlEditorTab = AccessControlEditorTab;\n\n  // The Carbon tab headers, used to restore the highlighted header when a leave-page prompt is\n  // cancelled (Carbon highlights the clicked header immediately, before the guard resolves).\n  @ViewChildren(Tab) private _tabs!: QueryList<Tab>;\n\n  // The visual editor tab, used to re-open the rule that was open at save time once the saved model\n  // reloads. Undefined while another tab is active (it is only rendered on the editor tab).\n  @ViewChild(AccessControlFormEditorTabComponent)\n  private _formEditorTab?: AccessControlFormEditorTabComponent;\n\n  private _roleKeySubscription!: Subscription;\n  private _roleKey!: string;\n  private readonly _updatedModelValue$ = new BehaviorSubject<string>('');\n  // The form's serialized value captured on (re)load. Edits that differ from it mark the editor\n  // dirty so the leave-page guard can warn about unsaved changes.\n  private _pendingBaseline: string | null = null;\n\n  constructor(\n    private readonly accessControlService: AccessControlService,\n    private readonly route: ActivatedRoute,\n    private readonly pageTitleService: PageTitleService,\n    private readonly router: Router,\n    private readonly globalNotificationService: GlobalNotificationService,\n    private readonly translateService: TranslateService,\n    private readonly accessControlExportService: AccessControlExportService,\n    private readonly pageHeaderService: PageHeaderService\n  ) {\n    super();\n  }\n\n  public ngOnInit(): void {\n    this.restoreActiveTabFromUrl();\n    this.openRoleKeySubscription();\n  }\n\n  public ngOnDestroy(): void {\n    this.pendingChanges = false;\n    this.pageTitleService.enableReset();\n    this._roleKeySubscription?.unsubscribe();\n  }\n\n  public onValid(valid: boolean): void {\n    this.saveDisabled$.next(valid === false);\n  }\n\n  public onValueChange(value: string): void {\n    // The first emission after a (re)load is the editor's baseline. Comparison is done on the\n    // normalized (whitespace-insensitive) JSON so the JSON editor's format-on-load reflow is not\n    // mistaken for an edit; only a genuine content change marks the editor dirty. Each tab keeps\n    // its own baseline (the editor reloads from the saved model per tab), so the JSON and visual\n    // editors track their unsaved state independently.\n    const normalized = this.normalizeJson(value);\n    if (this._pendingBaseline === null) {\n      this._pendingBaseline = normalized;\n      this.pendingChanges = false;\n    } else {\n      this.pendingChanges = normalized !== this._pendingBaseline;\n    }\n\n    this._updatedModelValue$.next(value);\n  }\n\n  // Canonicalizes a JSON string by dropping insignificant whitespace, so reformatting (such as the\n  // JSON editor's format-on-load) does not register as a change. Invalid JSON is compared as-is.\n  private normalizeJson(value: string): string {\n    try {\n      return JSON.stringify(JSON.parse(value));\n    } catch {\n      return value;\n    }\n  }\n\n  protected override onCancelRedirect(): void {\n    this.syncTabHeaders();\n  }\n\n  // The Carbon tab header highlights the clicked tab immediately; if the leave-page prompt is\n  // cancelled, restore the highlight to the tab that is actually still active.\n  private syncTabHeaders(): void {\n    const order = [\n      AccessControlEditorTab.EDITOR,\n      AccessControlEditorTab.SUMMARY,\n      AccessControlEditorTab.JSON_EDITOR,\n    ];\n    this._tabs?.forEach((tab, index) => {\n      tab.active = order[index] === this.$activeTab();\n    });\n  }\n\n  public updatePermissions(): void {\n    // Preserve the open rule across the reload that follows this save (a one-shot; only after an\n    // explicit save, never on an ordinary tab open).\n    this._formEditorTab?.prepareSelectionReopen();\n\n    this.disableEditor();\n    this.disableSave();\n    this.disableMore();\n\n    this._updatedModelValue$\n      .pipe(\n        take(1),\n        switchMap(updatedModelValue =>\n          this.accessControlService.updateRolePermissions(\n            this._roleKey,\n            JSON.parse(updatedModelValue)\n          )\n        )\n      )\n      .subscribe({\n        next: result => {\n          this.enableMore();\n          this.enableSave();\n          this.enableEditor();\n          this.showSuccessMessage(this._roleKey);\n          this.setModel(result);\n        },\n        error: () => {\n          this.enableMore();\n          this.enableSave();\n          this.enableEditor();\n        },\n      });\n  }\n\n  public onDelete(roles: Array<string>): void {\n    this.disableEditor();\n    this.disableSave();\n    this.disableMore();\n\n    this.accessControlService.dispatchAction(\n      this.accessControlService.deleteRoles({roles}).pipe(\n        finalize(() => {\n          this.router.navigate(['/access-control']);\n        })\n      )\n    );\n  }\n\n  public showDeleteModal(): void {\n    this.showDeleteModal$.next(true);\n  }\n\n  public showEditModal(): void {\n    this.showEditModal$.next(true);\n  }\n\n  public onEdit(currentRoleKey: string, data: Role | null): void {\n    this.showEditModal$.next(false);\n\n    if (!data) {\n      return;\n    }\n\n    this.disableEditor();\n    this.disableSave();\n    this.disableMore();\n\n    this.accessControlService.updateRole(currentRoleKey, data).subscribe(() => {\n      this.router.navigate([`/access-control/${data.roleKey}`]);\n      this.showSuccessMessage(data.roleKey);\n    });\n  }\n\n  public setActiveTab(tab: AccessControlEditorTab): void {\n    if (this.$activeTab() === tab) return;\n\n    const roleKey = this.route.snapshot.paramMap.get('id');\n    if (!roleKey) {\n      this.$activeTab.set(tab);\n      return;\n    }\n\n    this.router.navigate(this.segmentsForTab(tab, roleKey));\n  }\n\n  private segmentsForTab(tab: AccessControlEditorTab, roleKey: string): string[] {\n    switch (tab) {\n      case AccessControlEditorTab.SUMMARY:\n        return ['/access-control', roleKey, 'summary'];\n      case AccessControlEditorTab.JSON_EDITOR:\n        return ['/access-control', roleKey, 'json-editor'];\n      default:\n        return ['/access-control', roleKey];\n    }\n  }\n\n  private restoreActiveTabFromUrl(): void {\n    const url = this.route.snapshot.url;\n    const lastSegment = url[url.length - 1]?.path;\n    if (lastSegment === 'summary') {\n      this.$activeTab.set(AccessControlEditorTab.SUMMARY);\n      return;\n    }\n    if (lastSegment === 'json-editor') {\n      this.$activeTab.set(AccessControlEditorTab.JSON_EDITOR);\n      return;\n    }\n\n    // The base URL (no tab segment) opens the visual editor — the first and default tab.\n    const params = this.route.snapshot.queryParamMap;\n    if (params.get('filterResourceType') || params.get('filterAction')) {\n      this.$activeTab.set(AccessControlEditorTab.JSON_EDITOR);\n    }\n  }\n\n  public exportPermissions(): void {\n    this.accessControlExportService\n      .exportRoles({type: 'separate', roleKeys: [this._roleKey]})\n      .subscribe();\n  }\n\n  private openRoleKeySubscription(): void {\n    this._roleKeySubscription = this.route.params\n      .pipe(\n        filter(params => params?.id),\n        map(params => params.id),\n        tap(roleKey => {\n          this._roleKey = roleKey;\n          this.roleKey$.next(roleKey);\n          this.pageTitleService.setCustomPageTitle(roleKey, true);\n          this.selectedRowKeys$.next([roleKey]);\n        }),\n        switchMap(roleKey => this.accessControlService.getRolePermissions(roleKey)),\n        tap(permissions => {\n          this.enableMore();\n          this.enableSave();\n          this.enableEditor();\n          this.setModel(permissions);\n        })\n      )\n      .subscribe();\n  }\n\n  private setModel(permissions: object): void {\n    // A freshly loaded or saved model is the new clean baseline; the next value emission recaptures\n    // it and any prior unsaved-changes flag is cleared.\n    this._pendingBaseline = null;\n    this.pendingChanges = false;\n\n    const roleKey = this.roleKey$.value ?? 'unknown';\n    this.model$.next({\n      value: JSON.stringify(permissions),\n      language: 'json',\n      uri: `inmemory://access-control/role-${roleKey}.access-control-permissions.json`,\n    });\n    this.permissions$.next(Array.isArray(permissions) ? (permissions as Permission[]) : null);\n  }\n\n  private disableMore(): void {\n    this.moreDisabled$.next(true);\n  }\n\n  private enableMore(): void {\n    this.moreDisabled$.next(false);\n  }\n\n  private disableSave(): void {\n    this.saveDisabled$.next(true);\n  }\n\n  private enableSave(): void {\n    this.saveDisabled$.next(false);\n  }\n\n  private disableEditor(): void {\n    this.editorDisabled$.next(true);\n  }\n\n  private enableEditor(): void {\n    this.editorDisabled$.next(false);\n  }\n\n  private showSuccessMessage(roleKey: string): void {\n    this.globalNotificationService.showToast({\n      title: this.translateService.instant('accessControl.roles.savedSuccessTitle'),\n      caption: this.translateService.instant('accessControl.roles.savedSuccessTitleMessage', {\n        roleKey,\n      }),\n      type: 'success',\n    });\n  }\n}\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\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","/*\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 */\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {RouterModule, Routes} from '@angular/router';\nimport {ROLE_ADMIN} from '@valtimo/shared';\nimport {AuthGuardService} from '@valtimo/security';\nimport {AccessControlOverviewComponent} from './components/overview/access-control-overview.component';\nimport {AccessControlEditorComponent} from './components/editor/access-control-editor.component';\nimport {pendingChangesGuard} from '@valtimo/components';\n\nconst routes: Routes = [\n  {\n    path: 'access-control',\n    component: AccessControlOverviewComponent,\n    canActivate: [AuthGuardService],\n    data: {title: 'Access control', roles: [ROLE_ADMIN]},\n  },\n  {\n    path: 'access-control/:id',\n    component: AccessControlEditorComponent,\n    canActivate: [AuthGuardService],\n    canDeactivate: [pendingChangesGuard],\n    data: {\n      title: 'Role details',\n      roles: [ROLE_ADMIN],\n      customPageTitle: true,\n    },\n  },\n  {\n    path: 'access-control/:id/summary',\n    component: AccessControlEditorComponent,\n    canActivate: [AuthGuardService],\n    canDeactivate: [pendingChangesGuard],\n    data: {\n      title: 'Role details',\n      roles: [ROLE_ADMIN],\n      customPageTitle: true,\n    },\n  },\n  {\n    path: 'access-control/:id/json-editor',\n    component: AccessControlEditorComponent,\n    canActivate: [AuthGuardService],\n    canDeactivate: [pendingChangesGuard],\n    data: {\n      title: 'Role details',\n      roles: [ROLE_ADMIN],\n      customPageTitle: true,\n    },\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(routes)],\n  exports: [RouterModule],\n})\nexport class AccessControlManagementRoutingModule {}\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 */\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {\n  CarbonListModule,\n  ConfirmationModalModule,\n  FitPageDirective,\n  OverflowMenuComponent,\n  OverflowMenuOptionComponent,\n  OverflowMenuTriggerComponent,\n  RenderInPageHeaderDirective,\n  SelectModule,\n  TooltipIconModule,\n} from '@valtimo/components';\nimport {AccessControlManagementRoutingModule} from './access-control-management-routing.module';\nimport {AccessControlOverviewComponent} from './components/overview/access-control-overview.component';\nimport {RoleMetadataModalComponent} from './components/role-metadata-modal/role-metadata-modal.component';\nimport {\n  AccordionModule,\n  ButtonModule,\n  CheckboxModule,\n  ContentSwitcherModule,\n  IconModule,\n  InputModule,\n  LayerModule,\n  LoadingModule,\n  ModalModule,\n  NotificationModule,\n  TabsModule,\n  TagModule,\n  ToggleModule,\n} from 'carbon-components-angular';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {AccessControlEditorComponent} from './components/editor/access-control-editor.component';\nimport {AccessControlFormEditorTabComponent} from './components/access-control-form-editor-tab/access-control-form-editor-tab.component';\nimport {AccessControlJsonEditorTabComponent} from './components/access-control-json-editor-tab/access-control-json-editor-tab.component';\nimport {AccessControlOverviewTabComponent} from './components/access-control-overview-tab/access-control-overview-tab.component';\nimport {ConditionTreeComponent} from './components/condition-tree/condition-tree.component';\nimport {DeleteRoleModalComponent} from './components/delete-role-modal/delete-role-modal.component';\nimport {ExportRoleModalComponent} from './components/export-role-modal/export-role-modal.component';\nimport {PermissionFormComponent} from './components/permission-form/permission-form.component';\nimport {ActionDescriptionPipe, ActionLabelPipe, ActionTagTypePipe} from './pipes';\n\n@NgModule({\n  declarations: [\n    AccessControlOverviewComponent,\n    RoleMetadataModalComponent,\n    AccessControlEditorComponent,\n    AccessControlFormEditorTabComponent,\n    ConditionTreeComponent,\n    DeleteRoleModalComponent,\n    ExportRoleModalComponent,\n    PermissionFormComponent,\n  ],\n  imports: [\n    CommonModule,\n    AccessControlManagementRoutingModule,\n    ButtonModule,\n    FormsModule,\n    ModalModule,\n    TranslateModule,\n    ReactiveFormsModule,\n    InputModule,\n    IconModule,\n    ConfirmationModalModule,\n    RenderInPageHeaderDirective,\n    FitPageDirective,\n    LoadingModule,\n    IconModule,\n    OverflowMenuComponent,\n    OverflowMenuOptionComponent,\n    OverflowMenuTriggerComponent,\n    NotificationModule,\n    CarbonListModule,\n    SelectModule,\n    TooltipIconModule,\n    TabsModule,\n    ToggleModule,\n    ContentSwitcherModule,\n    AccordionModule,\n    CheckboxModule,\n    LayerModule,\n    TagModule,\n    AccessControlJsonEditorTabComponent,\n    AccessControlOverviewTabComponent,\n    ActionLabelPipe,\n    ActionDescriptionPipe,\n    ActionTagTypePipe,\n  ],\n})\nexport class AccessControlManagementModule {}\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\n/*\n * Public API Surface of access-control\n */\n\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/access-control-management.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.AccessControlService","i2.AccessControlService","i4","i5","i6","i2","i3","i2.AccessControlExportService","i7.RoleMetadataModalComponent","i8.DeleteRoleModalComponent","i9.ExportRoleModalComponent","i10","i1.AccessControlFormEditorService","i6.ConditionTreeComponent","i7","i8.ActionLabelPipe","i9.ActionDescriptionPipe","i10.ActionTagTypePipe","i1.PermissionSchemaMetadataService","i5.PermissionFormComponent","i7.ActionLabelPipe","i8.ActionTagTypePipe","i3.PermissionSchemaMetadataService","i6.AccessControlExportService","i8","i9.AccessControlJsonEditorTabComponent","i10.AccessControlOverviewTabComponent","i11.RoleMetadataModalComponent","i12.AccessControlFormEditorTabComponent","i13.DeleteRoleModalComponent"],"mappings":"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"}