@yuuvis/user-management-app 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-user-management-app.mjs","sources":["../../../../../projects/yuuvis/user-management-app/src/lib/user-management.schema.ts","../../../../../projects/yuuvis/user-management-app/src/lib/user-management.service.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/settings/settings.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/settings/settings.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/container/user-management.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/container/user-management.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/pipes/role-localization.pipes.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/user-details/user-details.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/user-details/user-details.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-user/create-user.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-user/create-user.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/components/roles-selection/roles-selection.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/roles-selection/roles-selection.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-user/edit-user.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-user/edit-user.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/pages/users/users.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/pages/users/users.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-group/create-group.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-group/create-group.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/components/group-details/group-details.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/group-details/group-details.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-group/edit-group.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-group/edit-group.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/pages/groups/groups.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/pages/groups/groups.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/lib.routes.ts","../../../../../projects/yuuvis/user-management-app/src/yuuvis-user-management-app.ts"],"sourcesContent":["export const APP_ID = 'io.yuuvis.app.user-management';\n\n/**\n * Role that marks a user as managed by an external identity provider (SCIM). It must never be\n * assignable or removable through this UI. The backend already hides it, but we filter it out\n * defensively in case a future backend change starts returning it from the roles endpoint again.\n */\nexport const SCIM_MANAGED_ROLE = 'scim-managed';\n\nexport interface GroupObject {\n id: string,\n name: string;\n description: string;\n}\n\nexport interface GroupDetailsObject extends GroupObject {\n members: string[];\n roles: string[];\n}\n\nexport interface GroupsSearchResponse {\n hasMoreItems: boolean;\n numItems: number;\n totalNumItems: number;\n objects: GroupObject[];\n}\n\nexport interface UserObject {\n id: string,\n username: string;\n firstName: string;\n lastName: string;\n email: string;\n enabled: boolean;\n /** Read-only flag set by the backend for users provisioned via an external identity provider (e.g. SCIM from Entra ID). */\n externallyManaged?: boolean;\n}\n\nexport interface UserDetailsObject extends UserObject {\n groups: string[];\n roles: string[];\n effectiveRoles: string[];\n}\n\nexport interface UsersSearchResponse {\n hasMoreItems: boolean;\n numItems: number;\n totalNumItems: number;\n objects: UserObject[];\n}\n\n/**\n * OIDC identity provider configuration of the current tenant (e.g. Microsoft Entra ID) as\n * returned by `/tenant-management/api/admin/identity-provider/oidc`. Sensitive config values\n * (e.g. clientSecret) are removed by the backend before delivery.\n */\nexport interface OIDCProviderConfig {\n /** Display name shown on the login page. */\n displayName?: string;\n /** Provider-specific configuration (clientId, metadataDescriptorUrl, defaultScope, ...). */\n config?: Record<string, string>;\n /** Computed redirect URI that must be registered with the external IdP. */\n redirectUri?: string;\n /** SCIM provisioning settings to configure at the external IdP (only present if a SCIM client exists in the tenant's realm). */\n scimProvisioning?: {\n tenantUrl?: string;\n tokenEndpoint?: string;\n clientId?: string;\n clientSecret?: string;\n };\n}\n\nexport const APP_ICONS = {\n refresh: 'refresh',\n stateActive: 'account_circle',\n stateInactive: 'account_circle_off',\n sourceExternal: 'cloud',\n actionCreateNewUser: 'person_add',\n actionEditUser: 'person_edit',\n actionActivateUser: 'person_check',\n actionDeactivateUser: 'person_off',\n actionDeleteUser: 'delete',\n actionEditGroup: 'edit',\n actionSettings: 'settings',\n};","import { inject, Injectable } from '@angular/core';\nimport { ApiBase, BackendService, TranslateService } from '@yuuvis/client-core';\nimport { UserDetailsObject, UserObject, UsersSearchResponse, GroupDetailsObject, GroupObject, GroupsSearchResponse, OIDCProviderConfig, SCIM_MANAGED_ROLE } from './user-management.schema';\nimport { HttpParams } from '@angular/common/http';\nimport { forkJoin, map, Observable, of, switchMap } from 'rxjs';\nimport { UserRequest, GroupRequest } from './user-request';\n\nimport { ConfirmService } from '@yuuvis/client-components/common';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class YuvUserManagementService {\n\n static DEFAULT_PAGE_SIZE = 15;\n\n readonly #backendService = inject(BackendService);\n readonly #translateService = inject(TranslateService);\n readonly #confirmService = inject(ConfirmService);\n\n fetchUsers(page = 0, search?: string): Observable<UsersSearchResponse> {\n const filterParams = new HttpParams()\n .set('page', page)\n .set('size', YuvUserManagementService.DEFAULT_PAGE_SIZE)\n .set('sort', 'username%2Casc')\n .set('search', search || '');\n\n return this.#backendService\n .get(`/tenant-management/api/idm/users?${filterParams}`, ApiBase.none);\n }\n\n fetchGroups(page = 0, search?: string): Observable<GroupsSearchResponse> {\n const filterParams = new HttpParams()\n .set('page', page)\n .set('size', YuvUserManagementService.DEFAULT_PAGE_SIZE)\n .set('sort', 'name%2Casc')\n .set('search', search || '');\n\n return this.#backendService\n .get(`/tenant-management/api/idm/groups?${filterParams}`, ApiBase.none);\n }\n\n fetchAllRoles(): Observable<string[]> {\n return this.#backendService\n .get(`/tenant-management/api/idm/roles`, ApiBase.none)\n .pipe(\n map((roles: { name: string, description: string }[]) =>\n roles\n .map(role => role.name)\n .filter(name => name !== SCIM_MANAGED_ROLE))\n );\n }\n\n createUser(createUserRequest: UserRequest, withInvitation?: boolean): Observable<string> {\n const createParams = new HttpParams()\n .set('withInvitation', withInvitation || false)\n .set('temporaryPassword', true);\n\n return this.#backendService\n .post(`/tenant-management/api/idm/users?${createParams}`, createUserRequest, ApiBase.none, { responseType: 'text' })\n .pipe(\n map((createdUserId: string) => createdUserId)\n );\n }\n\n updateUser(userId: string, updateUserRequest: UserRequest): Observable<void> {\n return this.#backendService\n .put(`/tenant-management/api/idm/users/${userId}`, updateUserRequest, ApiBase.none);\n }\n\n deleteUser(user: UserObject): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.confirm.message',\n { username: user.username }\n ),\n confirmLabel: this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.confirm.label'\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(`/tenant-management/api/idm/users/${user.id}`, ApiBase.none)\n .pipe(\n map(() => true)\n );\n } else return of(false);\n })\n );\n }\n\n createGroup(createGroupRequest: GroupRequest): Observable<string> {\n const createParams = new HttpParams()\n\n return this.#backendService\n .post(`/tenant-management/api/idm/groups?${createParams}`, createGroupRequest, ApiBase.none, { responseType: 'text' })\n .pipe(\n map((createdGroupId: string) => createdGroupId)\n );\n }\n\n updateGroup(groupId: string, updateGroupRequest: GroupRequest): Observable<void> {\n return this.#backendService\n .put(`/tenant-management/api/idm/groups/${groupId}`, updateGroupRequest, ApiBase.none);\n }\n\n deleteGroup(group: GroupObject): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.delete.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.delete.confirm.message',\n { name: group.name }\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(`/tenant-management/api/idm/groups/${group.id}`, ApiBase.none)\n .pipe(\n map(() => true)\n );\n } else return of(false);\n })\n );\n }\n\n getUserDetails(id: string): Observable<UserDetailsObject> {\n const queryParams = new HttpParams()\n .set('briefRepresentation', false)\n\n const combined$: Observable<UserDetailsObject> = forkJoin({\n userDetails: this.#backendService\n .get(`/tenant-management/api/idm/users/${id}?${queryParams}`, ApiBase.none)\n .pipe(\n map(user => {\n const { roles: effectiveRoles, ...rest } = user;\n return { effectiveRoles, ...rest };\n })\n ),\n userRoles: this.#backendService\n .get(`/tenant-management/api/idm/users/${id}/roles`, ApiBase.none)\n }).pipe(\n map((response): UserDetailsObject => ({\n ...response.userDetails,\n roles: response.userRoles\n })));\n\n return combined$;\n }\n\n /**\n * Fetches the OIDC identity provider configuration (e.g. Microsoft Entra ID) of the current\n * tenant. Emits a 404 error if no OIDC identity provider is configured.\n */\n fetchOIDCProviderConfig(): Observable<OIDCProviderConfig> {\n return this.#backendService\n .get(`/tenant-management/api/admin/identity-provider/oidc`, ApiBase.none);\n }\n\n /**\n * Creates (or updates) the OIDC identity provider configuration of the current tenant. The\n * discovery URL must be passed as `config.metadataDescriptorUrl` — the backend resolves the\n * OIDC endpoints (authorizationUrl, tokenUrl, jwksUrl, ...) from the discovery document.\n */\n setOIDCProviderConfig(providerConfig: OIDCProviderConfig): Observable<OIDCProviderConfig> {\n return this.#backendService\n .post(`/tenant-management/api/admin/identity-provider/oidc`, providerConfig, ApiBase.none);\n }\n\n /**\n * Deletes the OIDC identity provider configuration of the current tenant, after the user\n * confirmed the action.\n */\n deleteOIDCProviderConfig(): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.settings.oidc.action.delete.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.settings.oidc.action.delete.confirm.message'\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(`/tenant-management/api/admin/identity-provider/oidc`, ApiBase.none)\n .pipe(\n map(() => true)\n );\n } else return of(false);\n })\n );\n }\n\n getGroupDetails(id: string): Observable<GroupDetailsObject> {\n const queryParams = new HttpParams()\n .set('briefRepresentation', false)\n\n return this.#backendService\n .get(`/tenant-management/api/idm/groups/${id}?${queryParams}`, ApiBase.none);\n }\n}","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, signal } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ClipboardModule } from '@angular/cdk/clipboard';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { switchMap } from 'rxjs';\nimport { Logger, NotificationService, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { OIDCProviderConfig } from '../../user-management.schema';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent];\n\nconst modules = [CommonModule, ReactiveFormsModule, TranslatePipe, ClipboardModule, MatButtonModule, MatFormFieldModule, MatIconModule, MatInputModule, MatTooltipModule];\n\n/** Placeholder shown in the client secret field of an already configured provider; the backend never returns the real secret. */\nconst FAKE_CLIENT_SECRET = '••••••••••••••••';\n\n@Component({\n selector: 'ymusrmgmt-settings',\n templateUrl: './settings.component.html',\n styleUrl: './settings.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class SettingsComponent {\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<SettingsComponent>);\n readonly #translateService = inject(TranslateService);\n readonly #notificationService = inject(NotificationService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(true);\n\n error = signal<string | undefined>(undefined);\n\n /** True if the tenant has no OIDC identity provider configured (backend responds with 404). */\n notConfigured = signal<boolean>(false);\n\n provider = signal<OIDCProviderConfig | undefined>(undefined);\n\n /**\n * SCIM tenant URL. Uses the backend-provided value if present; otherwise falls back to a\n * client-side computation from the redirect URI: `{redirectUri up to and including /realms/{tenant}}/scim/v2`.\n */\n tenantUrl = computed(() => {\n const scimTenantUrl = this.provider()?.scimProvisioning?.tenantUrl;\n if (scimTenantUrl) return scimTenantUrl;\n\n const redirectUri = this.provider()?.redirectUri;\n const match = redirectUri?.match(/^(.*\\/realms\\/[^/]+)\\//);\n return match ? `${match[1]}/scim/v2` : undefined;\n });\n\n displayName = new FormControl('Microsoft Entra ID', [Validators.required]);\n discoveryUrl = new FormControl('', [Validators.required]);\n clientId = new FormControl('', [Validators.required]);\n clientSecret = new FormControl('', [Validators.required]);\n\n form: FormGroup = this.#fb.group({\n displayName: this.displayName,\n discoveryUrl: this.discoveryUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n\n /** Only used to update the client secret of an already configured OIDC identity provider, e.g. after it was rotated at the IdP. Pre-filled with a fake value; the update button unlocks once the user edits it. */\n newClientSecret = new FormControl('');\n\n constructor() {\n this.#loadProviderConfig();\n }\n\n /** Resets the client secret field back to its fake placeholder value, pristine, so the update button locks again. */\n #resetNewClientSecretField() {\n this.newClientSecret.setValue(FAKE_CLIENT_SECRET);\n this.newClientSecret.markAsPristine();\n }\n\n #loadProviderConfig() {\n this.#userManagementService.fetchOIDCProviderConfig().subscribe({\n next: (provider) => {\n this.provider.set(provider);\n this.notConfigured.set(false);\n this.#resetNewClientSecretField();\n this.busy.set(false);\n },\n error: (e) => {\n if (e.status === 404) {\n this.notConfigured.set(true);\n } else {\n this.error.set(this.#translateService.instant('yuv.app.user-management.settings.oidc.error.unknown'));\n this.#logger.error('Failed to fetch OIDC identity provider configuration', e);\n }\n this.busy.set(false);\n },\n });\n }\n\n configure() {\n this.busy.set(true);\n this.error.set(undefined);\n\n const providerConfig: OIDCProviderConfig = {\n displayName: this.displayName.value?.trim() ?? '',\n config: {\n // The discovery URL must be sent as `metadataDescriptorUrl` — the backend resolves the\n // OIDC endpoints (authorizationUrl, tokenUrl, jwksUrl, ...) from the discovery document.\n metadataDescriptorUrl: this.discoveryUrl.value?.trim() ?? '',\n clientId: this.clientId.value?.trim() ?? '',\n clientSecret: this.clientSecret.value ?? '',\n defaultScope: 'openid profile',\n },\n };\n\n this.#userManagementService\n .setOIDCProviderConfig(providerConfig)\n .pipe(\n // Re-fetch so the overlay shows exactly what a fresh GET delivers (secrets stripped etc.).\n switchMap(() => this.#userManagementService.fetchOIDCProviderConfig())\n )\n .subscribe({\n next: (provider) => {\n this.provider.set(provider);\n this.notConfigured.set(false);\n this.#resetNewClientSecretField();\n this.busy.set(false);\n },\n error: (e) => {\n // 422: the backend could not resolve the OIDC endpoints from the discovery URL\n this.error.set(this.#translateService.instant(\n e.status === 422\n ? 'yuv.app.user-management.settings.oidc.configure.error.discovery'\n : 'yuv.app.user-management.settings.oidc.configure.error.unknown'\n ));\n this.#logger.error('Failed to configure OIDC identity provider', e);\n this.busy.set(false);\n },\n });\n }\n\n /** Updates the client secret of the already configured OIDC identity provider, keeping all other config values unchanged. */\n update() {\n const oidcProvider = this.provider();\n const newClientSecret = this.newClientSecret.value?.trim();\n if (!oidcProvider || !this.newClientSecret.dirty || !newClientSecret) return;\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const providerConfig: OIDCProviderConfig = {\n displayName: oidcProvider.displayName,\n config: {\n metadataDescriptorUrl: oidcProvider.config?.['metadataDescriptorUrl'] ?? '',\n clientId: oidcProvider.config?.['clientId'] ?? '',\n clientSecret: newClientSecret,\n defaultScope: oidcProvider.config?.['defaultScope'] ?? '',\n },\n };\n\n this.#userManagementService\n .setOIDCProviderConfig(providerConfig)\n .pipe(\n // Re-fetch so the overlay shows exactly what a fresh GET delivers (secrets stripped etc.).\n switchMap(() => this.#userManagementService.fetchOIDCProviderConfig())\n )\n .subscribe({\n next: (provider) => {\n this.provider.set(provider);\n this.#resetNewClientSecretField();\n this.busy.set(false);\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.update.success')\n );\n },\n error: (e) => {\n this.error.set(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.update.error'));\n this.#logger.error('Failed to update the OIDC identity provider client secret', e);\n this.busy.set(false);\n },\n });\n }\n\n /** Asks the user to confirm, then deletes the OIDC identity provider configuration. */\n delete() {\n this.#userManagementService.deleteOIDCProviderConfig().subscribe({\n next: (deleted) => {\n if (deleted) {\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.delete.success')\n );\n this.#dialogRef.close();\n }\n },\n error: (e) => {\n this.#notificationService.error(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.delete.error')\n );\n this.#logger.error('Failed to delete OIDC identity provider configuration', e);\n },\n });\n }\n\n /** Handles the `cdkCopyToClipboardCopied` output, which reports whether the copy succeeded. */\n onCopied(success: boolean) {\n if (success) {\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.copy.success')\n );\n } else {\n this.#notificationService.error(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.copy.error')\n );\n }\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.settings.dialog.title' | translate\">\n <main class=\"yuv-dialog-content\">\n @if (notConfigured()) {\n <p class=\"hint\">{{ 'yuv.app.user-management.settings.oidc.notConfigured' | translate }}</p>\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.displayName' | translate }}</mat-label>\n <input matInput [formControl]=\"displayName\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.discoveryUrl' | translate }}</mat-label>\n <input matInput [formControl]=\"discoveryUrl\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.clientId' | translate }}</mat-label>\n <input matInput [formControl]=\"clientId\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.clientSecret' | translate }}</mat-label>\n <input matInput [formControl]=\"clientSecret\" type=\"password\" autocomplete=\"new-password\" />\n </mat-form-field>\n </form>\n } @else if (provider(); as oidcProvider) {\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.displayName' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.displayName || '—'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.discoveryUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.config?.['metadataDescriptorUrl'] || '—'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.clientId' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.config?.['clientId'] || '—'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.clientSecret' | translate }}</mat-label>\n <input matInput [formControl]=\"newClientSecret\" type=\"password\" autocomplete=\"new-password\" />\n </mat-form-field>\n @if (oidcProvider.redirectUri; as redirectUri) {\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.redirectUri' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"redirectUri\" />\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"redirectUri\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n }\n\n @if (oidcProvider.scimProvisioning; as scimProvisioning) {\n <h4>{{ 'yuv.app.user-management.settings.oidc.section.provisioning' | translate }}</h4>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.tenantUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"tenantUrl() || '—'\" />\n @if (tenantUrl(); as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.tokenUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.tokenEndpoint || '—'\" />\n @if (scimProvisioning.tokenEndpoint; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.clientName' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.clientId || '—'\" />\n @if (scimProvisioning.clientId; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.clientSecret' | translate }}</mat-label>\n <input matInput type=\"password\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.clientSecret || '—'\" />\n @if (scimProvisioning.clientSecret; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n }\n\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n @if (provider()) {\n <button ymtButton=\"danger\" class=\"delete-button\" [disabled]=\"busy()\" (click)=\"delete()\">\n {{ 'yuv.app.user-management.settings.oidc.action.delete.label' | translate }}\n </button>\n }\n <button [ymtButton]=\"notConfigured() ? 'secondary' : 'primary'\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.settings.action.button.close' | translate }}\n </button>\n @if (notConfigured()) {\n <button ymtButton=\"primary\" [disabled]=\"busy() || form.invalid\" (click)=\"configure()\">\n {{ 'yuv.app.user-management.settings.action.button.configure' | translate }}\n </button>\n } @else if (provider()) {\n <button ymtButton=\"secondary\" [disabled]=\"busy() || !newClientSecret.dirty || !newClientSecret.value?.trim()\" (click)=\"update()\">\n {{ 'yuv.app.user-management.settings.oidc.action.update.label' | translate }}\n </button>\n }\n </footer>\n</yuv-dialog>\n","import { Component, inject, OnInit } from '@angular/core';\nimport { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { filter } from 'rxjs/operators';\nimport { Title } from '@angular/platform-browser';\n\nimport { TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\nimport { YuvClientShellModule } from '@yuuvis/client-shell';\n\nimport { APP_ICONS, APP_ID } from '../user-management.schema';\nimport { ShellService } from '@yuuvis/client-shell-core';\nimport { SettingsComponent } from '../overlays/settings/settings.component';\n\ninterface View {\n id: string;\n title: string;\n link: string;\n tooltip: string;\n}\n\n@Component({\n selector: 'ymusrmgmt-root',\n standalone: true,\n imports: [\n MatButtonModule,\n MatButtonToggleModule,\n MatIconModule,\n MatTooltipModule,\n RouterModule,\n TranslatePipe,\n YmtPanesModule,\n YuvClientShellModule,\n ],\n templateUrl: './user-management.component.html',\n styleUrl: './user-management.component.scss',\n})\nexport class YuvUserManagementComponent implements OnInit {\n\n #shell = inject(ShellService);\n #titleService = inject(Title);\n #translateService = inject(TranslateService);\n #router = inject(Router);\n #activatedRoute = inject(ActivatedRoute);\n #dialog = inject(MatDialog);\n\n #app = this.#shell.getApp(APP_ID);\n appName = this.#app?.title as string;\n\n readonly icons = APP_ICONS;\n\n readonly views: View[] = [\n { id: 'users', title: 'yuv.app.user-management.navigation.users.label', link: 'users', tooltip: 'yuv.app.user-management.navigation.users.tooltip' },\n { id: 'groups', title: 'yuv.app.user-management.navigation.groups.label', link: 'groups', tooltip: 'yuv.app.user-management.navigation.groups.tooltip' },\n ];\n\n activeLink = this.views[0].link;\n\n constructor() {\n this.#router.events.pipe(\n filter(e => e instanceof NavigationEnd)\n ).subscribe((e: NavigationEnd) => {\n const view = this.views.find(v => e.urlAfterRedirects.includes('/' + v.link));\n if (view) this.activeLink = view.link;\n });\n }\n\n ngOnInit() {\n const translatedTitle = this.appName.startsWith('yuv.')\n ? this.#translateService.instant(this.appName)\n : this.appName;\n this.#titleService.setTitle(translatedTitle);\n }\n\n navigate(link: string) {\n this.#router.navigate([link], { relativeTo: this.#activatedRoute });\n }\n\n openSettings() {\n this.#dialog.open(SettingsComponent, {\n width: '600px',\n maxWidth: '90vw',\n });\n }\n}\n","<ng-template yuvAppHeaderSlot=\"actions\">\n <div class=\"usrmgmt-header-actions\">\n <mat-button-toggle-group [value]=\"activeLink\" (change)=\"navigate($event.value)\" hideSingleSelectionIndicator>\n @for (view of views; track view.id) {\n <mat-button-toggle [value]=\"view.link\" [matTooltip]=\"view.tooltip | translate\">{{ view.title | translate }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button\n mat-icon-button\n class=\"usrmgmt-settings-button\"\n [matTooltip]=\"'yuv.app.user-management.navigation.settings.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.navigation.settings.label' | translate\"\n (click)=\"openSettings()\">\n <mat-icon>{{ icons.actionSettings }}</mat-icon>\n </button>\n </div>\n</ng-template>\n\n<main class=\"usrmgmt-main__content\" [attr.aria-label]=\"'yuv.app.user-management.content.aria.label' | translate\">\n <router-outlet></router-outlet>\n</main>\n\n<router-outlet name=\"modal\"></router-outlet>\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { LocalizationService } from '@yuuvis/client-core';\n\nconst ROLE_KEY_PREFIX = 'role:';\n\n/** Localized role name, falling back to the technical name when no `_label` entry exists. */\nexport function resolveRoleLabel(localization: LocalizationService, role: string): string {\n return localization.getLocalizedLabel(ROLE_KEY_PREFIX + role) ?? role;\n}\n\n/**\n * Tooltip text for a role chip:\n * - Localized label present → show technical name + description (if any): \"ROLE_NAME – Description\"\n * - No localized label → technical name already visible as chip text; show description only (if any)\n */\nexport function resolveRoleTooltip(localization: LocalizationService, role: string): string {\n const label = localization.getLocalizedLabel(ROLE_KEY_PREFIX + role);\n const description = localization.getLocalizedDescription(ROLE_KEY_PREFIX + role);\n if (!label) {\n return description ?? '';\n }\n return description ? `${role} – ${description}` : role;\n}\n\n@Pipe({ name: 'roleLabel', standalone: true })\nexport class RoleLabelPipe implements PipeTransform {\n readonly #localization = inject(LocalizationService);\n\n transform(role: string): string {\n return resolveRoleLabel(this.#localization, role);\n }\n}\n\n@Pipe({ name: 'roleTooltip', standalone: true })\nexport class RoleTooltipPipe implements PipeTransform {\n readonly #localization = inject(LocalizationService);\n\n transform(role: string): string {\n return resolveRoleTooltip(this.#localization, role);\n }\n}\n\n@Pipe({ name: 'sortRolesByLabel', standalone: true })\nexport class SortRolesByLabelPipe implements PipeTransform {\n readonly #localization = inject(LocalizationService);\n\n transform(roles: readonly string[] | null | undefined): string[] {\n if (!roles) return [];\n return [...roles].sort((a, b) =>\n resolveRoleLabel(this.#localization, a).localeCompare(resolveRoleLabel(this.#localization, b))\n );\n }\n}\n","import { Component, Input, signal } from '@angular/core';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslatePipe } from '@yuuvis/client-core';\nimport { UserDetailsObject } from '../../user-management.schema';\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { RoleLabelPipe, RoleTooltipPipe, SortRolesByLabelPipe } from '../../pipes/role-localization.pipes';\n\n\n@Component({\n selector: 'ymusrmgmt-user-details',\n imports: [\n MatChipsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatCheckboxModule,\n MatSlideToggleModule,\n MatTooltipModule,\n ReactiveFormsModule,\n TranslatePipe,\n RoleLabelPipe,\n RoleTooltipPipe,\n SortRolesByLabelPipe\n ],\n templateUrl: './user-details.component.html',\n styleUrl: './user-details.component.scss'\n})\nexport class UserDetailsComponent {\n\n userDetails = signal<UserDetailsObject | undefined>(undefined);\n userDetailsForm: FormGroup;\n\n private currentUserId: string | undefined;\n\n @Input() set userId(value: string | undefined) {\n this.currentUserId = value;\n this.loadUserDetails();\n }\n\n private loadUserDetails() {\n if (this.currentUserId) {\n this.userService.getUserDetails(this.currentUserId).subscribe(user => {\n this.userDetails.set(user);\n this.userDetailsForm.patchValue({\n id: user.id,\n username: user.username,\n firstName: user.firstName,\n lastName: user.lastName,\n email: user.email,\n enabled: user.enabled\n });\n });\n } else {\n this.userDetails.set(undefined);\n }\n }\n\n /**\n * Refresh the user details by reloading the data from the server\n */\n refresh(): void {\n this.loadUserDetails();\n }\n\n constructor(private userService: YuvUserManagementService, private formBuilder: FormBuilder) {\n this.userDetailsForm = this.formBuilder.group({\n id: [{ value: '' }],\n username: [{ value: '' }],\n firstName: [{ value: '' }],\n lastName: [{ value: '' }],\n email: [{ value: '' }],\n enabled: [{ value: false, disabled: true }]\n });\n }\n}\n","@let currentUserDetails = userDetails();\n@if (currentUserDetails) {\n <form [formGroup]=\"userDetailsForm\" class=\"user-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.users.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.username' | translate)}}</mat-label>\n <input matInput formControlName=\"username\" readonly>\n <mat-icon matPrefix>account_box</mat-icon>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.email' | translate)}}</mat-label>\n <input matInput formControlName=\"email\" readonly>\n <mat-icon matPrefix>email</mat-icon>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.firstname' | translate)}}</mat-label>\n <input matInput formControlName=\"firstName\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.lastname' | translate)}}</mat-label>\n <input matInput formControlName=\"lastName\" readonly>\n </mat-form-field>\n <mat-form-field class=\"groups-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.groups' | translate)}}</mat-label>\n <mat-chip-grid #groupChipGrid>\n @if (currentUserDetails.groups) {\n @for (group of currentUserDetails.groups.sort(); track group) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{group}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"groupChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-form-field class=\"roles-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentUserDetails.effectiveRoles) {\n @for (role of currentUserDetails.effectiveRoles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentUserDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-slide-toggle formControlName=\"enabled\">\n {{ userDetailsForm.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) :\n ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle> \n </form>\n}","import { CommonModule } from '@angular/common';\nimport { Component, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { UserObject } from '../../user-management.schema';\nimport { UserRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatSlideToggleModule,\n MatInputModule\n];\n\n@Component({\n selector: 'ymusrmgmt-create-user',\n templateUrl: './create-user.component.html',\n styleUrl: './create-user.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n host: {\n '[class.busy]': '!busy()',\n },\n})\nexport class CreateUserComponent {\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<CreateUserComponent, UserObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n username = new FormControl('', [Validators.required, Validators.minLength(3), Validators.maxLength(255), Validators.pattern('^[a-zA-Z0-9._-]*$')]);\n email = new FormControl('', [Validators.required, Validators.email]);\n firstname = new FormControl('', [Validators.minLength(1), Validators.maxLength(255), Validators.pattern(\"^[^#!<>&/%=;*§$()[\\\\]{}]*$\")]);\n lastname = new FormControl('', [Validators.minLength(1), Validators.maxLength(255), Validators.pattern(\"^[^#!<>&/%=;*§$()[\\\\]{}]*$\")]);\n enabled = new FormControl(true, []);\n\n form: FormGroup = this.#fb.group({\n username: this.username,\n email: this.email,\n firstname: this.firstname,\n lastname: this.lastname,\n enabled: this.enabled\n });\n\n changedInput = signal<any | undefined>(undefined);\n \n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid;\n }\n });\n\n createUser() {\n let createdUserId: string;\n const createParams = this.form.value;\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const createUserRequest: UserRequest = {\n username: createParams.username,\n email: createParams.email,\n firstName: createParams.firstname ? createParams.firstname : null,\n lastName: createParams.lastname ? createParams.lastname : null,\n enabled: createParams.enabled,\n roles: []\n };\n\n this.#userManagementService\n .createUser(createUserRequest, true)\n .subscribe({\n error: (e: any) => {\n switch (e.status) {\n case 409: { \n const errorMsg = JSON.parse(e.error).message;\n if (errorMsg === \"User exists with same username\") {\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.users.action.create.error.usernameExists\"));\n } else if (errorMsg === \"User exists with same email\") {\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.users.action.create.error.emailExists\"));\n } else {\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.users.action.create.error.unknown\"));\n }\n break;\n }\n default:\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.users.action.create.error.unknown\"));\n }\n this.#logger.error(`Failed to create user with username ${createUserRequest.username}`, e);\n this.busy.set(false);\n },\n next: (userId : string) => {\n createdUserId = userId;\n },\n complete: () => {\n this.busy.set(false);\n this.#dialogRef.close(createdUserId);\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n}\n","<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstname\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastname\" type=\"text\"/>\n </mat-form-field>\n <div class=\"yuv-form-field\" id=\"enabledPropDiv\">\n <mat-slide-toggle formControlName=\"enabled\">\n {{ form.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) : ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle>\n </div>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createUser()\">\n {{ 'yuv.app.user-management.users.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { Component, input, output, signal, computed, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatListModule } from '@angular/material/list';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslatePipe, LocalizationService } from '@yuuvis/client-core';\nimport { RoleLabelPipe, RoleTooltipPipe, resolveRoleLabel } from '../../pipes/role-localization.pipes';\n\n@Component({\n selector: 'ymusrmgmt-role-selection',\n imports: [\n CommonModule,\n MatIconModule,\n MatButtonModule,\n MatListModule,\n MatTooltipModule,\n TranslatePipe,\n RoleLabelPipe,\n RoleTooltipPipe,\n ],\n standalone: true,\n templateUrl: './roles-selection.component.html',\n styleUrl: './roles-selection.component.css',\n})\nexport class RolesSelectionComponent {\n readonly #localization = inject(LocalizationService);\n\n /** Orders roles by their localized label so the lists read naturally in the active language. */\n readonly #compareByLabel = (a: string, b: string) =>\n resolveRoleLabel(this.#localization, a).localeCompare(resolveRoleLabel(this.#localization, b));\n\n allRoles = input.required<string[]>();\n initialRoles = input.required<string[]>();\n rolesChange = output<string[]>();\n availableRoles = signal<string[]>([]);\n assignedRoles = signal<string[]>([]);\n selectedAvailable = signal<string[]>([]);\n selectedAssigned = signal<string[]>([]);\n canAssign = computed(() => this.selectedAvailable().length > 0);\n canRemove = computed(() => this.selectedAssigned().length > 0);\n\n constructor() {\n effect(() => {\n const all = this.allRoles();\n const initial = this.initialRoles();\n\n this.assignedRoles.set([...initial].sort(this.#compareByLabel));\n this.availableRoles.set(all.filter((role) => !initial.includes(role)).sort(this.#compareByLabel));\n this.selectedAvailable.set([]);\n this.selectedAssigned.set([]);\n });\n }\n\n /** Bound to `mat-list-option`'s `(selectedChange)`, which fires uniformly for mouse and keyboard interaction — unlike `(click)`, which Material's keyboard handling never dispatches. */\n onAvailableSelectedChange(role: string, selected: boolean) {\n this.selectedAvailable.update((current) =>\n selected ? [...current, role] : current.filter((r) => r !== role)\n );\n }\n\n onAssignedSelectedChange(role: string, selected: boolean) {\n this.selectedAssigned.update((current) =>\n selected ? [...current, role] : current.filter((r) => r !== role)\n );\n }\n\n assignRoles() {\n const toAssign = this.selectedAvailable();\n if (toAssign.length === 0) return;\n\n this.availableRoles.update((roles) =>\n roles.filter((r) => !toAssign.includes(r))\n );\n this.assignedRoles.update((roles) => [...roles, ...toAssign].sort(this.#compareByLabel));\n this.selectedAvailable.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n removeRoles() {\n const toRemove = this.selectedAssigned();\n if (toRemove.length === 0) return;\n\n this.assignedRoles.update((roles) =>\n roles.filter((r) => !toRemove.includes(r))\n );\n this.availableRoles.update((roles) => [...roles, ...toRemove].sort(this.#compareByLabel));\n this.selectedAssigned.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n assignAllRoles() {\n const allAvailable = this.availableRoles();\n if (allAvailable.length === 0) return;\n\n this.assignedRoles.update((roles) => [...roles, ...allAvailable].sort(this.#compareByLabel));\n this.availableRoles.set([]);\n this.selectedAvailable.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n removeAllRoles() {\n const allAssigned = this.assignedRoles();\n if (allAssigned.length === 0) return;\n\n this.availableRoles.update((roles) => [...roles, ...allAssigned].sort(this.#compareByLabel));\n this.assignedRoles.set([]);\n this.selectedAssigned.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n isAvailableSelected(role: string): boolean {\n return this.selectedAvailable().includes(role);\n }\n\n isAssignedSelected(role: string): boolean {\n return this.selectedAssigned().includes(role);\n }\n}","<div class=\"role-selector\">\n <!-- Available Roles (Left) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.available' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #availableList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.available' | translate\">\n @for (role of availableRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAvailableSelected(role)\"\n (selectedChange)=\"onAvailableSelectedChange(role, $event)\">\n {{ role | roleLabel }}\n </mat-list-option>\n }\n @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.users.roles.noAvailable' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n\n <!-- Control Buttons (Center) -->\n <div class=\"control-buttons\">\n <button\n mat-icon-button\n [disabled]=\"availableRoles().length === 0\"\n (click)=\"assignAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.assignAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assignAll' | translate\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canAssign()\"\n (click)=\"assignRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.assign' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assign' | translate\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canRemove()\"\n (click)=\"removeRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.remove' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.remove' | translate\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"assignedRoles().length === 0\"\n (click)=\"removeAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.removeAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.removeAll' | translate\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n </div>\n\n <!-- Assigned Roles (Right) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.assigned' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #assignedList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assigned' | translate\">\n @for (role of assignedRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAssignedSelected(role)\"\n (selectedChange)=\"onAssignedSelectedChange(role, $event)\">\n {{ role | roleLabel }}\n </mat-list-option>\n }\n @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.users.roles.noAssigned' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, Inject, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { UserObject } from '../../user-management.schema';\nimport { UserRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { RolesSelectionComponent } from '../../components/roles-selection/roles-selection.component';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent, RolesSelectionComponent];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatInputModule,\n];\n\n@Component({\n selector: 'ymusrmgmt-edit-user',\n templateUrl: './edit-user.component.html',\n styleUrl: './edit-user.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n host: {\n '[class.busy]': '!busy()',\n },\n})\nexport class EditUserComponent implements AfterViewInit {\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<EditUserComponent, UserObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n allAvailableRoles = signal<string[]>([]);\n\n userRoles = signal<string[]>([]);\n\n /** Externally managed users (e.g. provisioned via SCIM) may only have roles assigned; their personal data is owned by the external IdP. */\n externallyManaged = signal<boolean>(false);\n\n username = new FormControl('');\n email = new FormControl('', [Validators.required, Validators.email]);\n firstName = new FormControl('', [Validators.minLength(1), Validators.maxLength(255), Validators.pattern(\"^[^#!<>&/%=;*§$()[\\\\]{}]*$\")]);\n lastName = new FormControl('', [Validators.minLength(1), Validators.maxLength(255), Validators.pattern(\"^[^#!<>&/%=;*§$()[\\\\]{}]*$\")]);\n roles = new FormControl<string[]>([]);\n\n form: FormGroup = this.#fb.group({\n username: this.username,\n email: this.email,\n firstName: this.firstName,\n lastName: this.lastName,\n roles: this.roles\n });\n\n changedInput = signal<any | undefined>(undefined);\n\n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid || !this.isDataChanged();\n }\n });\n\n constructor(@Inject(MAT_DIALOG_DATA) public data: any) {\n this.form.patchValue({\n username: this.data.user.username,\n firstName: this.data.user.firstName,\n lastName: this.data.user.lastName,\n email: this.data.user.email,\n roles: this.data.user.roles\n });\n\n // Initialize userRoles from the data\n this.userRoles.set(this.data.user.roles || []);\n\n // Externally managed users may only have roles assigned: their personal data fields are rendered\n // read-only in the template (same mechanism as the username field) so they keep the identical look.\n if (this.data.user.externallyManaged) {\n this.externallyManaged.set(true);\n }\n\n // Fetch all available roles\n this.#userManagementService.fetchAllRoles().subscribe({\n next: (roles) => {\n this.allAvailableRoles.set(roles);\n },\n error: (e) => {\n this.#logger.error('Failed to fetch roles', e);\n }\n });\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n\n isDataChanged(): boolean {\n const isDataUnchanged = Object.keys(this.form.value).every((key) => this.isEquals(key));\n return !isDataUnchanged;\n }\n\n isEquals(key: string) {\n const oldVal = this.data.user?.[key];\n const newVal = this.form.get(key)?.value;\n return oldVal === newVal;\n }\n\n onRolesChange(roles: string[]) {\n this.userRoles.set(roles);\n this.form.patchValue({ roles: roles });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n\n updateUser() {\n // For externally managed users the personal data fields are read-only, so their original values\n // are preserved here (the backend replaces the representation from the request, so omitting them\n // would wipe them).\n const editParams = this.form.getRawValue();\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const updateUserRequest: UserRequest = {\n email: editParams.email,\n firstName: editParams.firstName ? editParams.firstName : \"\",\n lastName: editParams.lastName ? editParams.lastName : \"\",\n roles: editParams.roles\n };\n\n this.#userManagementService\n .updateUser(this.data.user.id, updateUserRequest)\n .subscribe({\n error: (e: any) => {\n switch (e.status) {\n case 409: {\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.users.action.create.error.emailExists\"));\n break;\n }\n default:\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.users.action.edit.error.unknown\"));\n }\n this.#logger.error(`Failed to update user with id ${this.data.user.id}`, e);\n this.busy.set(false);\n },\n complete: () => {\n this.busy.set(false);\n this.#dialogRef.close(this.data.user.id);\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n @if (externallyManaged()) {\n <p class=\"externally-managed-hint\">{{ \"yuv.app.user-management.users.action.edit.identitySource.external.hint\" | translate }}</p>\n }\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\" #emailField [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n \n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"userRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n \n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateUser()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, HostBinding, inject, OnInit, signal, ViewChild } from '@angular/core';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { RouterModule } from '@angular/router';\nimport { SelectionModel } from '@angular/cdk/collections'\n\nimport { Logger, NotificationService, SearchQuery, TranslatePipe, TranslateService, UserService } from '@yuuvis/client-core';\nimport { BusyOverlayDirective, ClickDoubleDirective, ConfirmService } from '@yuuvis/client-components/common';\nimport { SimpleSearchComponent } from '@yuuvis/client-framework/simple-search';\nimport { OverflowMenuItem, YuvOverflowMenuModule } from '@yuuvis/client-components/overflow-menu';\nimport { Pagination } from '@yuuvis/client-framework/pagination';\n\nimport { YuvClientShellModule } from '@yuuvis/client-shell';\n\nimport { YmtButtonDirective, YmtIconButtonDirective } from '@yuuvis/material';\nimport { YmtBadge } from '@yuuvis/material/badge';\nimport { MasterDetailsPaneLayoutOptions, YmtLayoutModule } from '@yuuvis/material/layout';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\n\nimport { APP_ICONS, APP_ID, UserObject, UsersSearchResponse } from '../../user-management.schema';\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { UserDetailsComponent } from '../../components/user-details/user-details.component';\nimport { CreateUserComponent } from '../../overlays/create-user/create-user.component';\nimport { EditUserComponent } from '../../overlays/edit-user/edit-user.component';\n\nimport { UserRequest } from '../../user-request';\n\n@Component({\n selector: 'ymusrmgmt-users',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatPaginatorModule,\n MatSortModule,\n MatTableModule,\n MatTabsModule,\n MatTooltipModule,\n RouterModule,\n TranslatePipe,\n SimpleSearchComponent,\n BusyOverlayDirective,\n ClickDoubleDirective,\n UserDetailsComponent,\n YmtBadge,\n YmtButtonDirective,\n YmtIconButtonDirective,\n YmtLayoutModule,\n YmtPanesModule,\n YuvClientShellModule,\n YuvOverflowMenuModule,\n],\n templateUrl: './users.component.html',\n styleUrl: './users.component.scss',\n host: {\n '[class.busy]': '!busy()',\n },\n})\nexport class YuvUsersPageComponent implements OnInit {\n\n readonly layoutSettingsID = APP_ID + '#root.layout.settings';\n\n readonly #logger = inject(Logger);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #translateService = inject(TranslateService);\n readonly #dialog = inject(MatDialog);\n readonly #notificationService = inject(NotificationService);\n readonly #userService = inject(UserService)\n readonly #confirmService = inject(ConfirmService);\n\n @ViewChild(UserDetailsComponent) userDetailsComponent!: UserDetailsComponent;\n\n @HostBinding('class.pagination') pagination: Pagination = { total: 0, pages: 0, page: 0 };\n\n busy = signal<boolean>(false);\n\n actions: OverflowMenuItem[] = [];\n\n displayedColumns: string[] = ['state', 'name', 'firstName', 'lastName', 'email', 'id'];\n\n icons = {\n ...APP_ICONS,\n };\n\n dataSource = signal<UserObject[]>([]);\n\n selection = signal(new SelectionModel<UserObject>(false, undefined));\n\n detailsActive = true;\n\n layoutOptions: MasterDetailsPaneLayoutOptions = {\n resizable: true,\n detailsSize: 25,\n detailsMinSize: 25,\n detailsMaxSize: 75\n };\n\n #query: SearchQuery = { term: '' }\n\n #updateActions(selectedUser: UserObject | undefined) {\n if (!selectedUser) {\n this.actions = [];\n this.detailsActive = false;\n return;\n }\n\n const currentUser = this.#userService.getCurrentUser();\n\n const editAction = {\n id: 'yuv.app.users.action.edit',\n icon: APP_ICONS.actionEditUser,\n label: this.#translateService.instant(\n 'yuv.app.user-management.users.action.edit.label'\n ),\n callback: () => this.editSelectedUser(),\n };\n const activateAction = {\n id: 'yuv.app.users.action.activate',\n icon: APP_ICONS.actionActivateUser,\n label: this.#translateService.instant(\n 'yuv.app.user-management.users.action.activate.label'\n ),\n disabled: selectedUser.id === currentUser.id || selectedUser.enabled,\n callback: () => this.activateSelectedUser(),\n };\n const deactivateAction = {\n id: 'yuv.app.users.action.deactivate',\n icon: APP_ICONS.actionDeactivateUser,\n label: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.label'\n ),\n disabled: selectedUser.id === currentUser.id || !selectedUser.enabled,\n callback: () => this.deactivateSelectedUser(),\n };\n const deleteAction = {\n id: 'yuv.app.users.action.delete',\n icon: APP_ICONS.actionDeleteUser,\n label: this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.label'\n ),\n disabled: selectedUser.id === currentUser.id,\n callback: () => this.deleteSelectedUser(),\n };\n\n this.actions = [editAction, activateAction, deactivateAction, deleteAction];\n this.detailsActive = true;\n }\n\n createNewUser() {\n this.#logger.debug('Create new user ...');\n\n this.#dialog.open(CreateUserComponent, {\n width: '400px',\n maxWidth: '90vw',\n }).afterClosed().subscribe((createdUserId: string | undefined) => {\n if (createdUserId) {\n this.#logger.debug(\"New user created with ID: \" + createdUserId);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.users.action.create.success'\n )\n );\n\n this.refresh();\n }\n });\n }\n\n editSelectedUser() {\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (selected) {\n this.#logger.debug(`Edit selected user with id '${selected.id}'...`);\n\n this.#dialog.open(EditUserComponent, {\n width: '800px',\n maxWidth: '90vw',\n data: {\n user: this.userDetailsComponent.userDetails()\n },\n }).afterClosed().subscribe((editedUserId: string | undefined) => {\n if (editedUserId) {\n this.#logger.debug(\"User edited with ID: \" + editedUserId);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.users.action.edit.success',\n { username: selected.username }\n )\n );\n\n this.refresh(true);\n }\n });\n }\n }\n\n activateSelectedUser() {\n this.updateUserEnabledState(true);\n }\n\n deactivateSelectedUser() {\n this.updateUserEnabledState(false);\n }\n\n updateUserEnabledState(enabled: boolean) {\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (!selected) return;\n\n const action = enabled ? 'activate' : 'deactivate';\n const updateUserRequest: UserRequest = { enabled };\n\n const performUpdate = () => {\n this.busy.set(true);\n this.#userManagementService.updateUser(selected.id, updateUserRequest).subscribe({\n error: (e: unknown) => {\n this.#notificationService.error(\n this.#translateService.instant(\n `yuv.app.user-management.users.action.${action}.error`,\n { username: selected.username }\n )\n );\n this.#logger.error(`Failed to ${action} user with id ${selected.id}`, e);\n this.busy.set(false);\n },\n complete: () => {\n this.#notificationService.success(\n this.#translateService.instant(\n `yuv.app.user-management.users.action.${action}.success`,\n { username: selected.username }\n )\n );\n this.busy.set(false);\n this.refresh(true);\n },\n });\n };\n\n if (!enabled) {\n this.#confirmService\n .confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.confirm.message',\n { username: selected.username }\n ),\n confirmLabel: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.confirm.label'\n ),\n })\n .subscribe({\n next: (confirmed: boolean) => {\n if (confirmed) {\n performUpdate();\n }\n }\n });\n } else {\n performUpdate();\n }\n }\n\n deleteSelectedUser() {\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (selected) {\n this.#logger.debug(`Delete selected user with id '${selected.id}'...`);\n\n this.#userManagementService.deleteUser(selected).subscribe({\n next: (result: boolean) => {\n if (result) {\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.success',\n { username: selected.username }\n )\n );\n this.deselect();\n this.#loadUserList(this.pagination?.page || 0);\n }\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to delete user with id '${selected.id}'`, e);\n this.#notificationService.error(\n this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.error',\n { username: selected.username }\n )\n );\n }\n });\n }\n }\n\n select(row) {\n if (this.selection().isSelected(row)) {\n this.deselect();\n } else {\n this.selection().select(row);\n this.#updateActions(row);\n }\n }\n\n deselect() {\n this.selection().clear();\n this.#updateActions(undefined);\n }\n\n isSelected(row: UserObject): boolean {\n return this.selection().selected?.some(item => item.id === row.id);\n }\n\n refresh(refreshDetails = false) {\n this.#loadUserList(this.pagination?.page || 0);\n\n if (refreshDetails) {\n this.refreshUserDetails();\n }\n }\n\n refreshUserDetails() {\n if (this.userDetailsComponent) {\n this.userDetailsComponent.refresh();\n }\n }\n\n getPageSize(): number {\n return YuvUserManagementService.DEFAULT_PAGE_SIZE;\n }\n\n onChangePage($event: PageEvent) {\n const { pageIndex } = $event;\n this.#loadUserList(pageIndex);\n }\n\n onQueryChange(q: SearchQuery) {\n this.#query.term = q.term || '';\n this.#loadUserList(0);\n }\n\n ngOnInit() {\n this.#loadUserList(0);\n }\n\n #loadUserList(page: number) {\n this.busy.set(true);\n\n this.#userManagementService.fetchUsers(page, this.#query.term).subscribe(\n {\n next: (response: UsersSearchResponse) => {\n console.log(`fetched users: ${response}`);\n\n this.dataSource.set(response.objects);\n\n this.pagination = {\n total: response.totalNumItems,\n pages: Math.ceil(response.totalNumItems / YuvUserManagementService.DEFAULT_PAGE_SIZE),\n page: page\n };\n },\n error: (e: unknown) => {\n this.#logger.error('Failed to fetch users', e);\n this.busy.set(false);\n },\n complete: () => {\n if (this.dataSource().length === 0 && page > 0) {\n this.#loadUserList(page - 1);\n return;\n }\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (selected && this.dataSource().some(u => u.id === selected.id)) {\n const updatedSelected = this.dataSource().find(u => u.id === selected.id);\n this.select(updatedSelected);\n } else {\n this.select(this.dataSource()[0])\n }\n this.busy.set(false);\n },\n });\n }\n}","<ng-template yuvAppHeaderSlot=\"search\">\n <yuv-simple-search (queryChange)=\"onQueryChange($event)\"></yuv-simple-search>\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\" [(detailsActive)]=\"detailsActive\" [options]=\"layoutOptions\" [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\" title=\"sss\">\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"user-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef [attr.aria-label]=\"'yuv.app.user-management.users.object.property.state' | translate\" />\n <mat-cell *matCellDef=\"let element\">\n <mat-icon\n aria-hidden=\"false\"\n [attr.aria-label]=\"(element.enabled ? 'yuv.app.user-management.users.object.property.enabled' : 'yuv.app.user-management.users.object.property.disabled') | translate\">{{\n element.enabled ? icons.stateActive : icons.stateInactive }}</mat-icon>\n @if (element.externallyManaged) {\n <mat-icon class=\"external-source\"\n aria-hidden=\"false\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">{{\n icons.sourceExternal }}</mat-icon>\n }\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.username' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.username}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"firstName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.firstname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.firstName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"lastName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.lastname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.lastName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"email\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.email' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.email}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n *matRowDef=\"let row; columns: displayedColumns;\"\n (click.single)=\"select(row)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"this.isSelected(row)\" class=\"user-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n @let selectedUser = selection().selected.at(0);\n <ymt-pane-header [icon]=\"'person'\" [title]=\"'yuv.app.user-management.users.details.title' | translate\" [subtitle]=\"selectedUser?.id || ('yuv.app.user-management.users.details.empty' | translate)\" [actions]=\"listActions\" [badges]=\"selectedUser?.externallyManaged ? sourceBadge : undefined\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-user-details [userId]=\"selectedUser?.id\" />\n </ymt-pane-body>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.users.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" [attr.aria-label]=\"'yuv.app.user-management.users.navigation.pagination.aria' | translate\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh(true)\" [matTooltip]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\" [attr.aria-label]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n <button ymtButton=\"primary\" (click)=\"createNewUser()\" [matTooltip]=\"'yuv.app.user-management.users.action.create.description' | translate\">\n <mat-icon>person_add</mat-icon>{{'yuv.app.user-management.users.action.create.label' | translate }}\n </button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #sourceBadge>\n <ymt-badge severity=\"primary\" [aura]=\"true\" class=\"source-badge\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">\n <mat-icon>{{ icons.sourceExternal }}</mat-icon>\n <span>{{ 'yuv.app.user-management.users.object.property.identitySource.external' | translate }}</span>\n </ymt-badge>\n</ng-template>","import { CommonModule } from '@angular/common';\nimport { Component, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { GroupObject } from '../../user-management.schema';\nimport { GroupRequest, UserRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\nimport { RolesSelectionComponent } from '../../components/roles-selection/roles-selection.component';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent, RolesSelectionComponent];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatSlideToggleModule,\n MatInputModule\n];\n\n@Component({\n selector: 'ymusrmgmt-create-group',\n templateUrl: './create-group.component.html',\n styleUrl: './create-group.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n host: {\n '[class.busy]': '!busy()',\n },\n})\nexport class CreateGroupComponent {\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<CreateGroupComponent, GroupObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n allAvailableRoles = signal<string[]>([]);\n allUsers = signal<string[]>([]);\n\n groupRoles = signal<string[]>([]);\n groupMembers = signal<string[]>([]);\n \n name = new FormControl('', [Validators.required, Validators.minLength(3), Validators.maxLength(255), Validators.pattern('^[a-zA-Z0-9._-]*$')]);\n roles = new FormControl<string[]>([]);\n\n form: FormGroup = this.#fb.group({\n name: this.name,\n roles: this.roles,\n });\n\n changedInput = signal<any | undefined>(undefined);\n \n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid;\n }\n });\n\n constructor(){\n this.#userManagementService.fetchAllRoles().subscribe({\n next: (roles) => {\n this.allAvailableRoles.set(roles);\n },\n error: (e) => {\n this.#logger.error('Failed to fetch roles', e);\n }\n });\n }\n\n createGroup() {\n let createdGroupId: string;\n const createParams = this.form.value;\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const createGroupRequest: GroupRequest = {\n name: createParams.name,\n roles: createParams.roles,\n members: []\n };\n\n this.#userManagementService\n .createGroup(createGroupRequest)\n .subscribe({\n error: (e: any) => {\n switch (e.status) {\n case 409: { \n const errorMsg = JSON.parse(e.error).message;\n if (errorMsg === \"Group exists with same username\") {\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.groups.action.create.error.groupExists\"));\n }\n else {\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.groups.action.create.error.unknown\"));\n }\n break;\n }\n default:\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.groups.action.create.error.unknown\"));\n }\n this.#logger.error(`Failed to create user with username ${createGroupRequest.name}`, e);\n this.busy.set(false);\n },\n next: (userId : string) => {\n createdGroupId = userId;\n },\n complete: () => {\n this.busy.set(false);\n this.#dialogRef.close(createdGroupId);\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n\n onRolesChange(roles: string[]) {\n this.groupRoles.set(roles);\n this.form.patchValue({ roles: roles });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n}\n","<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\"/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.groups.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createGroup()\">\n {{ 'yuv.app.user-management.groups.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { Component, Input, signal } from '@angular/core';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslatePipe } from '@yuuvis/client-core';\nimport { GroupDetailsObject } from '../../user-management.schema';\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { RoleLabelPipe, RoleTooltipPipe, SortRolesByLabelPipe } from '../../pipes/role-localization.pipes';\n\n\n@Component({\n selector: 'ymusrmgmt-group-details',\n imports: [\n MatCardModule,\n MatChipsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatCheckboxModule,\n MatSlideToggleModule,\n MatTabsModule,\n MatTooltipModule,\n ReactiveFormsModule,\n TranslatePipe,\n RoleLabelPipe,\n RoleTooltipPipe,\n SortRolesByLabelPipe\n ],\n templateUrl: './group-details.component.html',\n styleUrl: './group-details.component.scss'\n})\nexport class GroupDetailsComponent {\n\n groupDetails = signal<GroupDetailsObject | undefined>(undefined);\n groupDetailsForm: FormGroup;\n\n private currentGroupId: string | undefined;\n\n @Input() set groupId(value: string | undefined) {\n this.currentGroupId = value;\n this.loadGroupDetails();\n }\n\n private loadGroupDetails() {\n if (this.currentGroupId) {\n this.userService.getGroupDetails(this.currentGroupId).subscribe(group => {\n this.groupDetails.set(group);\n this.groupDetailsForm.patchValue({\n id: group.id,\n name: group.name\n });\n });\n } else {\n this.groupDetails.set(undefined);\n }\n }\n\n /**\n * Refresh the user details by reloading the data from the server\n */\n refresh(): void {\n this.loadGroupDetails();\n }\n\n constructor(private userService: YuvUserManagementService, private formBuilder: FormBuilder) {\n this.groupDetailsForm = this.formBuilder.group({\n id: [{ value: '' }],\n name: [{ value: '' }]\n });\n }\n}\n"," \n@let currentGroupDetails = groupDetails();\n@if (currentGroupDetails) {\n <form [formGroup]=\"groupDetailsForm\" class=\"group-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.groups.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.name' | translate)}}</mat-label>\n <input matInput formControlName=\"name\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentGroupDetails.roles) {\n @for (role of currentGroupDetails.roles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentGroupDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.members' | translate)}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @if (currentGroupDetails.members) {\n @for (member of currentGroupDetails.members.sort(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n </form>\n} @else {\n <p>{{('yuv.app.user-management.groups.details.empty' | translate)}}</p>\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, Inject, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { UserObject } from '../../user-management.schema';\nimport { GroupRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { RolesSelectionComponent } from '../../components/roles-selection/roles-selection.component';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent, RolesSelectionComponent];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatInputModule,\n MatChipsModule,\n];\n\n@Component({\n selector: 'ymusrmgmt-edit-group',\n templateUrl: './edit-group.component.html',\n styleUrl: './edit-group.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n host: {\n '[class.busy]': '!busy()',\n },\n})\nexport class EditGroupComponent implements AfterViewInit {\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<EditGroupComponent, UserObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n allAvailableRoles = signal<string[]>([]);\n allUsers = signal<string[]>([]);\n\n groupRoles = signal<string[]>([]);\n groupMembers = signal<string[]>([]);\n\n name = new FormControl('');\n roles = new FormControl<string[]>([]);\n members = new FormControl<string[]>([]);\n\n userControl = new FormControl('');\n\n form: FormGroup = this.#fb.group({\n name: this.name,\n roles: this.roles,\n members: this.members\n });\n\n changedInput = signal<any | undefined>(undefined);\n\n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid || !this.isDataChanged();\n }\n });\n\n constructor(@Inject(MAT_DIALOG_DATA) public data: any) {\n this.form.patchValue({\n name: this.data.group.name,\n roles: this.data.group.roles,\n members: this.data.group.members\n });\n\n this.members.valueChanges.subscribe((v) => {this.#logger.info(\"members changed: \" + v)});\n this.groupRoles.set(this.data.group.roles || []);\n\n this.groupMembers.set(this.data.group.members || []);\n this.members.disable();\n\n // Fetch all available roles\n this.#userManagementService.fetchAllRoles().subscribe({\n next: (roles) => {\n this.allAvailableRoles.set(roles.sort());\n },\n error: (e) => {\n this.#logger.error('Failed to fetch roles', e);\n }\n });\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n\n isDataChanged(): boolean {\n const isDataUnchanged = Object.keys(this.form.value).every((key) => this.isEquals(key));\n return !isDataUnchanged;\n }\n\n isEquals(key: string) {\n const oldVal = this.data.group?.[key];\n const newVal = this.form.get(key)?.value;\n return oldVal === newVal;\n }\n\n onRolesChange(roles: string[]) {\n this.groupRoles.set(roles);\n this.form.patchValue({ roles: roles });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n\n onMembersChange(members: string[]) {\n this.groupMembers.set(members);\n this.form.patchValue({ members: members });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n\n updateGroup() {\n const editParams = this.form.getRawValue();\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const updateGroupRequest: GroupRequest = {\n name: editParams.name,\n roles: editParams.roles,\n members: editParams.members\n };\n\n this.#userManagementService\n .updateGroup(this.data.group.id, updateGroupRequest)\n .subscribe({\n error: (e: any) => {\n switch (e.status) {\n default:\n this.error.set(this.#translateService.instant(\"yuv.app.user-management.groups.action.edit.error.unknown\"));\n }\n this.#logger.error(`Failed to update group with id ${this.data.group.id}`, e);\n this.busy.set(false);\n },\n complete: () => {\n this.busy.set(false);\n this.#dialogRef.close(this.data.group.id);\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{'yuv.app.user-management.groups.object.property.members' | translate}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @for (member of groupMembers(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateGroup()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, HostBinding, inject, OnInit, signal, ViewChild } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { RouterModule } from '@angular/router';\nimport { Logger, NotificationService, SearchQuery, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatTableModule } from '@angular/material/table';\n\nimport { Pagination } from '@yuuvis/client-framework/pagination';import { YmtIconButtonDirective } from '@yuuvis/material';\nimport { MasterDetailsPaneLayoutOptions, YmtLayoutModule } from '@yuuvis/material/layout';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\n\nimport { APP_ICONS, APP_ID, GroupObject, GroupsSearchResponse } from '../../user-management.schema';\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { YuvClientShellModule } from '@yuuvis/client-shell';\nimport { CreateGroupComponent } from '../../overlays/create-group/create-group.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { SelectionModel } from '@angular/cdk/collections'\nimport { BusyOverlayDirective, ClickDoubleDirective } from '@yuuvis/client-components/common';\nimport { GroupDetailsComponent } from '../../components/group-details/group-details.component';\nimport { OverflowMenuItem, YuvOverflowMenuModule } from '@yuuvis/client-components/overflow-menu';\nimport { EditGroupComponent } from '../../overlays/edit-group/edit-group.component';\n\n@Component({\n selector: 'ymusrmgmt-groups',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatTableModule,\n MatPaginatorModule,\n MatSortModule,\n RouterModule,\n TranslatePipe,\n BusyOverlayDirective,\n ClickDoubleDirective,\n GroupDetailsComponent,\n YmtIconButtonDirective,\n YmtLayoutModule,\n YmtPanesModule,\n YuvClientShellModule,\n YuvOverflowMenuModule,\n ],\n templateUrl: './groups.component.html',\n styleUrl: './groups.component.scss',\n host: {\n '[class.busy]': '!busy()',\n },\n})\nexport class YuvGroupsPageComponent implements OnInit {\n\n readonly layoutSettingsID = APP_ID + '#root.layout.settings';\n\n readonly #logger = inject(Logger);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #translateService = inject(TranslateService);\n readonly #dialog = inject(MatDialog);\n readonly #notificationService = inject(NotificationService);\n\n @ViewChild(GroupDetailsComponent) groupDetailsComponent!: GroupDetailsComponent;\n\n actions: OverflowMenuItem[] = [];\n\n @HostBinding('class.pagination') pagination: Pagination = { total: 0, pages: 0, page: 0 };\n\n busy = signal<boolean>(false);\n\n displayedColumns: string[] = [ 'name', 'description', 'id'];\n\n icons = {\n ...APP_ICONS,\n };\n\n dataSource = signal<GroupObject[]>([]);\n\n selection = signal(new SelectionModel<GroupObject>(false, undefined));\n\n enableDetails = signal<boolean>(false);\n\n layoutOptions: MasterDetailsPaneLayoutOptions = {\n resizable: true,\n detailsSize: 25,\n detailsMinSize: 25,\n detailsMaxSize: 75\n };\n\n #query: SearchQuery = { term: '' }\n\n #updateActions(selectedGroup: GroupObject | undefined) {\n if (!selectedGroup) {\n this.actions = [];\n return;\n }\n\n const editAction = {\n id: 'yuv.app.groups.action.edit',\n icon: APP_ICONS.actionEditGroup,\n label: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.edit.label'\n ),\n callback: () => this.editSelectedGroup(),\n };\n this.actions = [editAction];\n }\n\n createNewGroup() {\n this.#logger.debug('Create new group ...');\n\n this.#dialog.open(CreateGroupComponent, {\n width: '400px',\n maxWidth: '90vw',\n }).afterClosed().subscribe((createdGroupId: string | undefined) => {\n if (createdGroupId) {\n this.#logger.debug(\"New group created with ID: \" + createdGroupId);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.group.action.create.success'\n )\n );\n\n this.refresh();\n }\n });\n }\n\n editSelectedGroup() {\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (selected) {\n this.#logger.debug(`Edit selected user with id '${selected.id}'...`);\n\n this.#dialog.open(EditGroupComponent, {\n width: '800px',\n maxWidth: '90vw',\n data: {\n group: this.groupDetailsComponent.groupDetails()\n },\n }).afterClosed().subscribe((editedGroupId: string | undefined) => {\n if (editedGroupId) {\n this.#logger.debug(\"Group edited with ID: \" + editedGroupId);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.edit.success',\n { name: selected.name }\n )\n );\n\n this.refresh();\n }\n });\n }\n }\n\n deleteSelectedGroup() {\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (selected) {\n this.#logger.debug(`Delete selected group with id '${selected.id}'...`);\n\n this.#userManagementService.deleteGroup(selected).subscribe({\n next: (result: boolean) => {\n if (result) {\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.delete.success',\n { name: selected.name }\n )\n );\n this.deselect();\n const currentPage = this.pagination?.page || 0;\n const targetPage = (currentPage > 0 && this.dataSource().length === 1) ? currentPage - 1 : currentPage;\n this.#loadGroupList(targetPage);\n }\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to delete group with id '${selected.id}'`, e);\n this.#notificationService.error(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.delete.error',\n { name: selected.name }\n )\n );\n }\n });\n }\n }\n\n select(row) {\n if (this.selection().isSelected(row)) {\n this.deselect();\n } else {\n this.selection().select(row);\n this.#updateActions(row);\n }\n this.enableDetails.set(true);\n }\n\n deselect() {\n this.selection().clear();\n this.#updateActions(undefined);\n }\n\n isSelected(row: GroupObject): boolean {\n return this.selection().selected?.some(item => item.id === row.id);\n }\n\n refresh() {\n this.#loadGroupList(this.pagination?.page || 0);\n }\n\n refreshGroupDetails() {\n if (this.groupDetailsComponent) {\n this.groupDetailsComponent.refresh();\n }\n }\n\n getPageSize(): number {\n return YuvUserManagementService.DEFAULT_PAGE_SIZE;\n }\n\n onChangePage($event: PageEvent) {\n const { pageIndex } = $event;\n this.#loadGroupList(pageIndex);\n }\n\n onQueryChange(q: SearchQuery) {\n this.#query.term = q.term || '';\n this.#loadGroupList(0);\n }\n\n ngOnInit() {\n this.#loadGroupList(0);\n }\n\n #loadGroupList(page: number) {\n this.busy.set(true);\n\n this.#userManagementService.fetchGroups(page, this.#query.term).subscribe(\n {\n next: (response: GroupsSearchResponse) => {\n console.log(`fetched groups: ${response}`);\n\n this.dataSource.set(response.objects);\n\n this.pagination = {\n total: response.totalNumItems,\n pages: Math.ceil(response.totalNumItems / YuvUserManagementService.DEFAULT_PAGE_SIZE),\n page: page\n };\n },\n error: (e: unknown) => {\n this.#logger.error('Failed to fetch groups', e);\n this.busy.set(false);\n },\n complete: () => {\n const selected = this.selection().hasValue() ? this.selection().selected[0] : undefined;\n if (selected && this.dataSource().some(g => g.id === selected.id)) {\n const updatedSelected = this.dataSource().find(g => g.id === selected.id);\n this.select(updatedSelected);\n this.refreshGroupDetails();\n } else {\n this.select(this.dataSource()[0])\n }\n this.busy.set(false);\n },\n });\n }\n}","<ng-template yuvAppHeaderSlot=\"search\">\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\"\n [gutterSize]=\"16\"\n [options]=\"layoutOptions\"\n [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\">\n <ng-container *ngTemplateOutlet=\"masterPaneContent\"></ng-container>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n <ng-container *ngTemplateOutlet=\"detailsPaneContent\"></ng-container>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.groups.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" [attr.aria-label]=\"'yuv.app.user-management.groups.navigation.pagination.aria' | translate\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh()\" [matTooltip]=\"'yuv.app.user-management.groups.navigation.refresh.tooltip' | translate\" [attr.aria-label]=\"'yuv.app.user-management.groups.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #masterPaneContent>\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"group-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell *matCellDef=\"let element\"><mat-icon>{{ element.enabled ? icons.stateActive : icons.stateInactive\n }}</mat-icon></mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.name' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.name}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"description\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.description' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.description}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n *matRowDef=\"let row; columns: displayedColumns;\"\n (click.single)=\"select(row)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"this.isSelected(row)\" class=\"group-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n</ng-template>\n\n<ng-template #detailsPaneContent>\n <ymt-pane-header [icon]=\"'group'\" [title]=\"'yuv.app.user-management.groups.details.title' | translate\" [subtitle]=\"selection().selected.at(0)?.id || ('yuv.app.user-management.groups.details.empty' | translate)\" [actions]=\"listActions\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-group-details #groupDetails [groupId]=\"selection().selected.at(0)?.id\" />\n </ymt-pane-body>\n</ng-template>","import { Route } from '@angular/router';\nimport { YuvUserManagementComponent } from './container/user-management.component';\nimport { YuvUsersPageComponent } from './pages/users/users.component';\nimport { YuvGroupsPageComponent } from './pages/groups/groups.component';\n\nexport const YuvUserManagementRoutes: Route[] = [\n {\n path: '',\n component: YuvUserManagementComponent,\n children: [\n { path: 'users', component: YuvUsersPageComponent },\n { path: 'groups', component: YuvGroupsPageComponent },\n { path: '', redirectTo: 'users', pathMatch: 'full' }\n ]\n }\n];","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["components","modules","i5","i6","i7","i1","i2","i3","i1.YuvUserManagementService","i8","i4"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-user-management-app.mjs","sources":["../../../../../projects/yuuvis/user-management-app/src/lib/user-management.schema.ts","../../../../../projects/yuuvis/user-management-app/src/lib/paged-response.ts","../../../../../projects/yuuvis/user-management-app/src/lib/user-management.service.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/list-field/list-field.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/list-field/list-field.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/pipes/role-localization.pipes.ts","../../../../../projects/yuuvis/user-management-app/src/lib/container/areas/user-details/user-details.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/container/areas/user-details/user-details.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/components/roles-selection/roles-selection.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/roles-selection/roles-selection.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-group/edit-group.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-group/edit-group.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/directives/focusable-row.directive.ts","../../../../../projects/yuuvis/user-management-app/src/lib/container/areas/groups/groups.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/container/areas/groups/groups.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/components/pane-toggle-button/pane-toggle-button.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/pane-toggle-button/pane-toggle-button.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/components/pane-gutter/pane-gutter.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/pane-gutter/pane-gutter.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/avatar.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/user-avatar/user-avatar.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/user-avatar/user-avatar.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/components/global-add-button/global-add-button.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/components/global-add-button/global-add-button.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-user/create-user.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-user/create-user.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-group/create-group.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/create-group/create-group.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/settings/settings.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/settings/settings.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/directives/highlightable-option.directive.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/add-group-members/add-group-members.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/add-group-members/add-group-members.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-user/edit-user.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/overlays/edit-user/edit-user.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/container/user-management.component.ts","../../../../../projects/yuuvis/user-management-app/src/lib/container/user-management.component.html","../../../../../projects/yuuvis/user-management-app/src/lib/lib.routes.ts","../../../../../projects/yuuvis/user-management-app/src/yuuvis-user-management-app.ts"],"sourcesContent":["import { PagedResponse } from './paged-response';\n\nexport const APP_ID = 'io.yuuvis.app.user-management';\n\n/**\n * Role that marks a user as managed by an external identity provider (SCIM). It must never be\n * assignable or removable through this UI. The backend already hides it, but we filter it out\n * defensively in case a future backend change starts returning it from the roles endpoint again.\n */\nexport const SCIM_MANAGED_ROLE = 'scim-managed';\n\nexport interface GroupObject {\n id: string;\n name: string;\n description: string;\n}\n\nexport interface GroupDetailsObject extends GroupObject {\n members: string[];\n roles: string[];\n}\n\nexport interface GroupsSearchResponse extends PagedResponse<GroupObject> {\n numItems: number;\n totalNumItems: number;\n}\n\nexport interface UserObject {\n id: string;\n username: string;\n firstName?: string;\n lastName?: string;\n email: string;\n enabled: boolean;\n /** Read-only flag set by the backend for users provisioned via an external identity provider (e.g. SCIM from Entra ID). */\n externallyManaged?: boolean;\n}\n\nexport interface UserDetailsObject extends UserObject {\n groups: string[];\n roles: string[];\n effectiveRoles: string[];\n}\n\nexport interface UsersSearchResponse extends PagedResponse<UserObject> {\n numItems: number;\n totalNumItems: number;\n}\n\n/**\n * OIDC identity provider configuration of the current tenant (e.g. Microsoft Entra ID) as\n * returned by `/tenant-management/api/admin/identity-provider/oidc`. Sensitive config values\n * (e.g. clientSecret) are removed by the backend before delivery.\n *\n * `redirectUri`/`scimProvisioning` used to live on this type too, but are now deprecated and\n * hidden from this endpoint's published schema in favor of `IdentityProviderSetupInfo`, which\n * exposes them independent of whether a provider is configured at all - use that instead.\n */\nexport interface OIDCProviderConfig {\n /** Display name shown on the login page. */\n displayName?: string;\n /** Provider-specific configuration (clientId, metadataDescriptorUrl, defaultScope, ...). */\n config?: Record<string, string>;\n}\n\n/** SCIM provisioning settings to configure at the external IdP. */\nexport interface ScimProvisioning {\n /** SCIM base URL (tenant URL) of the realm. */\n tenantUrl?: string;\n /** OAuth2 token endpoint used by the external IdP to authenticate SCIM requests. */\n tokenEndpoint?: string;\n /** Client id of the SCIM client. */\n clientId?: string;\n /** Client secret of the SCIM client. */\n clientSecret?: string;\n}\n\n/**\n * Tenant-specific values needed to configure an external identity provider, as returned by\n * `/tenant-management/api/admin/identity-provider/setup-info`. Available independent of whether\n * an OIDC identity provider has already been configured for this tenant, since both values are\n * derived from the tenant alone.\n */\nexport interface IdentityProviderSetupInfo {\n /** Redirect URI to register with the external IdP for OIDC authentication. */\n redirectUri?: string;\n /** Null if the tenant has no SCIM client provisioned. */\n scimProvisioning?: ScimProvisioning;\n}\n\nexport const APP_ICONS = {\n refresh: 'refresh',\n stateActive: 'account_circle',\n stateInactive: 'block',\n sourceExternal: 'cloud',\n actionCreateNewUser: 'person',\n actionCreateNewGroup: 'group',\n actionEditUser: 'person_edit',\n actionActivateUser: 'person_check',\n actionDeactivateUser: 'person_off',\n actionDeleteUser: 'delete',\n actionEditGroup: 'edit',\n actionDeleteGroup: 'delete',\n actionRemoveGroupMember: 'group_remove',\n actionAddGroupMembers: 'group_add',\n actionSettings: 'manage_accounts',\n};\n","import { EMPTY, expand, Observable, reduce } from 'rxjs';\n\nexport interface PagedResponse<T> {\n hasMoreItems: boolean;\n objects: T[];\n}\n\n/**\n * Walks every page of a paginated endpoint and concatenates the results. Used where the API\n * only offers server-side pagination but a feature needs the full, unpaginated list (e.g. the\n * groups rail, which needs every group at once rather than one page at a time).\n */\nexport function aggregateAllPages<T>(\n fetchPage: (page: number) => Observable<PagedResponse<T>>\n): Observable<T[]> {\n return fetchPage(0).pipe(\n expand((response, index) => (response.hasMoreItems ? fetchPage(index + 1) : EMPTY)),\n reduce((acc: T[], response) => [...acc, ...response.objects], [])\n );\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ApiBase, BackendService, TranslateService } from '@yuuvis/client-core';\nimport {\n UserDetailsObject,\n UserObject,\n UsersSearchResponse,\n GroupDetailsObject,\n GroupObject,\n GroupsSearchResponse,\n IdentityProviderSetupInfo,\n OIDCProviderConfig,\n SCIM_MANAGED_ROLE,\n} from './user-management.schema';\nimport { HttpParams } from '@angular/common/http';\nimport { forkJoin, map, Observable, of, switchMap } from 'rxjs';\nimport { aggregateAllPages } from './paged-response';\nimport { UserRequest, GroupRequest } from './user-request';\n\nimport { ConfirmService } from '@yuuvis/client-components/common';\n\n/**\n * Maps an HTTP error status to an i18n key under `${keyPrefix}.error.*`, e.g.\n * \"yuv.app.user-management.users.action.create.error.forbidden\" for a 403.\n * `extraStatusSuffixes` lets a caller opt in to additional statuses beyond the\n * universal 403/\"forbidden\" and default/\"unknown\" (e.g. `{ 409: 'conflict' }`).\n */\nexport function resolveErrorMessageKey(\n keyPrefix: string,\n status: number,\n extraStatusSuffixes: Record<number, string> = {}\n): string {\n if (status === 403) {\n return `${keyPrefix}.error.forbidden`;\n }\n const extraSuffix = extraStatusSuffixes[status];\n return `${keyPrefix}.error.${extraSuffix || 'unknown'}`;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class YuvUserManagementService {\n /** Also the default in the page-size selector on the users/group-membership list - see `YuvUserManagementComponent.pageSizeOptions`. */\n static DEFAULT_PAGE_SIZE = 25;\n\n /**\n * Page size used when walking *every* page of a list (see `aggregateAllPages`), which the\n * backend only exposes paginated. Deliberately much larger than `DEFAULT_PAGE_SIZE`: those walks\n * are sequential (each page's request only goes out once the previous one has answered), so the\n * page size is what decides how many round trips a full list costs.\n */\n static AGGREGATE_PAGE_SIZE = 200;\n\n readonly #backendService = inject(BackendService);\n readonly #translateService = inject(TranslateService);\n readonly #confirmService = inject(ConfirmService);\n\n /** Common `page`/`size`/`sort` params shared by every paginated `/idm/` list endpoint. */\n #pageParams(\n page: number,\n sort: string,\n size = YuvUserManagementService.DEFAULT_PAGE_SIZE\n ): HttpParams {\n return new HttpParams().set('page', page).set('size', size).set('sort', sort);\n }\n\n /** `enabled` filters by user state: `true` for enabled-only, `false` for disabled-only, omitted for both. */\n fetchUsers(\n page = 0,\n search?: string,\n enabled?: boolean,\n pageSize?: number\n ): Observable<UsersSearchResponse> {\n let filterParams = this.#pageParams(page, 'username%2Casc', pageSize).set(\n 'search',\n search || ''\n );\n if (enabled !== undefined) {\n filterParams = filterParams.set('enabled', enabled);\n }\n\n return this.#backendService.get(\n `/tenant-management/api/idm/users?${filterParams}`,\n ApiBase.none\n );\n }\n\n fetchGroups(page = 0, search?: string, pageSize?: number): Observable<GroupsSearchResponse> {\n const filterParams = this.#pageParams(page, 'name%2Casc', pageSize).set('search', search || '');\n\n return this.#backendService.get(\n `/tenant-management/api/idm/groups?${filterParams}`,\n ApiBase.none\n );\n }\n\n /**\n * Fetches every group across all pages. Used for the groups rail, which needs the full list\n * rather than one page at a time.\n */\n fetchAllGroups(): Observable<GroupObject[]> {\n return aggregateAllPages<GroupObject>((page) =>\n this.fetchGroups(page, undefined, YuvUserManagementService.AGGREGATE_PAGE_SIZE)\n );\n }\n\n /**\n * Fetches one server-paginated page of a group's members as full user records. Group\n * membership search isn't supported by the backend - there's no `search` param here, see\n * `YuvUserManagementComponent` for how the UI enforces that a search always scopes to \"All users\"\n * instead.\n */\n fetchGroupMembers(groupId: string, page = 0, pageSize?: number): Observable<UsersSearchResponse> {\n const filterParams = this.#pageParams(page, 'username%2Casc', pageSize);\n\n return this.#backendService.get(\n `/tenant-management/api/idm/groups/${groupId}/members?${filterParams}`,\n ApiBase.none\n );\n }\n\n /**\n * Removes a user from a group (the user account itself is unaffected), after the user\n * confirms the action.\n */\n removeGroupMember(group: GroupObject, user: UserObject): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.removeMember.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.removeMember.confirm.message',\n { username: user.username, name: group.name }\n ),\n confirmLabel: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.removeMember.confirm.label'\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(\n `/tenant-management/api/idm/groups/${group.id}/members/${user.id}`,\n ApiBase.none\n )\n .pipe(map(() => true));\n } else return of(false);\n })\n );\n }\n\n /**\n * Adds a user to a group (the user account itself is unaffected). Unlike `removeGroupMember`,\n * adding isn't destructive, so no confirmation dialog - consistent with createUser/createGroup.\n */\n addGroupMember(group: GroupObject, userId: string): Observable<void> {\n return this.#backendService.put(\n `/tenant-management/api/idm/groups/${group.id}/members/${userId}`,\n null,\n ApiBase.none\n );\n }\n\n fetchAllRoles(): Observable<string[]> {\n return this.#backendService\n .get(`/tenant-management/api/idm/roles`, ApiBase.none)\n .pipe(\n map((roles: { name: string; description: string }[]) =>\n roles.map((role) => role.name).filter((name) => name !== SCIM_MANAGED_ROLE)\n )\n );\n }\n\n createUser(createUserRequest: UserRequest, withInvitation?: boolean): Observable<string> {\n const createParams = new HttpParams()\n .set('withInvitation', withInvitation || false)\n .set('temporaryPassword', true);\n\n return this.#backendService\n .post(`/tenant-management/api/idm/users?${createParams}`, createUserRequest, ApiBase.none, {\n responseType: 'text',\n })\n .pipe(map((createdUserId: string) => createdUserId));\n }\n\n updateUser(userId: string, updateUserRequest: UserRequest): Observable<void> {\n return this.#backendService.put(\n `/tenant-management/api/idm/users/${userId}`,\n updateUserRequest,\n ApiBase.none\n );\n }\n\n deleteUser(user: UserObject): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant('yuv.app.user-management.users.action.delete.label'),\n message: this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.confirm.message',\n { username: user.username }\n ),\n confirmLabel: this.#translateService.instant(\n 'yuv.app.user-management.users.action.delete.confirm.label'\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(`/tenant-management/api/idm/users/${user.id}`, ApiBase.none)\n .pipe(map(() => true));\n } else return of(false);\n })\n );\n }\n\n createGroup(createGroupRequest: GroupRequest): Observable<string> {\n const createParams = new HttpParams();\n\n return this.#backendService\n .post(`/tenant-management/api/idm/groups?${createParams}`, createGroupRequest, ApiBase.none, {\n responseType: 'text',\n })\n .pipe(map((createdGroupId: string) => createdGroupId));\n }\n\n updateGroup(groupId: string, updateGroupRequest: GroupRequest): Observable<void> {\n return this.#backendService.put(\n `/tenant-management/api/idm/groups/${groupId}`,\n updateGroupRequest,\n ApiBase.none\n );\n }\n\n deleteGroup(group: GroupObject): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant('yuv.app.user-management.groups.action.delete.label'),\n message: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.delete.confirm.message',\n { name: group.name }\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(`/tenant-management/api/idm/groups/${group.id}`, ApiBase.none)\n .pipe(map(() => true));\n } else return of(false);\n })\n );\n }\n\n getUserDetails(id: string): Observable<UserDetailsObject> {\n const combined$: Observable<UserDetailsObject> = forkJoin({\n userDetails: this.#backendService\n .get(`/tenant-management/api/idm/users/${id}`, ApiBase.none)\n .pipe(\n map((user) => {\n const { roles: effectiveRoles = [], ...rest } = user;\n return { effectiveRoles, ...rest };\n })\n ),\n userRoles: this.#backendService.get(\n `/tenant-management/api/idm/users/${id}/roles`,\n ApiBase.none\n ),\n }).pipe(\n map(\n (response): UserDetailsObject => ({\n ...response.userDetails,\n roles: response.userRoles,\n })\n )\n );\n\n return combined$;\n }\n\n /**\n * Fetches the OIDC identity provider configuration (e.g. Microsoft Entra ID) of the current\n * tenant. Emits a 404 error if no OIDC identity provider is configured.\n */\n fetchOIDCProviderConfig(): Observable<OIDCProviderConfig> {\n return this.#backendService.get(\n `/tenant-management/api/admin/identity-provider/oidc`,\n ApiBase.none\n );\n }\n\n /**\n * Fetches the tenant-specific values needed to configure an external identity provider (the\n * OIDC redirect URI and the SCIM provisioning endpoint/credentials). Available independent of\n * whether an OIDC identity provider has already been configured, since both values are derived\n * from the tenant alone.\n */\n fetchIdentityProviderSetupInfo(): Observable<IdentityProviderSetupInfo> {\n return this.#backendService.get(\n `/tenant-management/api/admin/identity-provider/setup-info`,\n ApiBase.none\n );\n }\n\n /**\n * Creates (or updates) the OIDC identity provider configuration of the current tenant. The\n * discovery URL must be passed as `config.metadataDescriptorUrl` — the backend resolves the\n * OIDC endpoints (authorizationUrl, tokenUrl, jwksUrl, ...) from the discovery document.\n */\n setOIDCProviderConfig(providerConfig: OIDCProviderConfig): Observable<OIDCProviderConfig> {\n return this.#backendService.post(\n `/tenant-management/api/admin/identity-provider/oidc`,\n providerConfig,\n ApiBase.none\n );\n }\n\n /**\n * Deletes the OIDC identity provider configuration of the current tenant, after the user\n * confirmed the action.\n */\n deleteOIDCProviderConfig(): Observable<boolean> {\n return this.#confirmService\n .confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.settings.oidc.action.reset.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.settings.oidc.action.reset.confirm.message'\n ),\n })\n .pipe(\n switchMap((confirmed: boolean) => {\n if (confirmed) {\n return this.#backendService\n .delete(`/tenant-management/api/admin/identity-provider/oidc`, ApiBase.none)\n .pipe(map(() => true));\n } else return of(false);\n })\n );\n }\n\n getGroupDetails(id: string): Observable<GroupDetailsObject> {\n return this.#backendService.get(`/tenant-management/api/idm/groups/${id}`, ApiBase.none);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, ContentChild, Input, OnDestroy, TemplateRef } from '@angular/core';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { AbstractMatFormField } from '@yuuvis/client-components/common';\n\nlet nextId = 0;\n\n/**\n * A read-only `MatFormFieldControl` that renders a *list* of values inside a real\n * `<mat-form-field>` - for \"fields\" that are inherently a list (assigned roles, group membership)\n * rather than a single text value, but should still look and behave like every other field\n * (outline, floating label, spacing) without a hand-matched CSS mock: `mat-form-field` throws at\n * runtime unless its content is a real `MatFormFieldControl`, which is exactly what this is.\n *\n * The `MatFormFieldControl` contract itself comes from `AbstractMatFormField`, the framework's own\n * base for this (it's what `yuv-autocomplete` extends) - so `stateChanges`, `value`, `placeholder`,\n * `required`, `disabled`, `focused`, `errorState`, `ngControl` and `shouldLabelFloat` are all\n * inherited rather than re-implemented here. Two of its behaviours are deliberately opted out of;\n * both are noted where that happens below.\n *\n * `[value]` is the list itself. Each item's markup comes entirely from the `<ng-template let-item>`\n * projected as this component's content - deliberately not a fixed \"badge\" shape with a growing\n * pile of `displayWith`/`tooltipWith`/`severityWith`/... inputs, since what a list item actually\n * needs to show (a plain badge, an icon+badge, a clickable button wrapping one) varies enough\n * between usages that a template the caller fully controls is simpler than anticipating every\n * variation through more inputs - and the caller's own pipes/translations/click handlers are\n * already in scope inside that template, with no need to re-expose them as function inputs.\n * `[emptyLabel]` is shown as plain text when the list is empty - pass it already translated (e.g.\n * `[emptyLabel]=\"'...' | translate\"`), this component has no i18n dependency of its own.\n *\n * Note the empty state is driven by the template's own `@if (value && value.length)`, not by the\n * inherited `empty` - which the base derives as `!value`, i.e. `false` for an empty array. That\n * suits this control: `shouldLabelFloat` is `focused || !empty`, so the label floats permanently,\n * which is what a labelled list wants (there is no \"empty native input\" state for a label to sit\n * over as placeholder text).\n *\n * @example\n * ```html\n * <mat-form-field>\n * <mat-label>Assigned roles</mat-label>\n * <ymusrmgmt-list-field [value]=\"roles\" [emptyLabel]=\"'None' | translate\">\n * <ng-template let-role>\n * <ymt-badge [matTooltip]=\"role | roleTooltip\">{{ role | roleLabel }}</ymt-badge>\n * </ng-template>\n * </ymusrmgmt-list-field>\n * </mat-form-field>\n * ```\n */\n@Component({\n selector: 'ymusrmgmt-list-field',\n standalone: true,\n imports: [NgTemplateOutlet],\n templateUrl: './list-field.component.html',\n styleUrl: './list-field.component.scss',\n providers: [{ provide: MatFormFieldControl, useExisting: ListFieldComponent }],\n host: {\n '[id]': 'id',\n '[attr.aria-describedby]': 'describedBy || null',\n },\n})\nexport class ListFieldComponent<T = unknown>\n extends AbstractMatFormField<T[]>\n implements OnDestroy\n{\n /** The per-item template, projected as this component's content - receives each item as its\n * implicit context (`<ng-template let-item>`). */\n @ContentChild(TemplateRef) itemTemplate?: TemplateRef<{ $implicit: T }>;\n\n @Input() emptyLabel = '';\n\n /**\n * The list to render. Declared here because the base doesn't do it itself:\n * `AbstractMatFormField` marks `placeholder`/`required`/`disabled` as inputs but not `value`,\n * since its other subclass (`yuv-autocomplete`) receives values through\n * `ControlValueAccessor.writeValue` rather than a template binding. This control has no\n * `NgControl`, so a binding is exactly what it needs - the accessor itself just forwards to the\n * base, which keeps `empty` and `stateChanges` up to date.\n */\n @Input()\n override set value(items: T[] | null) {\n super.value = items;\n }\n\n override get value(): T[] | null {\n return super.value;\n }\n\n /** Nothing focusable/labelable lives inside by default - there's no native control for a\n * `<label for>` to point at, so automatic labeling would just be wrong (and Material would warn\n * about it). An item template with its own focusable content (e.g. a clickable group badge)\n * still gets focus/click normally - this only affects the form field's own label association. */\n override readonly disableAutomaticLabeling = true;\n\n /** Ids of any `mat-hint`/`mat-error` describing this control, reflected onto the host by the\n * `aria-describedby` binding above - see `setDescribedByIds`. */\n describedBy = '';\n\n constructor() {\n super();\n\n // The base starts every instance at `id: ''`, and `mat-form-field` needs a unique one to\n // reference this control from its label.\n this.id = `ymusrmgmt-list-field-${nextId++}`;\n\n // Opts out of the base's `onContainerClick`, which forwards a click anywhere in the form field\n // to the first focusable element inside the control. For a read-only list that would mean\n // clicking the field's padding jumps focus onto the first group badge - a plain read-only\n // field does nothing on such a click, and so does this one. `focusHandled` is the base's own\n // flag for \"the subclass manages its own focus\", so this needs no override.\n this.focusHandled.set(true);\n }\n\n /** The base's implementation is an empty stub (its body is commented out), so `aria-describedby`\n * has to be wired here or a `mat-hint`/`mat-error` alongside this control would never be\n * announced. Harmless today - no usage has either - but it would be a silent trap later. */\n override setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(' ');\n }\n\n /** The base exposes its teardown as `onNgOnDestroy`, not as a lifecycle hook of its own, so it\n * only runs if a subclass calls it - without this, `stateChanges` would never complete. */\n ngOnDestroy(): void {\n this.onNgOnDestroy();\n }\n}\n","@if (value && value.length) {\n<div class=\"list-field-items\">\n @for (item of value; track item) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n }\n</div>\n} @else {\n<span class=\"empty\">{{ emptyLabel }}</span>\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { LocalizationService } from '@yuuvis/client-core';\n\nconst ROLE_KEY_PREFIX = 'role:';\n\n/** Localized role name, falling back to the technical name when no `_label` entry exists. */\nexport function resolveRoleLabel(localization: LocalizationService, role: string): string {\n return localization.getLocalizedLabel(ROLE_KEY_PREFIX + role) ?? role;\n}\n\n/**\n * Tooltip text for a role chip:\n * - Localized label present → show technical name + description (if any): \"ROLE_NAME – Description\"\n * - No localized label → technical name already visible as chip text; show description only (if any)\n */\nexport function resolveRoleTooltip(localization: LocalizationService, role: string): string {\n const label = localization.getLocalizedLabel(ROLE_KEY_PREFIX + role);\n const description = localization.getLocalizedDescription(ROLE_KEY_PREFIX + role);\n if (!label) {\n return description ?? '';\n }\n return description ? `${role} – ${description}` : role;\n}\n\n@Pipe({ name: 'roleLabel', standalone: true })\nexport class RoleLabelPipe implements PipeTransform {\n readonly #localization = inject(LocalizationService);\n\n transform(role: string): string {\n return resolveRoleLabel(this.#localization, role);\n }\n}\n\n@Pipe({ name: 'roleTooltip', standalone: true })\nexport class RoleTooltipPipe implements PipeTransform {\n readonly #localization = inject(LocalizationService);\n\n transform(role: string): string {\n return resolveRoleTooltip(this.#localization, role);\n }\n}\n\n@Pipe({ name: 'sortRolesByLabel', standalone: true })\nexport class SortRolesByLabelPipe implements PipeTransform {\n readonly #localization = inject(LocalizationService);\n\n transform(roles: readonly string[] | null | undefined): string[] {\n if (!roles) return [];\n return [...roles].sort((a, b) =>\n resolveRoleLabel(this.#localization, a).localeCompare(resolveRoleLabel(this.#localization, b))\n );\n }\n}\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { ClipboardModule } from '@angular/cdk/clipboard';\nimport { Router } from '@angular/router';\nimport { Observable, shareReplay } from 'rxjs';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Logger, NotificationService, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-components/common';\nimport { YmtBadge } from '@yuuvis/material/badge';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\nimport {\n APP_ICONS,\n GroupObject,\n UserDetailsObject,\n UserObject,\n} from '../../../user-management.schema';\nimport { YuvUserManagementService } from '../../../user-management.service';\nimport { ListFieldComponent } from '../../../components/list-field/list-field.component';\nimport {\n RoleLabelPipe,\n RoleTooltipPipe,\n SortRolesByLabelPipe,\n} from '../../../pipes/role-localization.pipes';\n\n@Component({\n selector: 'ymusrmgmt-user-details',\n imports: [\n BusyOverlayDirective,\n ClipboardModule,\n ListFieldComponent,\n MatButtonModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatTooltipModule,\n TranslatePipe,\n YmtBadge,\n YmtPanesModule,\n RoleLabelPipe,\n RoleTooltipPipe,\n SortRolesByLabelPipe,\n ],\n templateUrl: './user-details.component.html',\n styleUrl: './user-details.component.scss',\n})\nexport class UserDetailsComponent {\n readonly #userService = inject(YuvUserManagementService);\n readonly #logger = inject(Logger);\n readonly #notificationService = inject(NotificationService);\n readonly #translateService = inject(TranslateService);\n readonly #router = inject(Router);\n\n readonly icons = APP_ICONS;\n\n /** The row the pane header is built from - available synchronously from the table selection, so the header doesn't wait on `userDetails`. */\n user = input<UserObject | undefined>(undefined);\n\n /** Roles granted by the group currently scoping the page's user list (empty when viewing \"All users\"), used to highlight which of the user's inherited roles come from it specifically. */\n groupRoles = input<string[]>([]);\n\n /** Forwarded to the internal `ymt-pane`'s top bar - see `YmtPaneComponent.topBarActions`. */\n topBarActions = input<TemplateRef<unknown>>();\n\n /** Emitted with the displayed user when the header's edit action is triggered - editing itself is owned by the page, this only surfaces the trigger. */\n editUser = output<UserObject>();\n\n /** Groups/roles overview content - fetched separately since it isn't available on the plain table row. */\n userDetails = signal<UserDetailsObject | undefined>(undefined);\n\n busy = signal<boolean>(false);\n\n /** Only reloads `userDetails` when the id actually changes, not on every new object reference for the same user. */\n #userId = computed(() => this.user()?.id);\n\n /** Groups the user belongs to, alphabetically - the raw `groups` array has no guaranteed order. */\n sortedGroups = computed(() =>\n [...(this.userDetails()?.groups ?? [])].sort((a, b) => a.localeCompare(b))\n );\n\n /** Roles assigned to the user directly. */\n directRoles = computed(() => this.userDetails()?.roles ?? []);\n\n /** Roles the user only holds through group membership - present in `effectiveRoles` but not directly assigned. */\n inheritedRoles = computed(() => {\n const details = this.userDetails();\n if (!details) {\n return [];\n }\n const direct = new Set(details.roles);\n return details.effectiveRoles.filter((role) => !direct.has(role));\n });\n\n /** Fast lookup for `isFromCurrentGroup` - which of `groupRoles` (the currently scoped group's roles) is being checked per inherited-role chip. */\n #currentGroupRoles = computed(() => new Set(this.groupRoles()));\n\n /** Whether an inherited role is granted by the group currently scoping the page's user list, rather than some other group the user belongs to. */\n isFromCurrentGroup(role: string): boolean {\n return this.#currentGroupRoles().has(role);\n }\n\n /** Cached, shared across every `openGroup` call - group badges can be clicked repeatedly, and\n * `fetchAllGroups()` paginates through the entire group directory, so re-fetching it fresh on\n * every click would be wasteful once the first click already has it. Lazily created on first\n * use rather than eagerly in the constructor, since most users never click a group badge. */\n #allGroups$?: Observable<GroupObject[]>;\n\n /** Navigates to the given group in the groups pane. `userDetails().groups` is just a list of\n * group names (the backend's user-details endpoint doesn't return group ids), so the name has\n * to be resolved against the full groups list first. */\n openGroup(groupName: string) {\n (this.#allGroups$ ??= this.#userService.fetchAllGroups().pipe(shareReplay(1))).subscribe({\n next: (groups) => {\n const group = groups.find((g) => g.name === groupName);\n if (!group) {\n this.#logger.error(`Could not resolve group '${groupName}' to a group id`);\n return;\n }\n this.#router.navigate(['/identities'], { queryParams: { group: group.id } });\n },\n error: (e: unknown) => this.#logger.error(`Failed to resolve group '${groupName}'`, e),\n });\n }\n\n constructor() {\n effect(() => this.loadUserDetails(this.#userId()));\n }\n\n private loadUserDetails(userId: string | undefined) {\n if (userId) {\n // Clears the previous user's groups/roles immediately rather than leaving them up (stale)\n // until the new response arrives - `busy` alone wouldn't make that obvious enough.\n this.userDetails.set(undefined);\n this.busy.set(true);\n this.#userService.getUserDetails(userId).subscribe({\n next: (user) => this.userDetails.set(user),\n error: (e) => {\n this.#logger.error(`Failed to load details for user with id '${userId}'`, e);\n this.busy.set(false);\n },\n complete: () => this.busy.set(false),\n });\n } else {\n this.userDetails.set(undefined);\n }\n }\n\n /**\n * Refresh the user details by reloading the data from the server\n */\n refresh(): void {\n this.loadUserDetails(this.user()?.id);\n }\n\n /** Handles the `cdkCopyToClipboardCopied` output, which reports whether the copy succeeded. */\n onCopied(success: boolean) {\n if (success) {\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.common.action.copy.success')\n );\n } else {\n this.#notificationService.error(\n this.#translateService.instant('yuv.app.user-management.common.action.copy.error')\n );\n }\n }\n}\n","@let displayUser = user(); @let detailsTitle = 'yuv.app.user-management.users.label.details.title' |\ntranslate; @if (displayUser) {\n<ymt-pane [topBarActions]=\"topBarActions()\" role=\"region\" [attr.aria-label]=\"detailsTitle\">\n <ymt-pane-header\n [icon]=\"'badge'\"\n [title]=\"'yuv.app.user-management.users.label.details.title' | translate\"\n [subtitle]=\"displayUser.username\"\n [actions]=\"headerActions\"\n [badges]=\"badges\"\n ></ymt-pane-header>\n <ymt-pane-body [yuvBusyOverlay]=\"busy()\">\n @let currentUserDetails = userDetails(); @if (currentUserDetails) {\n <form class=\"properties-form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.id' | translate }}</mat-label>\n <input\n readonly\n matInput\n type=\"text\"\n [value]=\"displayUser.id\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.id' | translate\"\n />\n <button\n matSuffix\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.common.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"displayUser.id\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.email' | translate }}</mat-label>\n <input\n readonly\n matInput\n type=\"text\"\n [value]=\"currentUserDetails.email\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.email' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.firstname' | translate }}</mat-label>\n <input\n readonly\n matInput\n type=\"text\"\n [value]=\"displayUser.firstName ?? ''\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.firstname' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.lastname' | translate }}</mat-label>\n <input\n readonly\n matInput\n type=\"text\"\n [value]=\"displayUser.lastName ?? ''\"\n [attr.tabindex]=\"-1\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.lastname' | translate\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\n 'yuv.app.user-management.users.label.details.roles.direct.title' | translate\n }}</mat-label>\n <ymusrmgmt-list-field\n [value]=\"directRoles() | sortRolesByLabel\"\n [emptyLabel]=\"\n 'yuv.app.user-management.users.label.details.roles.direct.empty' | translate\n \"\n >\n <ng-template let-role>\n <ymt-badge class=\"role-badge\" severity=\"primary\" [matTooltip]=\"role | roleTooltip\">\n <span class=\"badge-label\">{{ role | roleLabel }}</span>\n </ymt-badge>\n </ng-template>\n </ymusrmgmt-list-field>\n </mat-form-field>\n\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\n 'yuv.app.user-management.users.label.details.roles.inherited.title' | translate\n }}</mat-label>\n <ymusrmgmt-list-field\n [value]=\"inheritedRoles() | sortRolesByLabel\"\n [emptyLabel]=\"\n 'yuv.app.user-management.users.label.details.roles.inherited.empty' | translate\n \"\n >\n <ng-template let-role>\n @let fromCurrentGroup = isFromCurrentGroup(role); @let tooltipText = role | roleTooltip;\n <ymt-badge\n class=\"role-badge\"\n [severity]=\"fromCurrentGroup ? 'primary' : 'neutral'\"\n [outline]=\"true\"\n [matTooltip]=\"\n fromCurrentGroup\n ? ('yuv.app.user-management.users.label.details.roles.inherited.currentGroup.tooltip'\n | translate) + (tooltipText ? ' – ' + tooltipText : '')\n : tooltipText\n \"\n >\n @if (fromCurrentGroup) {\n <mat-icon>group</mat-icon>\n }\n <span class=\"badge-label\">{{ role | roleLabel }}</span>\n </ymt-badge>\n </ng-template>\n </ymusrmgmt-list-field>\n </mat-form-field>\n\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\n 'yuv.app.user-management.users.label.details.groups.title' | translate\n }}</mat-label>\n <ymusrmgmt-list-field\n [value]=\"sortedGroups()\"\n [emptyLabel]=\"'yuv.app.user-management.users.label.details.groups.empty' | translate\"\n >\n <ng-template let-group>\n <button\n type=\"button\"\n class=\"group-badge-button\"\n (click)=\"openGroup(group)\"\n [matTooltip]=\"\n 'yuv.app.user-management.users.label.details.groups.open.tooltip' | translate\n \"\n [attr.aria-label]=\"\n ('yuv.app.user-management.users.label.details.groups.open.tooltip' | translate) +\n ': ' +\n group\n \"\n >\n <ymt-badge severity=\"neutral\">\n <mat-icon>group</mat-icon>\n <span class=\"badge-label\">{{ group }}</span>\n </ymt-badge>\n </button>\n </ng-template>\n </ymusrmgmt-list-field>\n </mat-form-field>\n </form>\n }\n </ymt-pane-body>\n</ymt-pane>\n\n<ng-template #headerActions>\n <button\n mat-icon-button\n [matTooltip]=\"'yuv.app.user-management.users.action.edit.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.action.edit.label' | translate\"\n (click)=\"editUser.emit(displayUser)\"\n >\n <mat-icon>{{ icons.actionEditUser }}</mat-icon>\n </button>\n</ng-template>\n\n<ng-template #badges>\n @if (!displayUser.enabled) {\n <ymt-badge\n severity=\"neutral\"\n [aura]=\"true\"\n [matTooltip]=\"'yuv.app.user-management.users.property.disabled' | translate\"\n >\n <mat-icon aria-hidden=\"true\">{{ icons.stateInactive }}</mat-icon>\n <span>{{ 'yuv.app.user-management.users.property.disabled' | translate }}</span>\n </ymt-badge>\n } @if (displayUser.externallyManaged) {\n <ymt-badge\n severity=\"primary\"\n [aura]=\"true\"\n [matTooltip]=\"'yuv.app.user-management.users.label.identitySource.external.tooltip' | translate\"\n >\n <mat-icon>{{ icons.sourceExternal }}</mat-icon>\n <span>{{ 'yuv.app.user-management.users.property.identitySource.external' | translate }}</span>\n </ymt-badge>\n }\n</ng-template>\n} @else {\n<ymt-pane [topBarActions]=\"topBarActions()\" role=\"region\" [attr.aria-label]=\"detailsTitle\">\n <ymt-pane-body>\n <div class=\"details-empty-state\">\n <mat-icon>person_search</mat-icon>\n {{ 'yuv.app.user-management.users.label.details.empty' | translate }}\n </div>\n </ymt-pane-body>\n</ymt-pane>\n}\n","import { Component, input, output, signal, computed, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatListModule } from '@angular/material/list';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslatePipe, LocalizationService } from '@yuuvis/client-core';\nimport {\n RoleLabelPipe,\n RoleTooltipPipe,\n resolveRoleLabel,\n} from '../../pipes/role-localization.pipes';\n\n@Component({\n selector: 'ymusrmgmt-role-selection',\n imports: [\n CommonModule,\n MatIconModule,\n MatButtonModule,\n MatListModule,\n MatTooltipModule,\n TranslatePipe,\n RoleLabelPipe,\n RoleTooltipPipe,\n ],\n standalone: true,\n templateUrl: './roles-selection.component.html',\n styleUrl: './roles-selection.component.scss',\n})\nexport class RolesSelectionComponent {\n readonly #localization = inject(LocalizationService);\n\n /** Orders roles by their localized label so the lists read naturally in the active language.\n * Decorate-sort-undecorate: `resolveRoleLabel` is a `LocalizationService` lookup, and a plain\n * comparator would re-resolve both operands on every one of the O(n log n) comparisons. */\n readonly #sortByLabel = (roles: string[]): string[] =>\n roles\n .map((role): [string, string] => [resolveRoleLabel(this.#localization, role), role])\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([, role]) => role);\n\n allRoles = input.required<string[]>();\n initialRoles = input.required<string[]>();\n rolesChange = output<string[]>();\n availableRoles = signal<string[]>([]);\n assignedRoles = signal<string[]>([]);\n selectedAvailable = signal<string[]>([]);\n selectedAssigned = signal<string[]>([]);\n canAssign = computed(() => this.selectedAvailable().length > 0);\n canRemove = computed(() => this.selectedAssigned().length > 0);\n\n /** Selection lookups for the two option lists. Both are read once per rendered option on every\n * change-detection pass, so they're memoized `Set`s rather than an `Array#includes` scan each. */\n readonly #selectedAvailableSet = computed(() => new Set(this.selectedAvailable()));\n readonly #selectedAssignedSet = computed(() => new Set(this.selectedAssigned()));\n\n constructor() {\n effect(() => {\n const all = this.allRoles();\n const initial = this.initialRoles();\n\n const initialSet = new Set(initial);\n this.assignedRoles.set(this.#sortByLabel(initial));\n this.availableRoles.set(this.#sortByLabel(all.filter((role) => !initialSet.has(role))));\n this.selectedAvailable.set([]);\n this.selectedAssigned.set([]);\n });\n }\n\n /** Bound to `mat-list-option`'s `(selectedChange)`, which fires uniformly for mouse and keyboard interaction — unlike `(click)`, which Material's keyboard handling never dispatches. */\n onAvailableSelectedChange(role: string, selected: boolean) {\n this.selectedAvailable.update((current) =>\n selected ? [...current, role] : current.filter((r) => r !== role)\n );\n }\n\n onAssignedSelectedChange(role: string, selected: boolean) {\n this.selectedAssigned.update((current) =>\n selected ? [...current, role] : current.filter((r) => r !== role)\n );\n }\n\n /** Moves a single role from available to assigned, bypassing the selection/assign-button flow (e.g. on double-click). */\n assignRole(role: string) {\n this.availableRoles.update((roles) => roles.filter((r) => r !== role));\n this.assignedRoles.update((roles) => this.#sortByLabel([...roles, role]));\n this.selectedAvailable.update((current) => current.filter((r) => r !== role));\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n /** Moves a single role from assigned to available, bypassing the selection/remove-button flow (e.g. on double-click). */\n removeRole(role: string) {\n this.assignedRoles.update((roles) => roles.filter((r) => r !== role));\n this.availableRoles.update((roles) => this.#sortByLabel([...roles, role]));\n this.selectedAssigned.update((current) => current.filter((r) => r !== role));\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n assignRoles() {\n const toAssign = this.selectedAvailable();\n if (toAssign.length === 0) return;\n\n const toAssignSet = new Set(toAssign);\n this.availableRoles.update((roles) => roles.filter((r) => !toAssignSet.has(r)));\n this.assignedRoles.update((roles) => this.#sortByLabel([...roles, ...toAssign]));\n this.selectedAvailable.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n removeRoles() {\n const toRemove = this.selectedAssigned();\n if (toRemove.length === 0) return;\n\n const toRemoveSet = new Set(toRemove);\n this.assignedRoles.update((roles) => roles.filter((r) => !toRemoveSet.has(r)));\n this.availableRoles.update((roles) => this.#sortByLabel([...roles, ...toRemove]));\n this.selectedAssigned.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n assignAllRoles() {\n const allAvailable = this.availableRoles();\n if (allAvailable.length === 0) return;\n\n this.assignedRoles.update((roles) => this.#sortByLabel([...roles, ...allAvailable]));\n this.availableRoles.set([]);\n this.selectedAvailable.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n removeAllRoles() {\n const allAssigned = this.assignedRoles();\n if (allAssigned.length === 0) return;\n\n this.availableRoles.update((roles) => this.#sortByLabel([...roles, ...allAssigned]));\n this.assignedRoles.set([]);\n this.selectedAssigned.set([]);\n\n this.rolesChange.emit(this.assignedRoles());\n }\n\n isAvailableSelected(role: string): boolean {\n return this.#selectedAvailableSet().has(role);\n }\n\n isAssignedSelected(role: string): boolean {\n return this.#selectedAssignedSet().has(role);\n }\n}\n","<div class=\"role-selector\">\n <!-- Available Roles (Left) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.common.label.roles.available' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #availableList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.common.label.roles.available' | translate\"\n >\n @for (role of availableRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAvailableSelected(role)\"\n (selectedChange)=\"onAvailableSelectedChange(role, $event)\"\n (dblclick)=\"assignRole(role)\"\n (keydown.enter)=\"$event.stopPropagation(); assignRole(role)\"\n >\n {{ role | roleLabel }}\n </mat-list-option>\n } @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.common.label.roles.noAvailable' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n\n <!-- Control Buttons (Center) -->\n <div class=\"control-buttons\">\n <button\n mat-icon-button\n [disabled]=\"availableRoles().length === 0\"\n (click)=\"assignAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.common.action.roles.assignAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.roles.assignAll' | translate\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canAssign()\"\n (click)=\"assignRoles()\"\n [matTooltip]=\"'yuv.app.user-management.common.action.roles.assign' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.roles.assign' | translate\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canRemove()\"\n (click)=\"removeRoles()\"\n [matTooltip]=\"'yuv.app.user-management.common.action.roles.remove' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.roles.remove' | translate\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"assignedRoles().length === 0\"\n (click)=\"removeAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.common.action.roles.removeAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.roles.removeAll' | translate\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n </div>\n\n <!-- Assigned Roles (Right) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.common.label.roles.assigned' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #assignedList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.common.label.roles.assigned' | translate\"\n >\n @for (role of assignedRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAssignedSelected(role)\"\n (selectedChange)=\"onAssignedSelectedChange(role, $event)\"\n (dblclick)=\"removeRole(role)\"\n (keydown.enter)=\"$event.stopPropagation(); removeRole(role)\"\n >\n {{ role | roleLabel }}\n </mat-list-option>\n } @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.common.label.roles.noAssigned' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, Inject, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { resolveErrorMessageKey, YuvUserManagementService } from '../../user-management.service';\nimport { GroupDetailsObject } from '../../user-management.schema';\nimport { GroupRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { RolesSelectionComponent } from '../../components/roles-selection/roles-selection.component';\n\nconst components = [\n BusyOverlayDirective,\n YmtButtonDirective,\n DialogComponent,\n RolesSelectionComponent,\n];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatInputModule,\n];\n\n@Component({\n selector: 'ymusrmgmt-edit-group',\n templateUrl: './edit-group.component.html',\n styleUrl: './edit-group.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class EditGroupComponent implements AfterViewInit {\n /** Shared `MatDialog.open()` config, so every call site opening this dialog stays in sync. */\n static readonly DIALOG_CONFIG: MatDialogConfig = {\n width: '600px',\n maxWidth: '90vw',\n };\n\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<EditGroupComponent, GroupDetailsObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n allAvailableRoles = signal<string[]>([]);\n\n groupRoles = signal<string[]>([]);\n\n name = new FormControl('');\n description = new FormControl('');\n roles = new FormControl<string[]>([]);\n\n form: FormGroup = this.#fb.group({\n name: this.name,\n description: this.description,\n roles: this.roles,\n });\n\n changedInput = signal<any | undefined>(undefined);\n\n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid || !this.isDataChanged();\n },\n });\n\n constructor(@Inject(MAT_DIALOG_DATA) public data: any) {\n this.form.patchValue({\n name: this.data.group.name,\n description: this.data.group.description,\n roles: this.data.group.roles,\n });\n\n this.groupRoles.set(this.data.group.roles || []);\n\n // Fetch all available roles\n this.#userManagementService.fetchAllRoles().subscribe({\n next: (roles) => {\n this.allAvailableRoles.set(roles.sort());\n },\n error: (e) => {\n this.#logger.error('Failed to fetch roles', e);\n },\n });\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n\n isDataChanged(): boolean {\n const isDataUnchanged = Object.keys(this.form.value).every((key) => this.isEquals(key));\n return !isDataUnchanged;\n }\n\n isEquals(key: string) {\n const oldVal = this.data.group?.[key];\n const newVal = this.form.get(key)?.value;\n return oldVal === newVal;\n }\n\n onRolesChange(roles: string[]) {\n this.groupRoles.set(roles);\n this.form.patchValue({ roles: roles });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n\n updateGroup() {\n const editParams = this.form.getRawValue();\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const updateGroupRequest: GroupRequest = {\n name: editParams.name,\n description: editParams.description,\n roles: editParams.roles,\n };\n\n this.#userManagementService.updateGroup(this.data.group.id, updateGroupRequest).subscribe({\n error: (e: any) => {\n const errorKey = resolveErrorMessageKey(\n 'yuv.app.user-management.groups.action.edit',\n e.status\n );\n this.error.set(this.#translateService.instant(errorKey));\n this.#logger.error(`Failed to update group with id ${this.data.group.id}`, e);\n this.busy.set(false);\n },\n complete: () => {\n this.busy.set(false);\n // Returns the updated group (not just its id) so the caller can reconcile its own state\n // without a redundant `getGroupDetails` round trip for what was just written - mirrors\n // `CreateGroupComponent`. Everything the backend owns and this form doesn't touch (e.g.\n // `members`) carries over from the details this dialog was opened with.\n this.#dialogRef.close({ ...this.data.group, ...updateGroupRequest });\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog\n class=\"not-separated\"\n [yuvBusyOverlay]=\"busy()\"\n [headertitle]=\"\n 'yuv.app.user-management.groups.action.edit.dialog.title'\n | translate : { name: data.group.name }\n \"\n>\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\n 'yuv.app.user-management.groups.property.name' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"name\"\n type=\"text\"\n [attr.tabindex]=\"-1\"\n readonly\n [attr.aria-label]=\"'yuv.app.user-management.groups.property.name' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\n 'yuv.app.user-management.groups.property.description' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"description\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.groups.property.description' | translate\"\n />\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\"\n >\n </ymusrmgmt-role-selection>\n </div>\n </form>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.users.action.button.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateGroup()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { Directive, ElementRef, inject } from '@angular/core';\nimport { FocusableOption } from '@angular/cdk/a11y';\n\n/**\n * Marks an element as one keyboard-navigable row, so CDK's `FocusKeyManager` can drive Up/Down\n * navigation over a `viewChildren()` query of them.\n *\n * Used by both keyboard-navigable lists on this page - the groups rail and the user table - which\n * had grown separate copies of the same roving-tabindex plumbing (an index derived from the\n * selection, a bounds-clamping `moveActive`, and a `viewChildren` query whose elements were\n * focused by hand).\n *\n * `FocusKeyManager` rather than `ActiveDescendantKeyManager` (and rather than `yuv-list`, which\n * builds on the latter): both lists put real DOM focus on the row itself, and each row also\n * contains its own \"more actions\" button. `ActiveDescendantKeyManager` keeps focus on the list\n * container instead, which is why `yuv-list` sets `tabindex=\"-1\"` on every focusable element\n * inside an item - reachable by mouse only. A roving tabindex over real focus keeps those buttons\n * in the keyboard order.\n */\n@Directive({\n selector: '[ymusrmgmt-focusable-row]',\n standalone: true,\n})\nexport class FocusableRowDirective implements FocusableOption {\n readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Called by the key manager, and directly on a row click: with a roving tabindex, a\n * not-yet-active row's `tabindex` is still `-1` at the moment it's clicked, and Safari/older\n * Firefox don't move focus to a `tabindex=\"-1\"` element via a plain click (only script can), so\n * without this a click would select a row but leave keyboard focus behind, breaking the next\n * arrow press.\n */\n focus() {\n this.#elementRef.nativeElement.focus();\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n EventEmitter,\n inject,\n Injector,\n input,\n Input,\n OnInit,\n Output,\n signal,\n TemplateRef,\n viewChildren,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { Logger, NotificationService, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { OverflowMenuItem } from '@yuuvis/client-components/overflow-menu';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\n\nimport { APP_ICONS, GroupDetailsObject, GroupObject } from '../../../user-management.schema';\nimport { YuvUserManagementService } from '../../../user-management.service';\nimport { EditGroupComponent } from '../../../overlays/edit-group/edit-group.component';\nimport { FocusableRowDirective } from '../../../directives/focusable-row.directive';\n\n@Component({\n selector: 'ymusrmgmt-groups',\n standalone: true,\n imports: [\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatTooltipModule,\n TranslatePipe,\n YmtPanesModule,\n FocusableRowDirective,\n ],\n templateUrl: './groups.component.html',\n styleUrl: './groups.component.scss',\n})\nexport class GroupsComponent implements OnInit {\n readonly #logger = inject(Logger);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #translateService = inject(TranslateService);\n readonly #notificationService = inject(NotificationService);\n readonly #dialog = inject(MatDialog);\n readonly #destroyRef = inject(DestroyRef);\n readonly #injector = inject(Injector);\n\n selectedGroupId = input<string | undefined>(undefined);\n /** Forwarded to the internal `ymt-pane`'s top bar - see `YmtPaneComponent.topBarActions`. */\n @Input() topBarActions: TemplateRef<unknown> | undefined;\n @Output() groupSelected = new EventEmitter<GroupObject | undefined>();\n /** Emitted when the group currently scoping the page's user list was edited, so its name/roles can be picked up (e.g. for the subtitle, or the \"inherited from current group\" role highlight). */\n @Output() groupUpdated = new EventEmitter<GroupDetailsObject>();\n /** Emitted when the group currently scoping the page's user list was removed, so the page can fall back to \"All users\". */\n @Output() groupDeleted = new EventEmitter<string>();\n /** Emitted when a row's \"add members\" action was picked - the page owns that flow (dialog,\n * notifications and, when the group is the one currently scoping the list, reloading it). */\n @Output() addMembersRequested = new EventEmitter<GroupObject>();\n\n busy = signal<boolean>(false);\n groups = signal<GroupObject[]>([]);\n\n /** The rendered rows (index 0 = \"All users\", 1..n = `groups()`), in order - see\n * `FocusableRowDirective`. */\n private readonly rowItems = viewChildren(FocusableRowDirective);\n\n /** Drives Up/Down over the rows, moving real DOM focus with the roving tabindex. Shares its\n * mechanism with the user table's own list - see `FocusableRowDirective`. */\n readonly #keyManager = new FocusKeyManager(this.rowItems, this.#injector);\n\n constructor() {\n // Selection follows keyboard focus, matching a native `<select>`'s Up/Down behavior rather\n // than tracking a separate \"highlighted but not yet selected\" state.\n this.#keyManager.change\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((index) => this.#selectAtIndex(index));\n }\n\n /** Roving-tabindex position in the combined \"All users\" (index 0) + groups (index i+1) list -\n * the ARIA listbox/option pattern, where only the selected row is a real Tab stop and Up/Down\n * move between rows instead. Without this, each row would need its own tabindex=\"0\" alongside\n * its \"more actions\" button - two independently-focusable interactive elements nested inside\n * one another, which is what flagged this in the first place. Derived from `selectedGroupId`\n * rather than tracked separately, so a selection made elsewhere (e.g. after creating a group)\n * moves the roving position too. */\n activeIndex = computed(() => {\n const id = this.selectedGroupId();\n if (!id) return 0;\n const i = this.groups().findIndex((g) => g.id === id);\n return i === -1 ? 0 : i + 1;\n });\n\n ngOnInit() {\n this.refresh();\n }\n\n refresh() {\n this.busy.set(true);\n this.#userManagementService.fetchAllGroups().subscribe({\n next: (groups) => {\n this.groups.set(groups);\n },\n error: (e: unknown) => {\n this.#logger.error('Failed to fetch groups', e);\n this.busy.set(false);\n },\n complete: () => {\n this.busy.set(false);\n },\n });\n }\n\n selectAllUsers() {\n this.groupSelected.emit(undefined);\n }\n\n selectGroup(group: GroupObject) {\n this.groupSelected.emit(group);\n }\n\n /** Arrow keys for the roving-tabindex rows - handed to the key manager, which moves focus; the\n * `change` subscription above turns that into a selection. */\n onListKeydown(event: KeyboardEvent) {\n // The selection also moves from outside this component (a deep link, or a group created\n // elsewhere and selected straight away), so re-anchor the key manager on whatever is selected\n // now - without emitting `change` or moving focus - before letting it handle the key.\n const active = this.activeIndex();\n if (active !== this.#keyManager.activeItemIndex) {\n this.#keyManager.updateActiveItem(active);\n }\n\n this.#keyManager.onKeydown(event);\n }\n\n /** Row 0 is the pinned \"All users\" entry, 1..n are `groups()` - see `activeIndex`. */\n #selectAtIndex(index: number) {\n if (index === 0) {\n this.selectAllUsers();\n } else {\n const group = this.groups()[index - 1];\n if (group) this.selectGroup(group);\n }\n }\n\n getGroupRowActions(group: GroupObject): OverflowMenuItem[] {\n return [\n {\n id: 'yuv.app.groups.action.edit',\n icon: APP_ICONS.actionEditGroup,\n label: this.#translateService.instant('yuv.app.user-management.groups.action.edit.label'),\n callback: () => this.editGroup(group),\n },\n {\n id: 'yuv.app.groups.action.addMembers',\n icon: APP_ICONS.actionAddGroupMembers,\n label: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.addMembers.label'\n ),\n callback: () => this.addMembersRequested.emit(group),\n },\n {\n id: 'yuv.app.groups.action.delete',\n icon: APP_ICONS.actionDeleteGroup,\n label: this.#translateService.instant('yuv.app.user-management.groups.action.delete.label'),\n callback: () => this.deleteGroup(group),\n },\n ];\n }\n\n /** Edits any row's group - fetches its full details fresh rather than relying on already-loaded rail data. */\n editGroup(group: GroupObject) {\n this.#logger.debug(`Edit group with id '${group.id}'...`);\n\n this.#userManagementService.getGroupDetails(group.id).subscribe({\n next: (groupDetails) => {\n this.#dialog\n .open(EditGroupComponent, {\n ...EditGroupComponent.DIALOG_CONFIG,\n data: { group: groupDetails },\n })\n .afterClosed()\n .subscribe((editedGroup: GroupDetailsObject | undefined) => {\n if (editedGroup) {\n this.#logger.debug('Group edited with ID: ' + editedGroup.id);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.edit.success',\n { name: group.name }\n )\n );\n\n this.refresh();\n this.groupUpdated.emit(editedGroup);\n }\n });\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to load details for group with id '${group.id}'`, e);\n },\n });\n }\n\n deleteGroup(group: GroupObject) {\n this.#logger.debug(`Delete group with id '${group.id}'...`);\n\n this.#userManagementService.deleteGroup(group).subscribe({\n next: (result: boolean) => {\n if (result) {\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.groups.action.delete.success', {\n name: group.name,\n })\n );\n this.refresh();\n this.groupDeleted.emit(group.id);\n }\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to delete group with id '${group.id}'`, e);\n this.#notificationService.error(\n this.#translateService.instant('yuv.app.user-management.groups.action.delete.error', {\n name: group.name,\n })\n );\n },\n });\n }\n}\n","@let railTitle = 'yuv.app.user-management.label.rail.title' | translate;\n<ymt-pane\n [busy]=\"busy()\"\n [topBarActions]=\"topBarActions\"\n role=\"region\"\n [attr.aria-label]=\"railTitle\"\n>\n <ymt-pane-header\n [icon]=\"'groups'\"\n [title]=\"railTitle\"\n [subtitle]=\"\n 'yuv.app.user-management.label.rail.subtitle' | translate : { count: groups().length }\n \"\n ></ymt-pane-header>\n <ymt-pane-body>\n <div\n class=\"groups-list\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.aria-label]=\"railTitle\"\n (keydown)=\"onListKeydown($event)\"\n >\n <div\n ymusrmgmt-focusable-row\n class=\"group-item\"\n role=\"option\"\n [attr.aria-selected]=\"!selectedGroupId()\"\n [class.active]=\"!selectedGroupId()\"\n [attr.tabindex]=\"activeIndex() === 0 ? 0 : -1\"\n (click)=\"selectAllUsers()\"\n (keydown.enter)=\"selectAllUsers()\"\n (keydown.space)=\"$event.preventDefault(); selectAllUsers()\"\n >\n <span class=\"group-icon\"><mat-icon>family_group</mat-icon></span>\n <span class=\"group-name\">{{\n 'yuv.app.user-management.label.rail.usersEntry' | translate\n }}</span>\n </div>\n\n <div class=\"groups-divider\"></div>\n\n @for (group of groups(); track group.id; let i = $index) {\n <div\n ymusrmgmt-focusable-row\n class=\"group-item\"\n role=\"option\"\n [attr.aria-selected]=\"selectedGroupId() === group.id\"\n [class.active]=\"selectedGroupId() === group.id\"\n [attr.tabindex]=\"activeIndex() === i + 1 ? 0 : -1\"\n [matTooltip]=\"group.description || ''\"\n (click)=\"selectGroup(group)\"\n (keydown.enter)=\"selectGroup(group)\"\n (keydown.space)=\"$event.preventDefault(); selectGroup(group)\"\n >\n <span class=\"group-icon\"><mat-icon>group</mat-icon></span>\n <span class=\"group-name\">{{ group.name }}</span>\n <button\n mat-icon-button\n class=\"group-actions\"\n [matMenuTriggerFor]=\"groupRowMenu\"\n [matMenuTriggerData]=\"{ group: group }\"\n [matTooltip]=\"'yuv.app.user-management.common.action.more.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.more.label' | translate\"\n [tabIndex]=\"activeIndex() === i + 1 ? 0 : -1\"\n (click)=\"$event.stopPropagation(); selectGroup(group)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n }\n </div>\n </ymt-pane-body>\n</ymt-pane>\n\n<mat-menu #groupRowMenu=\"matMenu\">\n <ng-template matMenuContent let-group=\"group\">\n @for (action of getGroupRowActions(group); track action.id) {\n <button mat-menu-item [disabled]=\"action.disabled\" (click)=\"action.callback?.(action)\">\n <mat-icon>{{ action.icon }}</mat-icon>\n <span>{{ action.label }}</span>\n </button>\n }\n </ng-template>\n</mat-menu>\n","import { Component, input, output } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\n\n/**\n * A small icon button for a `ymt-pane`'s top bar that hides or toggles a sibling area (e.g. in a\n * `yuv-split-view`). Rotates its icon 180° when `rotated` is set, so a single icon (e.g.\n * `left_panel_close`) can indicate both directions of a toggle.\n */\n@Component({\n selector: 'ymusrmgmt-pane-toggle-button',\n standalone: true,\n imports: [MatIconModule, MatTooltipModule, YmtIconButtonDirective],\n templateUrl: './pane-toggle-button.component.html',\n styleUrl: './pane-toggle-button.component.scss',\n})\nexport class PaneToggleButtonComponent {\n icon = input.required<string>();\n tooltip = input.required<string>();\n rotated = input<boolean>(false);\n toggled = output<void>();\n}\n","<button\n ymtIconButton\n icon-button-size=\"small\"\n [style.transform]=\"rotated() ? 'rotate(180deg)' : null\"\n [matTooltip]=\"tooltip()\"\n [attr.aria-label]=\"tooltip()\"\n (click)=\"toggled.emit()\"\n>\n <mat-icon>{{ icon() }}</mat-icon>\n</button>\n","import { Component, input, output } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\n\n/**\n * The narrow icon+label strip a `yuv-split-view` area collapses to instead of disappearing\n * entirely (`hideArea()`/`showArea()` still drive the actual split-view visibility - this is\n * just the \"way back in\" rendered as a sibling of the split-view while an area is hidden).\n *\n * The gutter div is the whole interactive target (click, Enter, Space all expand it) - the inner\n * icon is `aria-hidden` and has no click handler of its own, so it's purely decorative rather\n * than a second, independently-focusable interactive control.\n */\n@Component({\n selector: 'ymusrmgmt-pane-gutter',\n standalone: true,\n imports: [MatIconModule, MatTooltipModule, YmtPanesModule],\n templateUrl: './pane-gutter.component.html',\n styleUrl: './pane-gutter.component.scss',\n})\nexport class PaneGutterComponent {\n icon = input.required<string>();\n label = input.required<string>();\n tooltip = input.required<string>();\n /** Flips the label to read bottom-to-top (`vertical-rl` reads top-to-bottom by default) - for a\n * gutter whose collapsed pane sits to the left, so the label flows outward toward that edge. */\n flipLabel = input<boolean>(false);\n expand = output<void>();\n}\n","<ymt-pane>\n <ymt-pane-body>\n <div\n class=\"pane-gutter\"\n role=\"button\"\n tabindex=\"0\"\n [matTooltip]=\"tooltip()\"\n [attr.aria-label]=\"tooltip()\"\n (click)=\"expand.emit()\"\n (keydown.enter)=\"expand.emit()\"\n (keydown.space)=\"$event.preventDefault(); expand.emit()\"\n >\n <mat-icon class=\"icon\" aria-hidden=\"true\">{{ icon() }}</mat-icon>\n <span class=\"label\" [class.label--btt]=\"flipLabel()\">{{ label() }}</span>\n </div>\n </ymt-pane-body>\n</ymt-pane>\n","import { UserObject } from './user-management.schema';\n\n/** Initials shown on a user's avatar - falls back to the first two letters of the username if no name is set. */\nexport function getInitials(user: UserObject): string {\n const initials = `${user.firstName?.trim()?.charAt(0) ?? ''}${\n user.lastName?.trim()?.charAt(0) ?? ''\n }`.toUpperCase();\n return initials || user.username?.slice(0, 2).toUpperCase() || '?';\n}\n\n/**\n * Deterministic avatar color derived from the user's id (or username as fallback) - the same user\n * always gets the same color across renders of the users table.\n */\nexport function getAvatarColor(user: UserObject): { background: string; color: string } {\n const hue = hashString(user.id || user.username) % 360;\n return {\n background: `hsl(${hue}, 46%, 90%)`,\n color: `hsl(${hue}, 45%, 32%)`,\n };\n}\n\nfunction hashString(value: string): number {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n hash = (hash * 31 + value.charCodeAt(i)) >>> 0;\n }\n return hash;\n}\n","import { Component, computed, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { TranslatePipe } from '@yuuvis/client-core';\n\nimport { APP_ICONS, UserObject } from '../../user-management.schema';\nimport { getAvatarColor, getInitials } from '../../avatar';\n\n/**\n * Shared avatar anatomy for a user - initials on a deterministic per-user color, plus corner\n * badges for \"disabled\" and (optionally) \"externally managed\" state. Used by both the main user\n * table and the add-members dialog's search-result/selected-users rows.\n */\n@Component({\n selector: 'ymusrmgmt-user-avatar',\n standalone: true,\n imports: [MatIconModule, MatTooltipModule, TranslatePipe],\n templateUrl: './user-avatar.component.html',\n styleUrl: './user-avatar.component.scss',\n})\nexport class UserAvatarComponent {\n user = input.required<UserObject>();\n /** Whether to show either corner badge (disabled/externally-managed) at all - both are gated\n * by this one flag rather than having a separate toggle per badge. */\n showBadges = input(true);\n\n readonly icons = APP_ICONS;\n\n /** Memoized rather than called directly in the template - both hash a string and allocate a\n * fresh object/do string work, and this component is instantiated once per row, so re-running\n * them on every change-detection pass (not just when `user()` changes) would be wasted work. */\n readonly avatarColor = computed(() => getAvatarColor(this.user()));\n readonly initials = computed(() => getInitials(this.user()));\n}\n","<div\n class=\"user-avatar\"\n [class.is-disabled]=\"!user().enabled\"\n [style.background]=\"avatarColor().background\"\n [style.color]=\"avatarColor().color\"\n>\n <span>{{ initials() }}</span>\n @if (showBadges() && !user().enabled) { @let disabledLabel =\n 'yuv.app.user-management.users.property.disabled' | translate;\n <span\n class=\"avatar-disabled-badge\"\n [matTooltip]=\"disabledLabel\"\n [attr.aria-label]=\"disabledLabel\"\n >\n <mat-icon aria-hidden=\"true\">{{ icons.stateInactive }}</mat-icon>\n </span>\n } @if (showBadges() && user().externallyManaged) { @let externalLabel =\n 'yuv.app.user-management.users.label.identitySource.external.tooltip' | translate;\n <span class=\"avatar-source-badge\" [matTooltip]=\"externalLabel\" [attr.aria-label]=\"externalLabel\">\n <mat-icon aria-hidden=\"true\">{{ icons.sourceExternal }}</mat-icon>\n </span>\n }\n</div>\n","import { Component, inject, output, ViewEncapsulation } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { TranslatePipe, TranslateService } from '@yuuvis/client-core';\n\nimport { APP_ICONS } from '../../user-management.schema';\n\n@Component({\n selector: 'ymusrmgmt-global-add-button',\n standalone: true,\n imports: [TranslatePipe, MatButtonModule, MatIconModule, MatMenuModule, MatTooltipModule],\n templateUrl: './global-add-button.component.html',\n styleUrl: './global-add-button.component.scss',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'ymusrmgmt-global-add',\n },\n})\nexport class GlobalAddButtonComponent {\n readonly #translateService = inject(TranslateService);\n\n createUser = output<void>();\n createGroup = output<void>();\n\n menuItems = [\n {\n icon: APP_ICONS.actionCreateNewUser,\n label: this.#translateService.instant('yuv.app.user-management.users.action.create.label'),\n action: () => this.createUser.emit(),\n },\n {\n icon: APP_ICONS.actionCreateNewGroup,\n label: this.#translateService.instant('yuv.app.user-management.groups.action.create.label'),\n action: () => this.createGroup.emit(),\n },\n ];\n}\n","<button\n mat-mini-fab\n [matTooltip]=\"'yuv.app.user-management.common.action.add.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.add.label' | translate\"\n [matMenuTriggerFor]=\"menu\"\n>\n <mat-icon>add</mat-icon>\n</button>\n<mat-menu #menu=\"matMenu\" class=\"global-add-button-menu\">\n @for (item of menuItems; track item.label) {\n <button mat-menu-item (click)=\"item.action()\">\n <mat-icon>{{ item.icon }}</mat-icon>\n <span>{{ item.label }}</span>\n </button>\n }\n</mat-menu>\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { resolveErrorMessageKey, YuvUserManagementService } from '../../user-management.service';\nimport { UserObject } from '../../user-management.schema';\nimport { UserRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatInputModule,\n];\n\n@Component({\n selector: 'ymusrmgmt-create-user',\n templateUrl: './create-user.component.html',\n styleUrl: './create-user.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class CreateUserComponent {\n /** Shared `MatDialog.open()` config, so every call site opening this dialog stays in sync. */\n static readonly DIALOG_CONFIG: MatDialogConfig = {\n width: '600px',\n maxWidth: '90vw',\n };\n\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<CreateUserComponent, UserObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n username = new FormControl('', [\n Validators.required,\n Validators.minLength(3),\n Validators.maxLength(255),\n Validators.pattern('^[a-zA-Z0-9._-]*$'),\n ]);\n email = new FormControl('', [Validators.required, Validators.email]);\n firstname = new FormControl('', [\n Validators.minLength(1),\n Validators.maxLength(255),\n Validators.pattern('^[^#!<>&/%=;*§$()[\\\\]{}]*$'),\n ]);\n lastname = new FormControl('', [\n Validators.minLength(1),\n Validators.maxLength(255),\n Validators.pattern('^[^#!<>&/%=;*§$()[\\\\]{}]*$'),\n ]);\n\n form: FormGroup = this.#fb.group({\n username: this.username,\n email: this.email,\n firstname: this.firstname,\n lastname: this.lastname,\n });\n\n changedInput = signal<any | undefined>(undefined);\n\n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid;\n },\n });\n\n createUser() {\n let createdUserId: string;\n const createParams = this.form.value;\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const createUserRequest: UserRequest = {\n username: createParams.username,\n email: createParams.email,\n firstName: createParams.firstname ? createParams.firstname : null,\n lastName: createParams.lastname ? createParams.lastname : null,\n enabled: true,\n roles: [],\n };\n\n this.#userManagementService.createUser(createUserRequest, true).subscribe({\n error: (e: any) => {\n const errorKey = resolveErrorMessageKey(\n 'yuv.app.user-management.users.action.create',\n e.status,\n { 409: 'conflict' }\n );\n this.error.set(this.#translateService.instant(errorKey));\n this.#logger.error(`Failed to create user with username ${createUserRequest.username}`, e);\n this.busy.set(false);\n },\n next: (userId: string) => {\n createdUserId = userId;\n },\n complete: () => {\n this.busy.set(false);\n // Returns the full user (not just its id) so the caller can select it in the table\n // without a redundant fetch - the backend only echoes back the id on create.\n this.#dialogRef.close({\n id: createdUserId,\n username: createUserRequest.username,\n email: createUserRequest.email,\n firstName: createUserRequest.firstName ?? undefined,\n lastName: createUserRequest.lastName ?? undefined,\n enabled: createUserRequest.enabled,\n });\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n}\n","<yuv-dialog\n class=\"not-separated\"\n [yuvBusyOverlay]=\"busy()\"\n [headertitle]=\"'yuv.app.user-management.users.action.create.label' | translate\"\n>\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.username' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"username\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.username' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.email' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"email\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.email' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.firstname' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"firstname\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.firstname' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.users.property.lastname' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"lastname\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.lastname' | translate\"\n />\n </mat-form-field>\n </form>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.users.action.button.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createUser()\">\n {{ 'yuv.app.user-management.users.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { resolveErrorMessageKey, YuvUserManagementService } from '../../user-management.service';\nimport { GroupObject } from '../../user-management.schema';\nimport { GroupRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\nimport { RolesSelectionComponent } from '../../components/roles-selection/roles-selection.component';\n\nconst components = [\n BusyOverlayDirective,\n YmtButtonDirective,\n DialogComponent,\n RolesSelectionComponent,\n];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatSlideToggleModule,\n MatInputModule,\n];\n\n@Component({\n selector: 'ymusrmgmt-create-group',\n templateUrl: './create-group.component.html',\n styleUrl: './create-group.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class CreateGroupComponent {\n /** Shared `MatDialog.open()` config, so every call site opening this dialog stays in sync. */\n static readonly DIALOG_CONFIG: MatDialogConfig = {\n width: '600px',\n maxWidth: '90vw',\n };\n\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<CreateGroupComponent, GroupObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n allAvailableRoles = signal<string[]>([]);\n\n groupRoles = signal<string[]>([]);\n\n name = new FormControl('', [\n Validators.required,\n Validators.minLength(3),\n Validators.maxLength(255),\n Validators.pattern('^[a-zA-Z0-9._-]*$'),\n ]);\n description = new FormControl('');\n roles = new FormControl<string[]>([]);\n\n form: FormGroup = this.#fb.group({\n name: this.name,\n description: this.description,\n roles: this.roles,\n });\n\n changedInput = signal<any | undefined>(undefined);\n\n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid;\n },\n });\n\n constructor() {\n this.#userManagementService.fetchAllRoles().subscribe({\n next: (roles) => {\n this.allAvailableRoles.set(roles);\n },\n error: (e) => {\n this.#logger.error('Failed to fetch roles', e);\n },\n });\n }\n\n createGroup() {\n let createdGroupId: string;\n const createParams = this.form.value;\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const createGroupRequest: GroupRequest = {\n name: createParams.name,\n description: createParams.description,\n roles: createParams.roles,\n };\n\n this.#userManagementService.createGroup(createGroupRequest).subscribe({\n error: (e: any) => {\n const errorKey = resolveErrorMessageKey(\n 'yuv.app.user-management.groups.action.create',\n e.status\n );\n this.error.set(this.#translateService.instant(errorKey));\n this.#logger.error(`Failed to create group with name ${createGroupRequest.name}`, e);\n this.busy.set(false);\n },\n next: (groupId: string) => {\n createdGroupId = groupId;\n },\n complete: () => {\n this.busy.set(false);\n // Returns the full group (not just its id) so the caller can select it in the rail\n // without a redundant fetch - the backend only echoes back the id on create.\n this.#dialogRef.close({\n id: createdGroupId,\n name: createGroupRequest.name,\n description: createGroupRequest.description,\n });\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n\n onRolesChange(roles: string[]) {\n this.groupRoles.set(roles);\n this.form.patchValue({ roles: roles });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n}\n","<yuv-dialog\n class=\"not-separated\"\n [yuvBusyOverlay]=\"busy()\"\n [headertitle]=\"'yuv.app.user-management.groups.action.create.label' | translate\"\n>\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.groups.property.name' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"name\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.groups.property.name' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\n 'yuv.app.user-management.groups.property.description' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"description\"\n type=\"text\"\n [attr.aria-label]=\"'yuv.app.user-management.groups.property.description' | translate\"\n />\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\"\n >\n </ymusrmgmt-role-selection>\n </div>\n </form>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.groups.action.button.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createGroup()\">\n {{ 'yuv.app.user-management.groups.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { ClipboardModule } from '@angular/cdk/clipboard';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { catchError, forkJoin, Observable, of, throwError } from 'rxjs';\nimport {\n Logger,\n NotificationService,\n TabGuardDirective,\n TranslatePipe,\n TranslateService,\n} from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { resolveErrorMessageKey, YuvUserManagementService } from '../../user-management.service';\nimport { IdentityProviderSetupInfo, OIDCProviderConfig } from '../../user-management.schema';\n\nconst components = [BusyOverlayDirective, YmtButtonDirective, DialogComponent, TabGuardDirective];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n ClipboardModule,\n MatButtonModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatTabsModule,\n MatTooltipModule,\n];\n\n/** Placeholder shown in the client secret field of an already configured provider; the backend never returns the real secret. */\nconst FAKE_CLIENT_SECRET = '••••••••••••••••';\n\ninterface LoadResult {\n provider: OIDCProviderConfig | null;\n setupInfo: IdentityProviderSetupInfo;\n}\n\n@Component({\n selector: 'ymusrmgmt-settings',\n templateUrl: './settings.component.html',\n styleUrl: './settings.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class SettingsComponent {\n /** Shared `MatDialog.open()` config, so every call site opening this dialog stays in sync. */\n static readonly DIALOG_CONFIG: MatDialogConfig = {\n width: '600px',\n maxWidth: '90vw'\n };\n\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<SettingsComponent>);\n readonly #translateService = inject(TranslateService);\n readonly #notificationService = inject(NotificationService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(true);\n\n error = signal<string | undefined>(undefined);\n\n /** True if the tenant has no OIDC identity provider configured (backend responds with 404). */\n notConfigured = signal<boolean>(false);\n\n /** True once the user has asked to add a provider from the empty-state hint, revealing the blank setup form. */\n addStarted = signal<boolean>(false);\n\n /** The form (blank, for first setup, or pre-filled, for editing) is showing - authentication tab only. */\n showForm = computed(() => this.addStarted() || !!this.provider());\n\n provider = signal<OIDCProviderConfig | undefined>(undefined);\n\n /** Tenant-specific values needed to configure an external identity provider - available regardless of `provider()`. */\n setupInfo = signal<IdentityProviderSetupInfo | undefined>(undefined);\n\n redirectUri = computed(() => this.setupInfo()?.redirectUri);\n\n /** Null if the tenant has no SCIM client provisioned - shown as an \"unavailable\" hint in the provisioning tab. */\n scimProvisioning = computed(() => this.setupInfo()?.scimProvisioning);\n\n tenantUrl = computed(() => this.scimProvisioning()?.tenantUrl);\n\n displayName = new FormControl('', [Validators.required]);\n discoveryUrl = new FormControl('', [Validators.required]);\n clientId = new FormControl('', [Validators.required]);\n clientSecret = new FormControl('', [Validators.required]);\n\n form: FormGroup = this.#fb.group({\n displayName: this.displayName,\n discoveryUrl: this.discoveryUrl,\n clientId: this.clientId,\n clientSecret: this.clientSecret,\n });\n\n /**\n * Guards both the save button and `configure()` itself: the form must be valid, and editing an\n * already-configured provider additionally requires at least one field to be dirty (nothing to\n * save otherwise). On first setup, `clientSecret` starts blank and required, so `form.invalid`\n * alone already gates it. A plain method, not a `computed()`: `FormGroup.invalid`/`.dirty` aren't\n * signals, so a computed reading them would never be invalidated after its first evaluation.\n */\n disabledSubmit(): boolean {\n return this.busy() || this.form.invalid || (!!this.provider() && !this.form.dirty);\n }\n\n constructor() {\n this.#reload();\n }\n\n /**\n * Fetches the OIDC identity provider configuration (null if none is configured, a 404) and the\n * tenant's setup info (redirect URI, SCIM provisioning) in parallel - the latter is available\n * independent of whether a provider is configured, so both tabs can always render.\n */\n #load(): Observable<LoadResult> {\n this.busy.set(true);\n this.error.set(undefined);\n return forkJoin({\n provider: this.#userManagementService.fetchOIDCProviderConfig().pipe(\n catchError((e) => (e.status === 404 ? of(null) : throwError(() => e)))\n ),\n setupInfo: this.#userManagementService.fetchIdentityProviderSetupInfo(),\n });\n }\n\n /** Runs `#load()` and applies its result, optionally continuing on success - used for the initial load and after first-time setup. */\n #reload(onLoaded?: () => void) {\n this.#load().subscribe({\n next: ({ provider, setupInfo }) => {\n this.#applyLoadResult(provider, setupInfo);\n onLoaded?.();\n },\n error: (e) => this.#handleLoadError(e),\n });\n }\n\n #applyLoadResult(provider: OIDCProviderConfig | null, setupInfo: IdentityProviderSetupInfo) {\n this.setupInfo.set(setupInfo);\n if (provider) {\n this.provider.set(provider);\n this.notConfigured.set(false);\n this.addStarted.set(false);\n this.#populateForm(provider);\n } else {\n this.provider.set(undefined);\n this.notConfigured.set(true);\n }\n this.busy.set(false);\n }\n\n #handleLoadError(e: any) {\n const errorKey = resolveErrorMessageKey('yuv.app.user-management.settings.oidc.label', e.status);\n this.error.set(this.#translateService.instant(errorKey));\n this.#logger.error('Failed to load identity provider settings', e);\n this.busy.set(false);\n }\n\n /**\n * Fills the form, pristine, from an already-configured provider - or blanks it when called\n * without one, e.g. for a fresh \"add\". The client secret is never returned by the backend, so an\n * existing provider gets the placeholder instead, and re-typing it (marking it dirty) is what\n * unlocks saving again: since the backend takes a full replacement on every save, editing any of\n * the other fields still requires the real secret to be supplied alongside them.\n */\n #populateForm(provider?: OIDCProviderConfig) {\n this.displayName.setValue(provider?.displayName ?? '');\n this.discoveryUrl.setValue(provider?.config?.['metadataDescriptorUrl'] ?? '');\n this.clientId.setValue(provider?.config?.['clientId'] ?? '');\n this.clientSecret.setValue(provider ? FAKE_CLIENT_SECRET : '');\n this.form.markAsPristine();\n }\n\n /** Reveals the blank setup form from the empty-state hint. */\n startAdd() {\n this.#populateForm();\n this.addStarted.set(true);\n }\n\n /**\n * Submits the form to `setOIDCProviderConfig` - both the very first setup and every later edit\n * of an already-configured provider go through this same call. `clientSecret` is only included\n * in the request when re-typed (dirty) - left out otherwise, so the backend keeps the existing\n * secret rather than overwriting it with the placeholder text.\n */\n configure() {\n if (this.disabledSubmit()) return;\n const isFirstSetup = !this.provider();\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const config: Record<string, string> = {\n // The discovery URL must be sent as `metadataDescriptorUrl` — the backend resolves the\n // OIDC endpoints (authorizationUrl, tokenUrl, jwksUrl, ...) from the discovery document.\n metadataDescriptorUrl: this.discoveryUrl.value?.trim() ?? '',\n clientId: this.clientId.value?.trim() ?? '',\n defaultScope: 'openid profile',\n };\n if (isFirstSetup || this.clientSecret.dirty) {\n config['clientSecret'] = this.clientSecret.value ?? '';\n }\n\n const providerConfig: OIDCProviderConfig = {\n displayName: this.displayName.value?.trim() ?? '',\n config,\n };\n\n this.#userManagementService.setOIDCProviderConfig(providerConfig).subscribe({\n next: () => {\n const notifySuccess = () =>\n this.#notificationService.success(\n this.#translateService.instant(\n isFirstSetup\n ? 'yuv.app.user-management.settings.oidc.action.configure.success'\n : 'yuv.app.user-management.settings.oidc.action.update.success'\n )\n );\n\n if (isFirstSetup) {\n // First-time setup may newly link the SCIM extension, so setup-info needs a full\n // re-fetch too; re-use `#reload()` rather than duplicating its subscribe logic.\n this.#reload(notifySuccess);\n } else {\n // A later edit only ever changes the provider itself - setup-info stays the same.\n this.#userManagementService.fetchOIDCProviderConfig().subscribe({\n next: (provider) => {\n this.#applyLoadResult(provider, this.setupInfo() as IdentityProviderSetupInfo);\n notifySuccess();\n },\n error: (e) => this.#handleLoadError(e),\n });\n }\n },\n error: (e) => {\n // 422: the backend could not resolve the OIDC endpoints from the discovery URL\n this.error.set(\n this.#translateService.instant(\n e.status === 422\n ? 'yuv.app.user-management.settings.oidc.action.configure.error.discovery'\n : 'yuv.app.user-management.settings.oidc.action.configure.error.unknown'\n )\n );\n this.#logger.error('Failed to configure OIDC identity provider', e);\n this.busy.set(false);\n },\n });\n }\n\n /**\n * Asks the user to confirm, then reverts (deletes) the OIDC identity provider configuration -\n * the dialog stays open, falling back to the empty state. Only the setup info needs a re-fetch\n * (deleting unlinks the SCIM provisioning extension, so it may have changed) - the provider is\n * already known gone, so re-fetching it too would just be a second round trip for a 404.\n */\n revert() {\n this.#userManagementService.deleteOIDCProviderConfig().subscribe({\n next: (deleted) => {\n if (!deleted) return;\n\n this.#userManagementService.fetchIdentityProviderSetupInfo().subscribe({\n next: (setupInfo) => {\n this.#applyLoadResult(null, setupInfo);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.settings.oidc.action.reset.success'\n )\n );\n },\n error: (e) => this.#handleLoadError(e),\n });\n },\n error: (e) => {\n this.#notificationService.error(\n this.#translateService.instant(\n 'yuv.app.user-management.settings.oidc.action.reset.error'\n )\n );\n this.#logger.error('Failed to reset OIDC identity provider configuration', e);\n },\n });\n }\n\n /** Handles the `cdkCopyToClipboardCopied` output, which reports whether the copy succeeded. */\n onCopied(success: boolean) {\n if (success) {\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.copy.success')\n );\n } else {\n this.#notificationService.error(\n this.#translateService.instant('yuv.app.user-management.settings.oidc.action.copy.error')\n );\n }\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog\n class=\"not-separated\"\n [yuvBusyOverlay]=\"busy()\"\n [headertitle]=\"'yuv.app.user-management.settings.label.dialog.title' | translate\"\n>\n <main class=\"yuv-dialog-content\">\n <ng-template\n #editableField\n let-labelKey=\"labelKey\"\n let-control=\"control\"\n let-type=\"type\"\n let-placeholder=\"placeholder\"\n let-autocomplete=\"autocomplete\"\n >\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ labelKey | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"control\"\n [type]=\"type || 'text'\"\n [placeholder]=\"placeholder || ''\"\n [autocomplete]=\"autocomplete || 'off'\"\n [attr.aria-label]=\"labelKey | translate\"\n />\n </mat-form-field>\n </ng-template>\n <ng-template\n #readonlyField\n let-labelKey=\"labelKey\"\n let-value=\"value\"\n let-type=\"type\"\n let-copyable=\"copyable\"\n >\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ labelKey | translate }}</mat-label>\n <input\n matInput\n readonly\n [type]=\"type || 'text'\"\n [attr.tabindex]=\"-1\"\n [value]=\"value || '—'\"\n [attr.aria-label]=\"labelKey | translate\"\n />\n @if (copyable && value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n </ng-template>\n\n @if (!showForm()) {\n <div class=\"empty-state\">\n <mat-icon class=\"empty-state-icon\" aria-hidden=\"true\">admin_panel_settings</mat-icon>\n <p class=\"empty-state-title\">\n {{ 'yuv.app.user-management.settings.oidc.label.notConfigured' | translate }}\n </p>\n <p class=\"empty-state-description\">\n {{ 'yuv.app.user-management.settings.oidc.label.setup.description' | translate }}\n </p>\n <button ymtButton=\"primary\" type=\"button\" (click)=\"startAdd()\">\n {{ 'yuv.app.user-management.settings.oidc.action.setup.label' | translate }}\n </button>\n </div>\n } @else {\n <mat-tab-group yuvTabGuardDisable>\n <mat-tab [label]=\"'yuv.app.user-management.settings.oidc.tab.authentication' | translate\">\n <p class=\"hint\">\n {{ 'yuv.app.user-management.settings.oidc.label.setup.hint' | translate }}\n </p>\n <form [formGroup]=\"form\">\n <ng-container\n *ngTemplateOutlet=\"\n editableField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.property.displayName',\n control: displayName,\n placeholder: 'e.g. Microsoft Entra ID'\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n editableField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.property.discoveryUrl',\n control: discoveryUrl,\n placeholder:\n 'e.g. https://login.microsoftonline.com/<entra-tenant-id>/v2.0/.well-known/openid-configuration'\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n editableField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.property.clientId',\n control: clientId,\n placeholder: 'e.g. yuuvis'\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n editableField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.property.clientSecret',\n control: clientSecret,\n type: 'password',\n autocomplete: 'new-password'\n }\n \"\n ></ng-container>\n @if (redirectUri(); as uri) {\n <hr class=\"divider\" />\n <p class=\"hint\">\n {{ 'yuv.app.user-management.settings.oidc.property.redirectUri.hint' | translate }}\n </p>\n <ng-container\n *ngTemplateOutlet=\"\n readonlyField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.property.redirectUri',\n value: uri,\n copyable: true\n }\n \"\n ></ng-container>\n }\n </form>\n </mat-tab>\n <mat-tab\n [label]=\"'yuv.app.user-management.settings.oidc.label.section.provisioning' | translate\"\n >\n @if (scimProvisioning(); as scimProvisioning) { @if (provider(); as oidcProvider) {\n <p class=\"hint\">\n {{\n 'yuv.app.user-management.settings.oidc.label.provisioning.hint'\n | translate : { provider: oidcProvider.displayName }\n }}\n </p>\n }\n <ng-container\n *ngTemplateOutlet=\"\n readonlyField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.provisioning.property.tenantUrl',\n value: tenantUrl(),\n copyable: true\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n readonlyField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.provisioning.property.tokenUrl',\n value: scimProvisioning.tokenEndpoint,\n copyable: true\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n readonlyField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.provisioning.property.clientName',\n value: scimProvisioning.clientId,\n copyable: true\n }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n readonlyField;\n context: {\n labelKey: 'yuv.app.user-management.settings.oidc.provisioning.property.clientSecret',\n value: scimProvisioning.clientSecret,\n type: 'password',\n copyable: true\n }\n \"\n ></ng-container>\n } @else {\n <p class=\"hint\">\n {{ 'yuv.app.user-management.settings.oidc.label.provisioning.unavailable' | translate }}\n </p>\n }\n </mat-tab>\n </mat-tab-group>\n } @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n @if (provider()) {\n <!--\n `ymt-button--danger` is added explicitly (not just relying on `ymtButton=\"danger\"`):\n YmtButtonDirective has a bug where its own dynamically-added `ymt-button--danger` class gets\n wiped when it creates the underlying MatButton (which overwrites the host's `class`\n attribute) and never restored, since the directive's `ngOnInit` snapshots \"classes to\n restore\" before adding it. A class already present in the template survives that wipe, so\n this is what actually makes the button render with danger colors. Don't remove it as a\n seeming duplicate.\n -->\n <button\n ymtButton=\"danger\"\n class=\"ymt-button--danger footer-start\"\n [disabled]=\"busy()\"\n (click)=\"revert()\"\n >\n <mat-icon>reset_wrench</mat-icon>\n {{ 'yuv.app.user-management.settings.oidc.action.reset.label' | translate }}\n </button>\n }\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.settings.action.button.cancel' | translate }}\n </button>\n @if (showForm()) {\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"configure()\">\n {{ 'yuv.app.user-management.settings.oidc.action.save.label' | translate }}\n </button>\n }\n </footer>\n</yuv-dialog>\n","import { Directive, ElementRef, inject, signal } from '@angular/core';\nimport { Highlightable } from '@angular/cdk/a11y';\n\n/**\n * Marks an element as one option of a listbox whose keystrokes arrive somewhere else - so CDK's\n * `ActiveDescendantKeyManager` can move a highlight through them while real DOM focus stays put.\n *\n * That is the `aria-activedescendant` pattern, and it's what a combobox needs: the user keeps\n * typing in the input while Up/Down move the highlighted suggestion. Contrast\n * `FocusableRowDirective`, which is for lists that take focus onto the row itself.\n *\n * The highlight is exposed as `active` (and as an `.active` class on the host), so a caller\n * declares this directive, binds `aria-selected` from it, and points the input's\n * `aria-activedescendant` at `activeOptionId`. `aria-selected` is deliberately left to the call\n * site rather than host-bound here: it keeps the option's ARIA visible in the template where it\n * gets reviewed - and `@angular-eslint`'s `role-has-required-aria` can only see it there.\n */\n@Directive({\n selector: '[ymusrmgmt-highlightable-option]',\n standalone: true,\n exportAs: 'ymusrmgmtHighlightableOption',\n host: {\n '[class.active]': 'active()',\n },\n})\nexport class HighlightableOptionDirective implements Highlightable {\n readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Whether the key manager currently has this option highlighted. */\n readonly active = signal(false);\n\n /** This option's element id - what the input's `aria-activedescendant` has to point at. */\n get elementId(): string {\n return this.#elementRef.nativeElement.id;\n }\n\n setActiveStyles() {\n this.active.set(true);\n // Nothing scrolls this into view on its own: focus never leaves the input, so the browser has\n // no reason to. Without it, arrowing past the bottom of the list would highlight options the\n // user can no longer see - and Enter would add one of them.\n this.#elementRef.nativeElement.scrollIntoView({ block: 'nearest' });\n }\n\n setInactiveStyles() {\n this.active.set(false);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n Inject,\n inject,\n Injector,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n catchError,\n debounceTime,\n distinctUntilChanged,\n forkJoin,\n map,\n of,\n startWith,\n switchMap,\n} from 'rxjs';\n\nimport { Logger, TranslatePipe } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { YmtBadge } from '@yuuvis/material/badge';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { YuvUserManagementService } from '../../user-management.service';\nimport { GroupObject, UserObject } from '../../user-management.schema';\nimport { aggregateAllPages } from '../../paged-response';\nimport { UserAvatarComponent } from '../../components/user-avatar/user-avatar.component';\nimport { HighlightableOptionDirective } from '../../directives/highlightable-option.directive';\n\nexport interface AddGroupMembersResult {\n addedCount: number;\n failedCount: number;\n}\n\nconst components = [\n BusyOverlayDirective,\n YmtButtonDirective,\n DialogComponent,\n YmtBadge,\n UserAvatarComponent,\n HighlightableOptionDirective,\n];\n\nconst modules = [CommonModule, ReactiveFormsModule, TranslatePipe, MatIconModule, MatTooltipModule];\n\n@Component({\n selector: 'ymusrmgmt-add-group-members',\n templateUrl: './add-group-members.component.html',\n styleUrl: './add-group-members.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class AddGroupMembersComponent {\n /** Shared `MatDialog.open()` config, so every call site opening this dialog stays in sync. */\n static readonly DIALOG_CONFIG: MatDialogConfig = {\n width: '800px',\n maxWidth: '90vw',\n height: '65vh',\n };\n\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<AddGroupMembersComponent, AddGroupMembersResult>);\n readonly #logger = inject(Logger);\n readonly #injector = inject(Injector);\n\n busy = signal<boolean>(false);\n\n searchControl = new FormControl('');\n\n /** Every current member's id, so search results can exclude users already in the group. */\n currentMemberIds = signal<Set<string>>(new Set());\n\n /** The term the current searchResults() were fetched for - lets the empty-state message tell\n * \"no term entered yet\" apart from \"this term matched nothing\". */\n searchTerm = signal<string>('');\n searchResults = signal<UserObject[]>([]);\n /** Accumulates picks across searches (dedup by id) - selecting a user moves them out of the\n * search results and into this list, shown as removable rows in the right-hand column. */\n selectedUsers = signal<UserObject[]>([]);\n\n candidateResults = computed(() => {\n const selectedIds = new Set(this.selectedUsers().map((u) => u.id));\n return this.searchResults().filter(\n (u) => !this.currentMemberIds().has(u.id) && !selectedIds.has(u.id)\n );\n });\n\n /** One per rendered candidate row, in `candidateResults()` order. */\n private readonly candidateOptions = viewChildren(HighlightableOptionDirective);\n\n /** Moves the highlighted candidate while focus stays in the search input - the\n * `aria-activedescendant` pattern, see `HighlightableOptionDirective`. Built from the\n * `viewChildren` signal directly, so it follows the candidates as the search results change;\n * that's what the `Injector` is for. */\n readonly #keyManager = new ActiveDescendantKeyManager(this.candidateOptions, this.#injector);\n\n /** The highlighted option's element id, for the input's `aria-activedescendant`. Derived from the\n * options themselves rather than tracked alongside the key manager, so the two can't disagree. */\n readonly activeOptionId = computed(\n () => this.candidateOptions().find((option) => option.active())?.elementId\n );\n\n disabledSubmit = computed(() => this.busy() || this.selectedUsers().length === 0);\n\n constructor(@Inject(MAT_DIALOG_DATA) public data: { group: GroupObject }) {\n // Highlight the first candidate whenever the rendered set changes - a new search, or one\n // fewer row because the user just picked it. Keyed on the rendered options rather than on\n // `candidateResults()` so the key manager only ever sees rows that exist; arrow navigation\n // doesn't change them, so it never clobbers the user's position.\n effect(() => {\n if (this.candidateOptions().length > 0) {\n this.#keyManager.setActiveItem(0);\n }\n });\n\n // Best-effort: used only to filter existing members out of search results - if this fails,\n // just don't filter (a redundant add is a harmless no-op), so only log, don't block.\n aggregateAllPages((page) =>\n this.#userManagementService.fetchGroupMembers(\n this.data.group.id,\n page,\n YuvUserManagementService.AGGREGATE_PAGE_SIZE\n )\n ).subscribe({\n next: (members) => this.currentMemberIds.set(new Set(members.map((m) => m.id))),\n error: (e) =>\n this.#logger.error(`Failed to load members of group '${this.data.group.id}'`, e),\n });\n\n this.searchControl.valueChanges\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n // After the debounce, so the initial (empty-term) list is requested immediately on open\n // rather than 500ms later - only the user's own typing should be debounced.\n startWith(''),\n switchMap((term) =>\n this.#userManagementService\n .fetchUsers(0, term || '')\n .pipe(map((response) => ({ term: term || '', response })))\n )\n )\n .subscribe({\n next: ({ term, response }) => {\n this.searchTerm.set(term);\n this.searchResults.set(response.objects);\n },\n error: (e) => this.#logger.error('Failed to search users', e),\n });\n }\n\n select(user: UserObject) {\n this.selectedUsers.update((current) =>\n current.some((u) => u.id === user.id) ? current : [...current, user]\n );\n }\n\n deselect(user: UserObject) {\n this.selectedUsers.update((current) => current.filter((u) => u.id !== user.id));\n }\n\n /** Arrow keys move the highlighted candidate, Enter picks it - so matches can be added without\n * ever leaving the search input.\n *\n * Only Enter is handled here; everything else goes to the key manager, which owns the bounds\n * clamping and leaves the keys a text input needs alone. Home/End are deliberately *not* wired\n * to it (`withHomeAndEnd()`): in a combobox those belong to the caret, not to the list. */\n onSearchKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n event.preventDefault();\n\n const index = this.#keyManager.activeItemIndex;\n const user = index === null ? undefined : this.candidateResults()[index];\n if (user) this.select(user);\n\n return;\n }\n\n this.#keyManager.onKeydown(event);\n }\n\n addMembers() {\n const users = this.selectedUsers();\n if (users.length === 0) return;\n\n this.busy.set(true);\n\n forkJoin(\n users.map((user) =>\n this.#userManagementService.addGroupMember(this.data.group, user.id).pipe(\n map(() => ({ success: true as const })),\n catchError((e) => {\n this.#logger.error(\n `Failed to add user '${user.id}' to group '${this.data.group.id}'`,\n e\n );\n return of({ success: false as const });\n })\n )\n )\n ).subscribe((results) => {\n this.busy.set(false);\n this.#dialogRef.close({\n addedCount: results.filter((r) => r.success).length,\n failedCount: results.filter((r) => !r.success).length,\n });\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog\n class=\"not-separated\"\n [yuvBusyOverlay]=\"busy()\"\n [headertitle]=\"\n 'yuv.app.user-management.groups.action.addMembers.dialog.title'\n | translate : { name: data.group.name }\n \"\n>\n <!-- Shared avatar + name/username anatomy for both the search-result and selected-users rows below. -->\n <ng-template #userInfo let-user>\n <ymusrmgmt-user-avatar [user]=\"user\" />\n <span class=\"names\">\n <span class=\"username\">{{ user.username }}</span>\n <span class=\"name-row\">\n <span class=\"name\">{{ user.firstName }} {{ user.lastName }}</span>\n </span>\n </span>\n </ng-template>\n\n <main class=\"yuv-dialog-content\">\n <div class=\"search-column\">\n <div class=\"search-row\">\n <mat-icon aria-hidden=\"true\" class=\"icon\">search</mat-icon>\n <input\n class=\"input\"\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n aria-controls=\"search-result-list\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [formControl]=\"searchControl\"\n (keydown)=\"onSearchKeydown($event)\"\n [placeholder]=\"\n 'yuv.app.user-management.groups.action.addMembers.search.placeholder' | translate\n \"\n [attr.aria-label]=\"\n 'yuv.app.user-management.groups.action.addMembers.search.placeholder' | translate\n \"\n />\n </div>\n\n <div class=\"search-result\" id=\"search-result-list\" role=\"listbox\" tabindex=\"-1\">\n @for (user of candidateResults(); track user.id) {\n <button\n ymusrmgmt-highlightable-option\n #option=\"ymusrmgmtHighlightableOption\"\n [attr.aria-selected]=\"option.active()\"\n type=\"button\"\n id=\"add-group-members-option-{{ user.id }}\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"user\"\n [class.user--inactive]=\"!user.enabled\"\n (click)=\"select(user)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"userInfo\"\n [ngTemplateOutletContext]=\"{ $implicit: user }\"\n />\n </button>\n } @empty {\n <div class=\"empty-message\">\n {{\n (searchTerm()\n ? 'yuv.app.user-management.groups.action.addMembers.empty.noResults'\n : 'yuv.app.user-management.groups.action.addMembers.empty.allAdded'\n ) | translate\n }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"selected-users\">\n @for (user of selectedUsers(); track user.id) {\n <div class=\"user\" [class.user--inactive]=\"!user.enabled\">\n <ng-container\n [ngTemplateOutlet]=\"userInfo\"\n [ngTemplateOutletContext]=\"{ $implicit: user }\"\n />\n <button\n type=\"button\"\n class=\"chip-remove\"\n (click)=\"deselect(user)\"\n [matTooltip]=\"\n 'yuv.app.user-management.groups.action.addMembers.removeSelected.tooltip' | translate\n \"\n [attr.aria-label]=\"\n 'yuv.app.user-management.groups.action.addMembers.removeSelected.tooltip' | translate\n \"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n } @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.groups.action.addMembers.empty.noneSelected' | translate }}\n </div>\n }\n </div>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.groups.action.button.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"addMembers()\">\n {{ 'yuv.app.user-management.groups.action.addMembers.button.add' | translate }}\n @if (selectedUsers().length > 0) {\n <ymt-badge class=\"count\" severity=\"neutral\">{{ selectedUsers().length }}</ymt-badge>\n }\n </button>\n </footer>\n</yuv-dialog>\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, Inject, inject, linkedSignal, signal } from '@angular/core';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { Logger, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { BusyOverlayDirective, DialogComponent } from '@yuuvis/client-components/common';\n\nimport { resolveErrorMessageKey, YuvUserManagementService } from '../../user-management.service';\nimport { UserObject } from '../../user-management.schema';\nimport { UserRequest } from '../../user-request';\nimport { MatInputModule } from '@angular/material/input';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { RolesSelectionComponent } from '../../components/roles-selection/roles-selection.component';\n\nconst components = [\n BusyOverlayDirective,\n YmtButtonDirective,\n DialogComponent,\n RolesSelectionComponent,\n];\n\nconst modules = [\n CommonModule,\n ReactiveFormsModule,\n TranslatePipe,\n MatFormFieldModule,\n MatInputModule,\n];\n\n@Component({\n selector: 'ymusrmgmt-edit-user',\n templateUrl: './edit-user.component.html',\n styleUrl: './edit-user.component.scss',\n standalone: true,\n imports: [...modules, ...components],\n})\nexport class EditUserComponent implements AfterViewInit {\n /** Shared `MatDialog.open()` config, so every call site opening this dialog stays in sync. */\n static readonly DIALOG_CONFIG: MatDialogConfig = {\n width: '600px',\n maxWidth: '90vw',\n };\n\n readonly #fb = inject(FormBuilder);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #dialogRef = inject(MatDialogRef<EditUserComponent, UserObject>);\n readonly #translateService = inject(TranslateService);\n readonly #logger = inject(Logger);\n\n busy = signal<boolean>(false);\n\n error = signal<string | undefined>(undefined);\n\n allAvailableRoles = signal<string[]>([]);\n\n userRoles = signal<string[]>([]);\n\n /** Externally managed users (e.g. provisioned via SCIM) may only have roles assigned; their personal data is owned by the external IdP. */\n externallyManaged = signal<boolean>(false);\n\n username = new FormControl('');\n email = new FormControl('', [Validators.required, Validators.email]);\n firstName = new FormControl('', [\n Validators.minLength(1),\n Validators.maxLength(255),\n Validators.pattern('^[^#!<>&/%=;*§$()[\\\\]{}]*$'),\n ]);\n lastName = new FormControl('', [\n Validators.minLength(1),\n Validators.maxLength(255),\n Validators.pattern('^[^#!<>&/%=;*§$()[\\\\]{}]*$'),\n ]);\n roles = new FormControl<string[]>([]);\n\n form: FormGroup = this.#fb.group({\n username: this.username,\n email: this.email,\n firstName: this.firstName,\n lastName: this.lastName,\n roles: this.roles,\n });\n\n changedInput = signal<any | undefined>(undefined);\n\n disabledSubmit = linkedSignal({\n source: this.changedInput,\n computation: () => {\n return this.busy() || this.form.invalid || !this.isDataChanged();\n },\n });\n\n constructor(@Inject(MAT_DIALOG_DATA) public data: any) {\n this.form.patchValue({\n username: this.data.user.username,\n firstName: this.data.user.firstName,\n lastName: this.data.user.lastName,\n email: this.data.user.email,\n roles: this.data.user.roles,\n });\n\n // Initialize userRoles from the data\n this.userRoles.set(this.data.user.roles || []);\n\n // Externally managed users may only have roles assigned: their personal data fields are rendered\n // read-only in the template (same mechanism as the username field) so they keep the identical look.\n if (this.data.user.externallyManaged) {\n this.externallyManaged.set(true);\n }\n\n // Fetch all available roles\n this.#userManagementService.fetchAllRoles().subscribe({\n next: (roles) => {\n this.allAvailableRoles.set(roles);\n },\n error: (e) => {\n this.#logger.error('Failed to fetch roles', e);\n },\n });\n }\n\n ngAfterViewInit() {\n this.form.valueChanges.subscribe((value) => {\n this.changedInput.set(value);\n });\n }\n\n isDataChanged(): boolean {\n const isDataUnchanged = Object.keys(this.form.value).every((key) => this.isEquals(key));\n return !isDataUnchanged;\n }\n\n isEquals(key: string) {\n const oldVal = this.data.user?.[key];\n const newVal = this.form.get(key)?.value;\n return oldVal === newVal;\n }\n\n onRolesChange(roles: string[]) {\n this.userRoles.set(roles);\n this.form.patchValue({ roles: roles });\n this.roles.markAsTouched(); // Mark as touched to trigger validation display\n }\n\n updateUser() {\n // For externally managed users the personal data fields are read-only, so their original values\n // are preserved here (the backend replaces the representation from the request, so omitting them\n // would wipe them).\n const editParams = this.form.getRawValue();\n\n this.busy.set(true);\n this.error.set(undefined);\n\n const updateUserRequest: UserRequest = {\n email: editParams.email,\n firstName: editParams.firstName ? editParams.firstName : '',\n lastName: editParams.lastName ? editParams.lastName : '',\n roles: editParams.roles,\n };\n\n this.#userManagementService.updateUser(this.data.user.id, updateUserRequest).subscribe({\n error: (e: any) => {\n const errorKey = resolveErrorMessageKey(\n 'yuv.app.user-management.users.action.edit',\n e.status\n );\n this.error.set(this.#translateService.instant(errorKey));\n this.#logger.error(`Failed to update user with id ${this.data.user.id}`, e);\n this.busy.set(false);\n },\n complete: () => {\n this.busy.set(false);\n this.#dialogRef.close(this.data.user.id);\n },\n });\n }\n\n close() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog\n class=\"not-separated\"\n [yuvBusyOverlay]=\"busy()\"\n [headertitle]=\"\n 'yuv.app.user-management.users.action.edit.dialog.title'\n | translate : { username: data.user.username }\n \"\n>\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n @if (externallyManaged()) {\n <p class=\"hint\">\n {{ 'yuv.app.user-management.users.action.edit.identitySource.external.hint' | translate }}\n </p>\n }\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\n 'yuv.app.user-management.users.property.username' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"username\"\n type=\"text\"\n [attr.tabindex]=\"-1\"\n readonly\n [attr.aria-label]=\"'yuv.app.user-management.users.property.username' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\n 'yuv.app.user-management.users.property.email' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"email\"\n type=\"text\"\n #emailField\n [readonly]=\"externallyManaged()\"\n [attr.tabindex]=\"externallyManaged() ? -1 : null\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.email' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\n 'yuv.app.user-management.users.property.firstname' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"firstName\"\n type=\"text\"\n [readonly]=\"externallyManaged()\"\n [attr.tabindex]=\"externallyManaged() ? -1 : null\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.firstname' | translate\"\n />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\n 'yuv.app.user-management.users.property.lastname' | translate\n }}</mat-label>\n <input\n matInput\n [formControl]=\"lastName\"\n type=\"text\"\n [readonly]=\"externallyManaged()\"\n [attr.tabindex]=\"externallyManaged() ? -1 : null\"\n [attr.aria-label]=\"'yuv.app.user-management.users.property.lastname' | translate\"\n />\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"userRoles()\"\n (rolesChange)=\"onRolesChange($event)\"\n >\n </ymusrmgmt-role-selection>\n </div>\n </form>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.users.action.button.cancel' | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateUser()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import {\n Component,\n computed,\n DestroyRef,\n inject,\n Injectable,\n Injector,\n OnDestroy,\n OnInit,\n signal,\n ViewChild,\n viewChildren,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Title } from '@angular/platform-browser';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginatorIntl, MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatTableModule } from '@angular/material/table';\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ActivatedRoute, ParamMap, Params, Router } from '@angular/router';\nimport { filter, of, Subscription, switchMap, tap } from 'rxjs';\n\nimport {\n Logger,\n NotificationService,\n SearchQuery,\n TranslatePipe,\n TranslateService,\n UserService,\n} from '@yuuvis/client-core';\nimport {\n BusyOverlayDirective,\n ClickDoubleDirective,\n ConfirmService,\n LayoutSettingsService,\n} from '@yuuvis/client-components/common';\nimport { SimpleSearchComponent } from '@yuuvis/client-framework/simple-search';\nimport { OverflowMenuItem } from '@yuuvis/client-components/overflow-menu';\nimport { Pagination } from '@yuuvis/client-framework/pagination';\n\nimport { ShellService } from '@yuuvis/client-shell-core';\nimport { YuvClientShellModule } from '@yuuvis/client-shell';\n\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\nimport { YuvSplitViewModule } from '@yuuvis/client-components/split-view';\n\nimport {\n APP_ICONS,\n APP_ID,\n GroupDetailsObject,\n GroupObject,\n UserObject,\n UsersSearchResponse,\n} from '../user-management.schema';\nimport { YuvUserManagementService } from '../user-management.service';\nimport { UserDetailsComponent } from './areas/user-details/user-details.component';\nimport { GroupsComponent } from './areas/groups/groups.component';\nimport { PaneToggleButtonComponent } from '../components/pane-toggle-button/pane-toggle-button.component';\nimport { PaneGutterComponent } from '../components/pane-gutter/pane-gutter.component';\nimport { UserAvatarComponent } from '../components/user-avatar/user-avatar.component';\nimport { GlobalAddButtonComponent } from '../components/global-add-button/global-add-button.component';\nimport { CreateUserComponent } from '../overlays/create-user/create-user.component';\nimport { CreateGroupComponent } from '../overlays/create-group/create-group.component';\nimport { SettingsComponent } from '../overlays/settings/settings.component';\nimport {\n AddGroupMembersComponent,\n AddGroupMembersResult,\n} from '../overlays/add-group-members/add-group-members.component';\nimport { EditUserComponent } from '../overlays/edit-user/edit-user.component';\n\nimport { UserRequest } from '../user-request';\nimport { FocusableRowDirective } from '../directives/focusable-row.directive';\n\n/**\n * `MatPaginatorIntl` is provided app-wide as a single shared singleton (see `provideYmtMaterial`),\n * translated from the generic `ymt.paginator.*` keys (\"Hits per page\" etc.) that every paginator\n * in the whole shell reuses - overriding `itemsPerPageLabel` there would relabel every other\n * paginator too, not just this page's. Providing this class at the component level instead scopes\n * the override to just this page's `mat-paginator`, while still delegating everything else\n * (including re-translation on language change) to the shared instance.\n */\n@Injectable()\nclass UserListPaginatorIntl extends MatPaginatorIntl implements OnDestroy {\n /** `parent.changes` is the app-wide singleton's Subject - it outlives this instance, so the\n * subscription below has to be torn down explicitly on destroy. Without it, every time this\n * page's component is recreated (e.g. navigating away and back), another subscriber piles onto\n * the singleton forever, since nothing else ever unsubscribes it. */\n #parentSubscription: Subscription;\n\n constructor() {\n super();\n\n const parent = inject(MatPaginatorIntl, { skipSelf: true });\n const translate = inject(TranslateService);\n\n // Our own `changes` (inherited from the base class, not `parent`'s) is what this page's\n // `mat-paginator` actually subscribes to, so re-translating on the parent's changes (e.g. a\n // language switch) still has to be forwarded explicitly via `this.changes.next()`.\n const update = () => {\n this.itemsPerPageLabel = translate.instant(\n 'yuv.app.user-management.users.label.navigation.pagination.itemsPerPage'\n );\n this.nextPageLabel = parent.nextPageLabel;\n this.previousPageLabel = parent.previousPageLabel;\n this.firstPageLabel = parent.firstPageLabel;\n this.lastPageLabel = parent.lastPageLabel;\n this.getRangeLabel = parent.getRangeLabel;\n this.changes.next();\n };\n\n update();\n this.#parentSubscription = parent.changes.subscribe(update);\n }\n\n ngOnDestroy() {\n this.#parentSubscription.unsubscribe();\n }\n}\n\n@Component({\n selector: 'ymusrmgmt-root',\n imports: [\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatPaginatorModule,\n MatTableModule,\n MatTooltipModule,\n TranslatePipe,\n SimpleSearchComponent,\n BusyOverlayDirective,\n ClickDoubleDirective,\n UserDetailsComponent,\n GroupsComponent,\n PaneToggleButtonComponent,\n PaneGutterComponent,\n UserAvatarComponent,\n GlobalAddButtonComponent,\n FocusableRowDirective,\n YmtButtonDirective,\n YmtPanesModule,\n YuvClientShellModule,\n YuvSplitViewModule,\n ],\n templateUrl: './user-management.component.html',\n styleUrl: './user-management.component.scss',\n providers: [\n {\n provide: MatPaginatorIntl,\n useClass: UserListPaginatorIntl,\n },\n ],\n})\nexport class YuvUserManagementComponent implements OnInit {\n #shell = inject(ShellService);\n #titleService = inject(Title);\n\n #app = this.#shell.getApp(APP_ID);\n appName = this.#app?.title as string;\n\n readonly layoutSettingsID = APP_ID + '#root.layout.settings';\n\n /** Key the chosen page size is remembered under, across sessions - see `#loadStoredPageSize`. */\n readonly #pageSizeSettingsKey = APP_ID + '#root.pageSize';\n readonly pageSizeOptions: number[] = [10, 25, 50, 100];\n\n /** `yuv-split-view` area indices for the directory layout, so the top-bar hide/toggle buttons\n * and the collapsed-rail templates don't hardcode them repeatedly. */\n readonly Area = { GROUPS: 0, DETAILS: 2 } as const;\n\n readonly #logger = inject(Logger);\n readonly #userManagementService = inject(YuvUserManagementService);\n readonly #translateService = inject(TranslateService);\n readonly #dialog = inject(MatDialog);\n readonly #notificationService = inject(NotificationService);\n readonly #userService = inject(UserService);\n readonly #confirmService = inject(ConfirmService);\n readonly #route = inject(ActivatedRoute);\n readonly #router = inject(Router);\n readonly #destroyRef = inject(DestroyRef);\n readonly #injector = inject(Injector);\n readonly #layoutSettings = inject(LayoutSettingsService);\n\n @ViewChild(UserDetailsComponent) userDetailsComponent!: UserDetailsComponent;\n @ViewChild(GroupsComponent) groupsComponent!: GroupsComponent;\n\n /** The search box's displayed value, bound to `<yuv-simple-search [query]>` in the template.\n * A signal rather than a `viewChild` + imperative assignment: the box lives inside an\n * `<ng-template yuvAppHeaderSlot=\"search\">` that the shell renders into its own header component\n * on the shell's timing, but the bindings in that template are still evaluated in *this*\n * component's context, whenever and wherever it ends up being rendered - so there is nothing to\n * wait for. Always set to a fresh object: `query` is a plain setter input, so Angular only\n * re-invokes it when the bound reference changes. */\n searchBoxQuery = signal<SearchQuery>({ term: '' });\n\n pagination: Pagination = { total: 0, pages: 0, page: 0 };\n\n busy = signal<boolean>(false);\n\n /** How many rows the user list and the group-membership list fetch/show per page - user-selectable\n * via the paginator's page-size control, remembered across sessions. */\n pageSize = signal<number>(this.#loadStoredPageSize());\n\n displayedColumns: string[] = ['avatar', 'user', 'email', 'actions'];\n\n readonly icons = APP_ICONS;\n\n dataSource = signal<UserObject[]>([]);\n\n /** The selected row, or `undefined` when nothing is selected. Single-select and non-toggling\n * (see `select`), so a plain signal rather than a `SelectionModel` - and being a real signal, it\n * lets everything derived from it (`activeRowIndex`, `isSelected`) be a memoized `computed()`. */\n selectedUser = signal<UserObject | undefined>(undefined);\n\n /** The rendered rows, in `dataSource()` order - see `FocusableRowDirective`. */\n private readonly rowItems = viewChildren(FocusableRowDirective);\n\n /** Drives Up/Down over the rows, moving real DOM focus with the roving tabindex below. Built\n * from the `viewChildren` signal directly, so it follows the rows as the page's contents change\n * - hence the `Injector`, which is the signal overload's way of scoping that tracking.\n *\n * Selection follows focus here, matching the groups rail and a native single-select list: the\n * manager only moves focus, so `change` is what turns that into a selection. */\n readonly #rowKeyManager = new FocusKeyManager(this.rowItems, this.#injector);\n\n constructor() {\n // Selection follows keyboard focus, the way a native single-select list behaves - and the way\n // this table behaved when it moved focus by hand.\n this.#rowKeyManager.change.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((index) => {\n const row = this.dataSource()[index];\n if (row) this.select(row);\n });\n }\n\n /** Row index per user id, so the roving tabindex and the selected-row class below are O(1)\n * lookups rather than a `findIndex` per row per change-detection pass. */\n readonly #rowIndexById = computed(\n () => new Map(this.dataSource().map((user, index) => [user.id, index]))\n );\n\n /** Roving-tabindex position of the selected row within `dataSource()` - only this row (and its\n * actions button) is a real Tab stop, so Tab moves from the selected row straight to whatever\n * follows the table instead of stopping at every row in between, mirroring the groups rail.\n * `-1` (never a valid row index) when nothing is selected, so that state correctly makes every\n * row's button unreachable via Tab, rather than falling back to row 0 and making an arbitrary,\n * never-selected row's button reachable. */\n readonly activeRowIndex = computed(() => {\n const selected = this.selectedUser();\n return selected ? this.#rowIndexById().get(selected.id) ?? -1 : -1;\n });\n\n /** The id of the group currently scoping the user list, or `undefined` for \"All users\". This is\n * the scope *axis* - set straight from the route, so the list can be fetched for it immediately,\n * without waiting on the group's own record to arrive. `selectedGroupDetails` below is the same\n * group's content, for display. */\n selectedGroupId = signal<string | undefined>(undefined);\n\n /** The full record (name, roles, members) of `selectedGroupId`'s group, fetched alongside the\n * list rather than before it - see `#loadGroupDetails`. Briefly `undefined` after a group is\n * picked, and whenever no group is selected. */\n selectedGroupDetails = signal<GroupDetailsObject | undefined>(undefined);\n\n /** Roles granted by the scoping group, so the detail pane can highlight which of a member's inherited roles come from it specifically. Empty until `selectedGroupDetails` has loaded, or when no group is selected. */\n selectedGroupRoles = computed(() => this.selectedGroupDetails()?.roles ?? []);\n\n searchTerm = signal<string>('');\n\n /** Which entry of the list pane's \"All / Enabled / Disabled\" filter menu is active - `undefined`\n * for \"All users\". Combines with `searchTerm` - both are sent to the users endpoint at once, so\n * a state filter narrows an active search. Only applies to \"All users\" though: the backend\n * doesn't support filtering group members by state. */\n enabledFilter = signal<boolean | undefined>(undefined);\n\n /** One-entry memo for `getRowActions`, keyed on everything those actions are derived from.\n *\n * The row menu's `matMenuContent` template re-evaluates its `@for` on every change-detection\n * pass for as long as the menu is open, and each rebuild costs a `getCurrentUser()` lookup, four\n * or five `translateService.instant()` lookups and four fresh objects. Only one row's menu can\n * be open at a time, so a single entry covers it.\n *\n * Keying on the row object rather than its id is deliberate: a list reload replaces the objects,\n * so a row whose `enabled` state changed can't keep stale actions. The scoping group is part of\n * the key for the same reason - it decides whether \"Remove from group\" is there at all, and\n * carries the name that action's confirmation uses.\n *\n * Building the array on the trigger's `(menuOpened)` instead - the obvious alternative - does\n * *not* work: `MatMenuTrigger.openMenu` attaches the menu content and focuses its first item\n * before emitting `menuOpened`, so the menu would render, size and position itself empty.\n */\n #rowActionsMemo?: {\n user: UserObject;\n group: GroupDetailsObject | undefined;\n actions: OverflowMenuItem[];\n };\n\n /** The action menu for one row - see `#rowActionsMemo`. Bound by the row menu's template. */\n rowActionsFor(user: UserObject): OverflowMenuItem[] {\n const group = this.selectedGroupDetails();\n let memo = this.#rowActionsMemo;\n\n if (!memo || memo.user !== user || memo.group !== group) {\n memo = { user, group, actions: this.getRowActions(user) };\n this.#rowActionsMemo = memo;\n }\n\n return memo.actions;\n }\n\n /**\n * Builds the edit/activate/deactivate/delete menu for a given user row - it doesn't depend on\n * the row being selected first. When a group is currently scoping the list, a \"Remove from\n * group\" action is appended too.\n *\n * Called through `rowActionsFor`, not directly from the template. (The detail pane has its own,\n * separate header action - a single edit button that emits `editUser` - and never used this.)\n */\n getRowActions(user: UserObject): OverflowMenuItem[] {\n const isSelf = user.id === this.#userService.getCurrentUser().id;\n const group = this.selectedGroupDetails();\n\n const editAction: OverflowMenuItem = {\n id: 'yuv.app.users.action.edit',\n icon: APP_ICONS.actionEditUser,\n label: this.#translateService.instant('yuv.app.user-management.users.action.edit.label'),\n callback: () => this.editUser(user),\n };\n\n const stateAction: OverflowMenuItem = user.enabled\n ? {\n id: 'yuv.app.users.action.deactivate',\n icon: APP_ICONS.actionDeactivateUser,\n label: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.label'\n ),\n disabled: isSelf,\n callback: () => this.deactivateUser(user),\n }\n : {\n id: 'yuv.app.users.action.activate',\n icon: APP_ICONS.actionActivateUser,\n label: this.#translateService.instant(\n 'yuv.app.user-management.users.action.activate.label'\n ),\n disabled: isSelf,\n callback: () => this.activateUser(user),\n };\n\n const deleteAction: OverflowMenuItem = {\n id: 'yuv.app.users.action.delete',\n icon: APP_ICONS.actionDeleteUser,\n label: this.#translateService.instant('yuv.app.user-management.users.action.delete.label'),\n disabled: isSelf,\n callback: () => this.deleteUser(user),\n };\n\n const actions: OverflowMenuItem[] = [editAction, stateAction];\n\n if (group) {\n actions.push({\n id: 'yuv.app.users.action.removeGroupMember',\n icon: APP_ICONS.actionRemoveGroupMember,\n label: this.#translateService.instant(\n 'yuv.app.user-management.groups.action.removeMember.label'\n ),\n callback: () => this.removeGroupMember(group, user),\n });\n }\n\n actions.push(deleteAction);\n\n return actions;\n }\n\n createNewUser() {\n this.#logger.debug('Create new user ...');\n\n this.#dialog\n .open(CreateUserComponent, CreateUserComponent.DIALOG_CONFIG)\n .afterClosed()\n .subscribe((createdUser: UserObject | undefined) => {\n if (createdUser) {\n this.#logger.debug('New user created with ID: ' + createdUser.id);\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.users.action.create.success')\n );\n\n // The list is sorted alphabetically, so the new user could land on any page - searching\n // by its own username reliably surfaces it (as the only/first match) instead, letting the\n // usual auto-select-first-row fallback pick it: ready to assign roles/groups to right away.\n // Clears any active state filter along with it, which would otherwise be free to hide the\n // very user just created.\n this.#navigateToScope({ search: createdUser.username, enabled: null });\n }\n });\n }\n\n createNewGroup() {\n this.#logger.debug('Create new group ...');\n\n this.#dialog\n .open(CreateGroupComponent, CreateGroupComponent.DIALOG_CONFIG)\n .afterClosed()\n .subscribe((createdGroup: GroupObject | undefined) => {\n if (createdGroup) {\n this.#logger.debug('New group created with ID: ' + createdGroup.id);\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.groups.action.create.success')\n );\n\n this.groupsComponent.refresh();\n // Selects it right away so the (still empty) group is scoping the table, ready for adding members.\n this.onGroupSelected(createdGroup);\n }\n });\n }\n\n /** Opens a dialog to bulk-add users to `group` - the single owner of that flow, for both the\n * list pane's own button (where `group` is always the group scoping the list) and the rail's\n * per-row action (where it can be any group, see `GroupsComponent.addMembersRequested`). */\n openAddGroupMembersDialog(group: GroupObject) {\n this.#logger.debug(`Add members to group '${group.id}' ...`);\n\n this.#dialog\n .open(AddGroupMembersComponent, {\n ...AddGroupMembersComponent.DIALOG_CONFIG,\n data: { group },\n })\n .afterClosed()\n .subscribe((result: AddGroupMembersResult | undefined) => {\n if (!result) return;\n\n if (result.addedCount > 0) {\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.addMembers.success',\n { count: result.addedCount, name: group.name }\n )\n );\n // Only the list currently on screen needs reloading - adding members to some other\n // group from the rail's row menu doesn't change it.\n if (this.selectedGroupId() === group.id) {\n this.#reloadCurrentPage();\n }\n }\n\n if (result.failedCount > 0) {\n this.#notificationService.error(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.addMembers.partialError',\n { count: result.failedCount, name: group.name }\n )\n );\n }\n });\n }\n\n /** Edit any row's user. */\n editUser(user: UserObject) {\n this.#logger.debug(`Edit user with id '${user.id}'...`);\n\n this.#userManagementService.getUserDetails(user.id).subscribe({\n next: (userDetails) => {\n this.#dialog\n .open(EditUserComponent, {\n ...EditUserComponent.DIALOG_CONFIG,\n data: { user: userDetails },\n })\n .afterClosed()\n .subscribe((editedUserId: string | undefined) => {\n if (editedUserId) {\n this.#logger.debug('User edited with ID: ' + editedUserId);\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.users.action.edit.success',\n { username: user.username }\n )\n );\n\n this.refresh(this.isSelected(user));\n }\n });\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to load details for user with id '${user.id}'`, e);\n },\n });\n }\n\n activateUser(user: UserObject) {\n this.updateUserEnabledState(user, true);\n }\n\n deactivateUser(user: UserObject) {\n this.updateUserEnabledState(user, false);\n }\n\n updateUserEnabledState(user: UserObject, enabled: boolean) {\n const action = enabled ? 'activate' : 'deactivate';\n const updateUserRequest: UserRequest = { enabled };\n\n // Deactivating is the destructive direction, so only it asks for confirmation; activating goes\n // straight through.\n const confirmed$ = enabled\n ? of(true)\n : this.#confirmService.confirm({\n title: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.label'\n ),\n message: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.confirm.message',\n { username: user.username }\n ),\n confirmLabel: this.#translateService.instant(\n 'yuv.app.user-management.users.action.deactivate.confirm.label'\n ),\n });\n\n confirmed$\n .pipe(\n filter(Boolean),\n tap(() => this.busy.set(true)),\n switchMap(() => this.#userManagementService.updateUser(user.id, updateUserRequest))\n )\n .subscribe({\n error: (e: unknown) => {\n this.#notificationService.error(\n this.#translateService.instant(`yuv.app.user-management.users.action.${action}.error`, {\n username: user.username,\n })\n );\n this.#logger.error(`Failed to ${action} user with id ${user.id}`, e);\n this.busy.set(false);\n },\n complete: () => {\n this.#notificationService.success(\n this.#translateService.instant(\n `yuv.app.user-management.users.action.${action}.success`,\n { username: user.username }\n )\n );\n this.busy.set(false);\n this.refresh(this.isSelected(user));\n },\n });\n }\n\n deleteUser(user: UserObject) {\n this.#logger.debug(`Delete user with id '${user.id}'...`);\n\n this.#userManagementService.deleteUser(user).subscribe({\n next: (result: boolean) => {\n if (result) {\n this.#notificationService.success(\n this.#translateService.instant('yuv.app.user-management.users.action.delete.success', {\n username: user.username,\n })\n );\n if (this.isSelected(user)) {\n this.deselect();\n }\n this.#reloadCurrentPage();\n }\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to delete user with id '${user.id}'`, e);\n this.#notificationService.error(\n this.#translateService.instant('yuv.app.user-management.users.action.delete.error', {\n username: user.username,\n })\n );\n },\n });\n }\n\n /** Removes a user from the group currently scoping the list - the user account itself is unaffected. */\n removeGroupMember(group: GroupObject, user: UserObject) {\n this.#logger.debug(`Remove user with id '${user.id}' from group '${group.id}'...`);\n\n this.#userManagementService.removeGroupMember(group, user).subscribe({\n next: (result: boolean) => {\n if (result) {\n this.#notificationService.success(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.removeMember.success',\n { username: user.username, name: group.name }\n )\n );\n if (this.isSelected(user)) {\n this.deselect();\n }\n this.#reloadCurrentPage();\n }\n },\n error: (e: unknown) => {\n this.#logger.error(\n `Failed to remove user with id '${user.id}' from group '${group.id}'`,\n e\n );\n this.#notificationService.error(\n this.#translateService.instant(\n 'yuv.app.user-management.groups.action.removeMember.error',\n { username: user.username, name: group.name }\n )\n );\n },\n });\n }\n\n /** Non-toggling - a row click/Enter/Space always (re-)selects, never deselects, so the list\n * always has a selected row (and the detail pane never has to fall back to its empty state)\n * whenever `dataSource()` isn't itself empty. */\n select(row: UserObject) {\n this.selectedUser.set(row);\n }\n\n deselect() {\n this.selectedUser.set(undefined);\n }\n\n /** Arrow keys (and Home/End) for the row list - handed straight to the key manager, which moves\n * focus; `#rowKeyManager`'s `change` subscription turns that into a selection. */\n onTableKeydown(event: KeyboardEvent) {\n // The selection can move without the key manager having done it - the auto-select after a\n // reload, or a row click - so bring its active index back in step first, or the next arrow\n // press would move relative to a row that is no longer the current one. `updateActiveItem`\n // does that without emitting `change` or moving focus.\n const selected = this.activeRowIndex();\n if (selected !== -1 && selected !== this.#rowKeyManager.activeItemIndex) {\n this.#rowKeyManager.updateActiveItem(selected);\n }\n\n this.#rowKeyManager.onKeydown(event);\n }\n\n /** Moves real DOM focus onto the row at `index` - also called on a plain row click, see\n * `FocusableRowDirective.focus`. Going through the key manager (rather than the element) keeps\n * its active index in step, so the next arrow press moves from the clicked row. */\n focusRow(index: number) {\n this.#rowKeyManager.setActiveItem(index);\n }\n\n /**\n * Called by the groups rail - scopes the user list to that group's members, or back to every\n * user when `group` is undefined (the rail's pinned \"All users\" entry).\n *\n * Navigation only: like every other scope change, it is applied by `#applyScopeFromRoute` once\n * the router reports the new URL, never here.\n */\n onGroupSelected(group: GroupObject | undefined) {\n this.#navigateToScope({ group: group?.id ?? null });\n }\n\n /** Called from the \"All / enabled / disabled\" filter menu in the list pane's header - only shown\n * while viewing \"All users\". Narrows an active search rather than replacing it: the state filter\n * and the search term combine (see `#navigateToScope`). */\n onEnabledFilterSelected(enabled: boolean | undefined) {\n this.#navigateToScope({ enabled: enabled ?? null });\n }\n\n /** Bound to `yuv-simple-search`'s `querySubmit` (Enter / the search button) and `clearInput`\n * (the X button) - deliberately not its `queryChange`, which fires debounced on every keystroke\n * and would otherwise refresh the list while the user is still typing.\n *\n * Leaves an active state filter in place (searching within \"only disabled users\" keeps showing\n * only disabled ones), and clearing the term leaves it in place too - see `#navigateToScope`. */\n onQueryChange(q: SearchQuery) {\n this.#navigateToScope({ search: q.term || null });\n }\n\n /**\n * Points the URL at a new scope, and stops there - `#applyScopeFromRoute` does the rest.\n *\n * Takes a patch of the scope axes and merges it into the current query string\n * (`queryParamsHandling: 'merge'`), so an axis the patch doesn't mention just keeps its current\n * value - the router carries that over itself, straight from the current URL. The one real\n * constraint the backend imposes needs an explicit override on top of that merge: `group` is\n * exclusive with the other two - group membership supports neither search nor state-filtering -\n * so touching the group axis at all (picking a group *or* going back to \"All users\") clears\n * `search`/`enabled` alongside it, even if the patch didn't otherwise mention them. `search` and\n * `enabled` themselves need no such override - the users endpoint takes both at once, so leaving\n * one out of a patch is exactly \"carry it over\", which `merge` already does.\n *\n * Query params rather than path segments specifically so this never causes a route-config\n * change - Angular only destroys/recreates a routed component across genuinely different route\n * configs, never for a query-param-only change, so switching between \"All users\" and any group\n * (or between two groups) always reuses this same instance.\n */\n #navigateToScope(patch: {\n group?: string | null;\n search?: string | null;\n enabled?: boolean | null;\n }) {\n const isGroupChange = patch.group !== undefined;\n\n const queryParams: Params = {};\n if (patch.group !== undefined) queryParams['group'] = patch.group;\n if (patch.search !== undefined) queryParams['search'] = patch.search;\n if (patch.enabled !== undefined) {\n queryParams['enabled'] = patch.enabled === null ? null : String(patch.enabled);\n }\n if (isGroupChange) {\n queryParams['search'] = null;\n queryParams['enabled'] = null;\n }\n\n this.#router.navigate([], {\n relativeTo: this.#route,\n queryParamsHandling: 'merge',\n queryParams,\n });\n }\n\n /** The groups rail edits/deletes rows itself; this only reconciles the page's own state when the group it's currently scoped to was affected. */\n onGroupUpdated(group: GroupDetailsObject) {\n if (this.selectedGroupId() === group.id) {\n this.selectedGroupDetails.set(group);\n }\n }\n\n /** Loads the scoping group's full record (name, roles) for display - see `selectedGroupDetails`.\n * Fired alongside the list request rather than before it, so the rows aren't waiting on a\n * response only the pane header needs. The guard covers the group being switched again while\n * this one was still in flight. */\n #loadGroupDetails(groupId: string) {\n this.#userManagementService.getGroupDetails(groupId).subscribe({\n next: (details) => {\n if (this.selectedGroupId() === groupId) {\n this.selectedGroupDetails.set(details);\n }\n },\n error: (e: unknown) => {\n this.#logger.error(`Failed to load details for group with id '${groupId}'`, e);\n },\n });\n }\n\n onGroupDeleted(groupId: string) {\n if (this.selectedGroupId() === groupId) {\n this.onGroupSelected(undefined);\n }\n }\n\n isSelected(row: UserObject): boolean {\n return this.selectedUser()?.id === row.id;\n }\n\n /** Reloads whichever page the list is currently showing, leaving the scope/search untouched. */\n #reloadCurrentPage() {\n this.#loadUserList(this.pagination.page);\n }\n\n refresh(refreshDetails = false) {\n this.#reloadCurrentPage();\n\n if (refreshDetails) {\n this.refreshUserDetails();\n }\n }\n\n refreshUserDetails() {\n if (this.userDetailsComponent) {\n this.userDetailsComponent.refresh();\n }\n }\n\n /**\n * Reads the remembered page size back, falling back to the default for anything unexpected (no\n * stored value yet, or a size no longer offered in `pageSizeOptions`).\n *\n * Persisted through `LayoutSettingsService` rather than the browser store directly - the same\n * mechanism the adjacent `yuv-split-view` uses for `[layoutSettingsID]`, so this page keeps one\n * persistence story instead of two, and the value lands under the framework's own `yuv.layout:`\n * namespace where `clearSettings()` can actually reach it. The service only accepts objects (it\n * returns `false` for anything else, storing nothing), hence the one-field wrapper.\n */\n #loadStoredPageSize(): number {\n const stored = this.#layoutSettings.getSettings(this.#pageSizeSettingsKey) as\n | { pageSize?: number }\n | undefined;\n const pageSize = Number(stored?.pageSize);\n\n return this.pageSizeOptions.includes(pageSize)\n ? pageSize\n : YuvUserManagementService.DEFAULT_PAGE_SIZE;\n }\n\n onChangePage($event: PageEvent) {\n const { pageIndex, pageSize } = $event;\n if (pageSize !== this.pageSize()) {\n this.pageSize.set(pageSize);\n this.#layoutSettings.saveSettings(this.#pageSizeSettingsKey, { pageSize });\n // A different page size shifts what \"page N\" means - restart from the first page rather\n // than keeping an index that may now point past the end, or skip/duplicate rows.\n this.#loadUserList(0);\n } else {\n this.#loadUserList(pageIndex);\n }\n }\n\n ngOnInit() {\n const translatedTitle = this.appName.startsWith('yuv.')\n ? this.#translateService.instant(this.appName)\n : this.appName;\n this.#titleService.setTitle(translatedTitle);\n\n // Reactive rather than a one-time snapshot: this component is never destroyed/recreated for a\n // query-param-only change (see `#navigateToScope`), so a snapshot read would only ever see the\n // very first scope and miss every later one - picking a different group, typing/clearing a\n // search, switching the state filter, or browser Back/Forward through any of them.\n this.#route.queryParamMap\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((params) => this.#applyScopeFromRoute(params));\n }\n\n /**\n * The single writer of the page's scope state, and the only thing that loads the list for a\n * scope change. Every source arrives here the same way: the groups rail, the search box, the\n * filter menu, a deep link and browser Back/Forward all go through `#navigateToScope` (or the\n * address bar) and are read back off the route.\n *\n * That one-way flow is why there is no \"is this the echo of my own navigation?\" bookkeeping\n * here. Nothing applies a scope before navigating, so there is no echo to tell apart from a\n * genuine external change. And re-selecting what is already selected produces an identical URL,\n * which Angular's default `onSameUrlNavigation: 'ignore'` drops before it ever reaches this\n * subscription - so the duplicate reload that used to need a guard of its own can't happen.\n */\n #applyScopeFromRoute(params: ParamMap) {\n const groupId = params.get('group');\n\n // A group scope wins over the other two axes. The backend supports neither search nor\n // state-filtering for group members, so a URL carrying both (only reachable by hand-editing\n // it - `#navigateToScope` never emits that combination) applies the group and drops the rest,\n // rather than leaving a filter showing as active that nothing can honour. `search` and\n // `enabled` do combine with each other, and are applied together below.\n const term = groupId ? '' : params.get('search') ?? '';\n const enabled = groupId ? undefined : this.#parseEnabledParam(params.get('enabled'));\n\n // Entering, leaving or switching a group scope always starts over at the first row; a changed\n // search or filter doesn't, so a row that survives into the new results stays selected (see\n // `#loadUserList`'s restore-by-id).\n if (groupId !== (this.selectedGroupId() ?? null)) {\n this.deselect();\n }\n\n this.searchTerm.set(term);\n this.searchBoxQuery.set({ term });\n this.enabledFilter.set(enabled);\n this.selectedGroupId.set(groupId ?? undefined);\n this.selectedGroupDetails.set(undefined);\n\n if (groupId) {\n // Fired alongside the list request below, not before it: only the pane header needs the\n // group's own record, so the rows shouldn't wait for it.\n this.#loadGroupDetails(groupId);\n }\n\n this.#loadUserList(0);\n }\n\n /** `?enabled=true|false` - anything else (including the param being absent) means \"All users\". */\n #parseEnabledParam(value: string | null): boolean | undefined {\n if (value === 'true') return true;\n if (value === 'false') return false;\n return undefined;\n }\n\n #loadUserList(page: number) {\n this.busy.set(true);\n // Clears the previously shown rows immediately rather than leaving them up (stale, and\n // possibly for a different group) until the new response arrives - the busy indicator alone\n // (a subtle animated pane border) isn't enough to make clear what's currently shown is old.\n this.dataSource.set([]);\n\n const groupId = this.selectedGroupId();\n const term = this.searchTerm();\n const pageSize = this.pageSize();\n // Group membership search/state-filtering isn't supported by the backend - a group scope never\n // coexists with a non-empty `term` or a set `enabledFilter`, which `#applyScopeFromRoute`\n // guarantees for every scope, from every source. Outside a group the two are independent and\n // both go to the endpoint, which ANDs them.\n const request$ = groupId\n ? this.#userManagementService.fetchGroupMembers(groupId, page, pageSize)\n : this.#userManagementService.fetchUsers(page, term, this.enabledFilter(), pageSize);\n\n request$.subscribe({\n next: (response: UsersSearchResponse) => {\n this.dataSource.set(response.objects);\n\n this.pagination = {\n total: response.totalNumItems,\n pages: Math.ceil(response.totalNumItems / pageSize) || 1,\n page: page,\n };\n },\n error: (e: unknown) => {\n this.#logger.error('Failed to fetch users', e);\n this.busy.set(false);\n },\n complete: () => {\n if (this.dataSource().length === 0 && page > 0) {\n this.#loadUserList(page - 1);\n return;\n }\n\n // A plain name search matching nothing might actually be a user's exact id, pasted in by\n // someone who only has that to go on - falling back to an exact-id lookup lets them jump\n // straight to that user instead of hitting a dead end. Harmless no-op if it isn't one.\n if (this.dataSource().length === 0 && page === 0 && !groupId && term) {\n this.#tryFindByIdFallback(term);\n return;\n }\n\n const selected = this.selectedUser();\n const updatedSelected = selected && this.dataSource().find((u) => u.id === selected.id);\n if (updatedSelected) {\n this.select(updatedSelected);\n } else if (this.dataSource().length > 0) {\n // Nothing selected (or the previous selection no longer exists in the freshly loaded\n // page) - always fall back to the first row rather than leaving the detail pane empty.\n this.select(this.dataSource()[0]);\n } else {\n this.deselect();\n }\n this.busy.set(false);\n },\n });\n }\n\n /** Called when a plain search matched no one - `term` might actually be a user's id rather than\n * part of their name (the backend's search endpoint doesn't match on id, which is why the plain\n * search above found nothing). If it resolves to a real user, show that one row directly rather\n * than rewriting the search box to their username and re-running a name search for it - the box\n * stays showing exactly the id that was typed. If not, this is just a genuine \"no matches\".\n *\n * An active state filter still applies: this lookup goes to the user endpoint directly, so a\n * match whose state the filter excludes is discarded rather than shown as the one row of a list\n * that claims to be filtered to the opposite state. */\n #tryFindByIdFallback(term: string) {\n const enabledFilter = this.enabledFilter();\n\n this.#userManagementService.getUserDetails(term).subscribe({\n next: (user) => {\n if (enabledFilter !== undefined && user.enabled !== enabledFilter) {\n this.busy.set(false);\n return;\n }\n\n this.dataSource.set([user]);\n this.pagination = { total: 1, pages: 1, page: 0 };\n this.select(user);\n this.busy.set(false);\n },\n error: () => {\n this.busy.set(false);\n },\n });\n }\n\n openSettings() {\n this.#dialog.open(SettingsComponent, SettingsComponent.DIALOG_CONFIG);\n }\n}\n","<ng-template yuvAppHeaderSlot=\"actions\">\n <div class=\"usrmgmt-header-actions\">\n <ymusrmgmt-global-add-button (createUser)=\"createNewUser()\" (createGroup)=\"createNewGroup()\" />\n <button\n mat-icon-button\n class=\"usrmgmt-settings-button\"\n [matTooltip]=\"'yuv.app.user-management.navigation.action.settings.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.navigation.action.settings.label' | translate\"\n (click)=\"openSettings()\"\n >\n <mat-icon>{{ icons.actionSettings }}</mat-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template yuvAppHeaderSlot=\"search\">\n <!-- querySubmit (Enter / the search button), not queryChange - queryChange fires debounced on\n every keystroke, which used to refresh the list while still typing. clearInput (the X\n button) still needs its own binding since it doesn't also emit querySubmit. -->\n <yuv-simple-search\n [query]=\"searchBoxQuery()\"\n (querySubmit)=\"onQueryChange($event)\"\n (clearInput)=\"onQueryChange({ term: '' })\"\n ></yuv-simple-search>\n</ng-template>\n\n<main\n class=\"usrmgmt-main__content\"\n [attr.aria-label]=\"'yuv.app.user-management.content.label.aria' | translate\"\n>\n @if (!split.isAreaVisible(Area.GROUPS)) {\n <ymusrmgmt-pane-gutter\n icon=\"left_panel_open\"\n [flipLabel]=\"true\"\n [label]=\"'yuv.app.user-management.label.rail.title' | translate\"\n [tooltip]=\"'yuv.app.user-management.label.pane.showGroups.tooltip' | translate\"\n (expand)=\"split.showArea(Area.GROUPS)\"\n />\n }\n\n <yuv-split-view #split [layoutSettingsID]=\"layoutSettingsID\" class=\"content-split\">\n <ng-template yuvSplitArea [size]=\"20\">\n <ng-template #groupPaneTopBarActions>\n <ymusrmgmt-pane-toggle-button\n icon=\"left_panel_close\"\n [tooltip]=\"'yuv.app.user-management.label.pane.hideGroups.tooltip' | translate\"\n (toggled)=\"split.hideArea(Area.GROUPS)\"\n />\n </ng-template>\n\n <ymusrmgmt-groups\n [selectedGroupId]=\"selectedGroupId()\"\n [topBarActions]=\"groupPaneTopBarActions\"\n (groupSelected)=\"onGroupSelected($event)\"\n (groupUpdated)=\"onGroupUpdated($event)\"\n (groupDeleted)=\"onGroupDeleted($event)\"\n (addMembersRequested)=\"openAddGroupMembersDialog($event)\"\n >\n </ymusrmgmt-groups>\n </ng-template>\n\n <ng-template yuvSplitArea [size]=\"60\">\n <!-- `groupId` is the scope itself, known the moment a group is picked; `group` is that\n group's record, which arrives a beat later (see `selectedGroupDetails`). Anything\n structural keys off `groupId`, anything showing the group's own content off `group`. -->\n @let groupId = selectedGroupId(); @let group = selectedGroupDetails(); @let enabled =\n enabledFilter();\n <!-- The list pane's own title, shared by its `aria-label` and its visible header. -->\n @let listTitle = (groupId ? 'yuv.app.user-management.label.list.groupMembersTitle' :\n 'yuv.app.user-management.label.list.title' ) | translate;\n <ng-template #userListTopBarActions>\n @let groupsVisible = split.isAreaVisible(Area.GROUPS);\n <ymusrmgmt-pane-toggle-button\n align=\"start\"\n icon=\"left_panel_close\"\n [rotated]=\"!groupsVisible\"\n [tooltip]=\"\n (groupsVisible\n ? 'yuv.app.user-management.label.pane.hideGroups.tooltip'\n : 'yuv.app.user-management.label.pane.showGroups.tooltip'\n ) | translate\n \"\n (toggled)=\"split.toggleArea(Area.GROUPS)\"\n />\n @let detailsVisible = split.isAreaVisible(Area.DETAILS);\n <ymusrmgmt-pane-toggle-button\n icon=\"right_panel_close\"\n [rotated]=\"!detailsVisible\"\n [tooltip]=\"\n (detailsVisible\n ? 'yuv.app.user-management.label.pane.hideUserDetails.tooltip'\n : 'yuv.app.user-management.label.pane.showUserDetails.tooltip'\n ) | translate\n \"\n (toggled)=\"split.toggleArea(Area.DETAILS)\"\n />\n </ng-template>\n\n <!-- Enabled/disabled filtering isn't supported for group members - only offered while viewing \"All users\". -->\n <ng-template #userFilterActions>\n @if (!groupId) {\n <button\n mat-icon-button\n class=\"user-filter-trigger\"\n [class.active]=\"enabled !== undefined\"\n [matMenuTriggerFor]=\"userFilterMenu\"\n [matTooltip]=\"'yuv.app.user-management.label.filter.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.label.filter.tooltip' | translate\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n } @else if (group) {\n <button\n mat-icon-button\n (click)=\"openAddGroupMembersDialog(group)\"\n [matTooltip]=\"'yuv.app.user-management.groups.action.addMembers.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.groups.action.addMembers.label' | translate\"\n >\n <mat-icon>{{ icons.actionAddGroupMembers }}</mat-icon>\n </button>\n }\n </ng-template>\n\n <ymt-pane\n [busy]=\"busy()\"\n [yuvBusyOverlay]=\"busy()\"\n [topBarActions]=\"userListTopBarActions\"\n role=\"region\"\n [attr.aria-label]=\"listTitle\"\n >\n <ymt-pane-header\n [icon]=\"groupId ? 'group' : 'family_group'\"\n [title]=\"listTitle\"\n [actions]=\"userFilterActions\"\n >\n <ng-template #yuvPaneHeaderSubtitle>\n <span class=\"pane-subtitle\">\n <span>\n @if (groupId) {\n {{ group?.name }}\n } @else if (enabled === true) {\n {{ 'yuv.app.user-management.label.filter.enabled' | translate }}\n } @else if (enabled === false) {\n {{ 'yuv.app.user-management.label.filter.disabled' | translate }}\n } @else {\n {{ 'yuv.app.user-management.label.rail.allUsers' | translate }}\n }\n </span>\n @if (searchTerm(); as term) {\n <span class=\"search-hint\">{{\n 'yuv.app.user-management.label.search.filtered' | translate : { term }\n }}</span>\n }\n </span>\n </ng-template>\n </ymt-pane-header>\n <ymt-pane-body>\n <mat-table\n [dataSource]=\"dataSource()\"\n class=\"user-table mat-elevation-z8\"\n row\n (keydown)=\"onTableKeydown($event)\"\n >\n <ng-container matColumnDef=\"avatar\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell *matCellDef=\"let element\">\n <ymusrmgmt-user-avatar [user]=\"element\" />\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"user\">\n <mat-header-cell *matHeaderCellDef>{{\n 'yuv.app.user-management.users.property.user' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <div class=\"user-identity\">\n <span class=\"user-username-row\">\n <span class=\"user-username\">{{ element.username }}</span>\n </span>\n <span class=\"user-name-row\">\n <span class=\"user-name\">{{ element.firstName }} {{ element.lastName }}</span>\n </span>\n </div>\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"email\">\n <mat-header-cell *matHeaderCellDef>{{\n 'yuv.app.user-management.users.property.email' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\" class=\"user-email\">\n {{ element.email }}\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell\n *matCellDef=\"let element; let i = index\"\n class=\"user-actions\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"rowMenu\"\n [matMenuTriggerData]=\"{ user: element }\"\n [matTooltip]=\"'yuv.app.user-management.common.action.more.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.common.action.more.label' | translate\"\n [tabIndex]=\"activeRowIndex() === i ? 0 : -1\"\n (click)=\"select(element)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n ymusrmgmt-focusable-row\n *matRowDef=\"let row; columns: displayedColumns; let i = index\"\n (click.single)=\"select(row); focusRow(i)\"\n [attr.tabindex]=\"activeRowIndex() === i ? 0 : -1\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"activeRowIndex() === i\"\n [class.user-row--inactive]=\"!row.enabled\"\n class=\"user-row\"\n >\n </mat-row>\n <ng-template matNoDataRow>\n @if (!busy() && selectedGroupDetails(); as group) {\n <div class=\"empty-group-state\">\n <span class=\"empty-group-state-icon\"\n ><mat-icon aria-hidden=\"true\">group_off</mat-icon></span\n >\n <h3 class=\"empty-group-state-title\">\n {{ 'yuv.app.user-management.label.emptyGroup.title' | translate }}\n </h3>\n <p class=\"empty-group-state-description\">\n {{\n 'yuv.app.user-management.label.emptyGroup.description'\n | translate : { name: group.name }\n }}\n </p>\n <button ymtButton=\"primary\" (click)=\"openAddGroupMembersDialog(group)\">\n <mat-icon>{{ icons.actionAddGroupMembers }}</mat-icon>\n {{ 'yuv.app.user-management.groups.action.addMembers.label' | translate }}\n </button>\n </div>\n }\n </ng-template>\n </mat-table>\n </ymt-pane-body>\n <ymt-pane-footer>\n <mat-paginator\n class=\"paginator\"\n [length]=\"pagination.total\"\n [pageIndex]=\"pagination.page\"\n [pageSize]=\"pageSize()\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [attr.aria-label]=\"\n 'yuv.app.user-management.users.label.navigation.pagination.aria' | translate\n \"\n (page)=\"onChangePage($event)\"\n ></mat-paginator>\n </ymt-pane-footer>\n </ymt-pane>\n </ng-template>\n\n <ng-template yuvSplitArea [size]=\"20\">\n <ng-template #userDetailsPaneTopBarActions>\n <ymusrmgmt-pane-toggle-button\n align=\"start\"\n icon=\"right_panel_close\"\n [tooltip]=\"'yuv.app.user-management.label.pane.hideUserDetails.tooltip' | translate\"\n (toggled)=\"split.hideArea(Area.DETAILS)\"\n />\n </ng-template>\n\n <ymusrmgmt-user-details\n [user]=\"selectedUser()\"\n [groupRoles]=\"selectedGroupRoles()\"\n [topBarActions]=\"userDetailsPaneTopBarActions\"\n (editUser)=\"editUser($event)\"\n />\n </ng-template>\n </yuv-split-view>\n\n @if (!split.isAreaVisible(Area.DETAILS)) {\n <ymusrmgmt-pane-gutter\n icon=\"right_panel_open\"\n [label]=\"'yuv.app.user-management.users.label.details.title' | translate\"\n [tooltip]=\"'yuv.app.user-management.label.pane.showUserDetails.tooltip' | translate\"\n (expand)=\"split.showArea(Area.DETAILS)\"\n />\n }\n</main>\n\n<mat-menu #rowMenu=\"matMenu\">\n <ng-template matMenuContent let-user=\"user\">\n @for (action of rowActionsFor(user); track action.id) {\n <button mat-menu-item [disabled]=\"action.disabled\" (click)=\"action.callback?.(action)\">\n <mat-icon>{{ action.icon }}</mat-icon>\n <span>{{ action.label }}</span>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<mat-menu #userFilterMenu=\"matMenu\">\n <button mat-menu-item (click)=\"onEnabledFilterSelected(undefined)\">\n <mat-icon>{{\n enabledFilter() === undefined ? 'radio_button_checked' : 'radio_button_unchecked'\n }}</mat-icon>\n <span>{{ 'yuv.app.user-management.label.rail.allUsers' | translate }}</span>\n </button>\n <button mat-menu-item (click)=\"onEnabledFilterSelected(true)\">\n <mat-icon>{{\n enabledFilter() === true ? 'radio_button_checked' : 'radio_button_unchecked'\n }}</mat-icon>\n <span>{{ 'yuv.app.user-management.label.filter.enabled' | translate }}</span>\n </button>\n <button mat-menu-item (click)=\"onEnabledFilterSelected(false)\">\n <mat-icon>{{\n enabledFilter() === false ? 'radio_button_checked' : 'radio_button_unchecked'\n }}</mat-icon>\n <span>{{ 'yuv.app.user-management.label.filter.disabled' | translate }}</span>\n </button>\n</mat-menu>\n","import { Route } from '@angular/router';\nimport { YuvUserManagementComponent } from './container/user-management.component';\n\nexport const YuvUserManagementRoutes: Route[] = [\n // The single directory view for both users and groups, bound directly at the app's own base\n // path - which group (if any) is currently scoping the list is a `?group=<id>` query param\n // rather than a path segment, so switching between \"All users\" and any group (or between two\n // different groups) never destroys/recreates this component: Angular only remounts across\n // genuinely different route configs, and query param changes alone never do that (see\n // YuvUserManagementComponent.ngOnInit). A `?search=<term>` query param is kept in sync with the\n // search box the same way, both read and written (see\n // YuvUserManagementComponent#syncRouteToSearch/#applySearchFromRoute).\n { path: '', component: YuvUserManagementComponent },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3","i4","i5","i6","i1","components","modules","i7","i9","i8"],"mappings":"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"}