@masterteam/delegations 0.0.52 → 0.0.53

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":"masterteam-delegations.mjs","sources":["../../../../packages/masterteam/delegations/src/runtime/delegation-runtime.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-prompt-receipts.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.actions.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.model.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-token-vault.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.state.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-user-entity.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-candidates-prompt-dialog/delegation-candidates-prompt-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-candidates-prompt-dialog/delegation-candidates-prompt-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-status-chip/delegation-status-chip.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-menu-panel/delegation-menu-panel.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-menu-panel/delegation-menu-panel.html","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.ts","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.html","../../../../packages/masterteam/delegations/src/store/delegations/delegations.actions.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.model.ts","../../../../packages/masterteam/delegations/src/store/delegations/scope-fingerprint.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.state.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-scope-display.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-scope-options.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.html","../../../../packages/masterteam/delegations/src/interceptors/app-delegation.interceptor.ts","../../../../packages/masterteam/delegations/src/store/index.ts","../../../../packages/masterteam/delegations/src/public-api.ts","../../../../packages/masterteam/delegations/src/masterteam-delegations.ts"],"sourcesContent":["import { HttpContext, HttpContextToken } from '@angular/common/http';\r\nimport {\r\n EnvironmentProviders,\r\n InjectionToken,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport type { ActiveDelegationSession } from '../store/session/delegation-session.model';\r\n\r\nexport interface DelegationPromptNamespace {\r\n userId: string;\r\n applicationKey: string;\r\n tenantKey?: string | null;\r\n}\r\n\r\nexport interface DelegationContextChange {\r\n previous: ActiveDelegationSession | null;\r\n current: ActiveDelegationSession | null;\r\n reason: string;\r\n}\r\n\r\nexport interface DelegationRuntimeConfig {\r\n resolveApplicationApiBaseUrl: () => string;\n resolvePromptNamespace: () => DelegationPromptNamespace;\n onContextChanged: (change: DelegationContextChange) => void | Promise<void>;\n}\r\n\r\nexport type DelegationRuntimeConfigFactory = () => DelegationRuntimeConfig;\r\n\r\nconst DEFAULT_CONFIG: DelegationRuntimeConfig = {\r\n resolveApplicationApiBaseUrl: () => '',\r\n resolvePromptNamespace: () => ({\r\n userId: 'anonymous',\r\n applicationKey: 'default',\r\n tenantKey: 'default',\r\n }),\r\n onContextChanged: () => undefined,\n};\r\n\r\nexport const DELEGATION_RUNTIME_CONFIG =\r\n new InjectionToken<DelegationRuntimeConfig>('DELEGATION_RUNTIME_CONFIG', {\r\n factory: () => DEFAULT_CONFIG,\r\n });\r\n\r\nexport function provideDelegationRuntime(\r\n config: DelegationRuntimeConfig | DelegationRuntimeConfigFactory,\r\n): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: DELEGATION_RUNTIME_CONFIG,\r\n useFactory: () => (typeof config === 'function' ? config() : config),\r\n },\r\n ]);\r\n}\r\n\r\n/** Opt-in marker for a trusted first-party business-runtime request. */\r\nexport const DELEGATED_RUNTIME_REQUEST = new HttpContextToken<boolean>(\r\n () => false,\r\n);\r\n\r\nexport function withDelegatedRuntime(\r\n context: HttpContext = new HttpContext(),\r\n): HttpContext {\r\n return context.set(DELEGATED_RUNTIME_REQUEST, true);\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { DelegationRow } from '../store/delegations/delegations.model';\r\nimport { DELEGATION_RUNTIME_CONFIG } from './delegation-runtime';\r\n\r\nconst STORAGE_KEY = 'mt.delegation.prompt-receipts.v1';\r\nconst MAX_RECEIPTS = 100;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationPromptReceiptService {\r\n private readonly document = inject(DOCUMENT);\r\n private readonly config = inject(DELEGATION_RUNTIME_CONFIG);\r\n private readonly claimed = new Set<string>();\r\n\r\n /** Atomically claims only candidates that have not already produced a prompt. */\r\n async claimUnseen(candidates: DelegationRow[]): Promise<DelegationRow[]> {\r\n const pairs = await Promise.all(\r\n candidates.map(async (candidate) => ({\r\n candidate,\r\n receipt: await this.receiptFor(candidate),\r\n })),\r\n );\r\n const stored = this.read();\r\n const unseen = pairs.filter(\r\n ({ receipt }) => !stored.includes(receipt) && !this.claimed.has(receipt),\r\n );\r\n if (!unseen.length) {\r\n return [];\r\n }\r\n\r\n unseen.forEach(({ receipt }) => this.claimed.add(receipt));\r\n this.write([...stored, ...unseen.map(({ receipt }) => receipt)]);\r\n return unseen.map(({ candidate }) => candidate);\r\n }\r\n\r\n private async receiptFor(candidate: DelegationRow): Promise<string> {\r\n const namespace = this.config.resolvePromptNamespace();\r\n const input = [\r\n namespace.userId,\r\n namespace.applicationKey,\r\n namespace.tenantKey ?? '',\r\n candidate.delegationId,\r\n candidate.rowVersion,\r\n ].join('|');\r\n const crypto = this.document.defaultView?.crypto ?? globalThis.crypto;\r\n if (crypto?.subtle) {\r\n const digest = await crypto.subtle.digest(\r\n 'SHA-256',\r\n new TextEncoder().encode(input),\r\n );\r\n return Array.from(new Uint8Array(digest), (value) =>\r\n value.toString(16).padStart(2, '0'),\r\n ).join('');\r\n }\r\n\r\n // Deterministic non-reversible fallback for test/non-secure browser contexts.\r\n let hash = 2166136261;\r\n for (const char of input) {\r\n hash ^= char.charCodeAt(0);\r\n hash = Math.imul(hash, 16777619);\r\n }\r\n return `f${(hash >>> 0).toString(16).padStart(8, '0')}`;\r\n }\r\n\r\n private read(): string[] {\r\n try {\r\n const raw = this.document.defaultView?.localStorage.getItem(STORAGE_KEY);\r\n const parsed: unknown = raw ? JSON.parse(raw) : [];\r\n return Array.isArray(parsed)\r\n ? parsed.filter((item): item is string => typeof item === 'string')\r\n : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n private write(receipts: string[]): void {\r\n try {\r\n const bounded = [...new Set(receipts)].slice(-MAX_RECEIPTS);\r\n this.document.defaultView?.localStorage.setItem(\r\n STORAGE_KEY,\r\n JSON.stringify(bounded),\r\n );\r\n } catch {\r\n // Storage can be unavailable; the in-memory claim still coalesces dialogs.\r\n }\r\n }\r\n}\r\n","import { DelegationRow } from '../delegations/delegations.model';\r\nimport { DelegationSessionInvalidationReason } from './delegation-session.model';\r\n\r\n/** Fetch the active delegations the current user may start (user/activedelegations). */\r\nexport class LoadDelegationCandidates {\r\n static readonly type = '[DelegationSession] Load Candidates';\r\n constructor(\r\n public page: number = 1,\r\n public pageSize: number = 25,\r\n public append: boolean = false,\r\n ) {}\r\n}\r\n\r\n/** Start a delegated session for the given assignment row. */\r\nexport class StartDelegationSession {\r\n static readonly type = '[DelegationSession] Start';\r\n constructor(public delegation: DelegationRow) {}\r\n}\r\n\r\n/** End the current delegated session. Client-local only (doc 05). */\r\nexport class EndDelegationSession {\r\n static readonly type = '[DelegationSession] End';\r\n constructor(public reason: DelegationSessionInvalidationReason = 'Manual') {}\r\n}\r\n\r\n/** Switch directly from the current session to another delegation. */\r\nexport class SwitchDelegationSession {\r\n static readonly type = '[DelegationSession] Switch';\r\n constructor(public delegation: DelegationRow) {}\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\nimport { DelegationRow } from '../delegations/delegations.model';\r\n\r\n/**\r\n * Active delegated session. Memory-only by design (doc 05):\r\n * the delegation token is never persisted to long-lived storage.\r\n *\r\n * `delegation.delegatedUser` is the executed-by (actual logged-in) user and\r\n * `delegation.delegator` is the on-behalf-of user — both already present on the\r\n * row from the active-delegations endpoint.\r\n */\r\nexport interface ActiveDelegationSession {\r\n delegation: DelegationRow;\r\n expiresAtUtc: string;\r\n delegationVersion: number;\r\n}\r\n\r\nexport interface DelegationSessionStartResponse {\r\n accessToken: string;\r\n expiresAtUtc: string;\r\n delegationId: number;\r\n delegationVersion: number;\r\n}\r\n\r\nexport type DelegationSessionInvalidationReason =\r\n | 'TokenInvalid'\r\n | 'SessionMismatch'\r\n | 'ScopeChanged'\r\n | 'VersionChanged'\r\n | 'ActorMismatch'\r\n | 'ApplicationMismatch'\r\n | 'TenantMismatch'\r\n | 'Expired'\r\n | 'Logout'\r\n | 'UserSwitch'\r\n | 'TenantSwitch'\r\n | 'AppSwitch'\r\n | 'Manual';\r\n\r\nexport enum DelegationSessionActionKey {\r\n LoadCandidates = 'loadCandidates',\r\n StartSession = 'startSession',\r\n}\r\n\r\nexport interface DelegationSessionStateModel extends LoadingStateShape<DelegationSessionActionKey> {\r\n active: ActiveDelegationSession | null;\r\n candidates: DelegationRow[];\r\n candidatesPage: number;\r\n candidatesPageSize: number;\r\n candidatesTotalCount: number;\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n/** Package-private: raw delegated credentials never enter NGXS or public models. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationTokenVault {\r\n private readonly value = signal<string | null>(null);\r\n\r\n readonly token = this.value.asReadonly();\r\n\r\n set(token: string): void {\r\n this.value.set(token);\r\n }\r\n\r\n clear(): void {\r\n this.value.set(null);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n Action,\r\n Actions,\r\n ofActionDispatched,\r\n ofActionSuccessful,\r\n Selector,\r\n State,\r\n StateContext,\r\n Store,\r\n} from '@ngxs/store';\r\nimport { handleApiRequest } from '@masterteam/components';\r\nimport { EMPTY, from, switchMap } from 'rxjs';\r\nimport { DELEGATION_RUNTIME_CONFIG } from '../../runtime/delegation-runtime';\r\nimport { DelegationTokenVault } from '../../runtime/delegation-token-vault';\r\nimport { Response } from '../delegations/api.model';\r\nimport {\r\n DelegationPage,\r\n DelegationRow,\r\n} from '../delegations/delegations.model';\r\nimport {\r\n EndDelegationSession,\r\n LoadDelegationCandidates,\r\n StartDelegationSession,\r\n SwitchDelegationSession,\r\n} from './delegation-session.actions';\r\nimport {\r\n ActiveDelegationSession,\r\n DelegationSessionActionKey,\r\n DelegationSessionStartResponse,\r\n DelegationSessionStateModel,\r\n} from './delegation-session.model';\r\n\r\nconst BASE = 'identity/delegations';\r\n\r\n// Action shells matching gateway-auth type strings - loose coupling, matched by\r\n// `type` only so this package does not depend on @masterteam/gateway-auth.\r\nclass GatewayLoginSuccessShell {\r\n static readonly type = '[Auth] Login Success';\r\n}\r\nclass GatewayLogoutShell {\r\n static readonly type = '[Auth] Logout';\r\n}\r\nclass GatewayLoginFailureShell {\r\n static readonly type = '[Auth] Login Failure';\r\n}\r\nclass GatewayLaunchApplicationShell {\r\n static readonly type = '[Auth] Launch Application';\r\n}\r\nclass GatewaySetAppSessionShell {\r\n static readonly type = '[Auth] Set App Session';\r\n}\r\nclass GatewayRestoreBrowserHandoffShell {\r\n static readonly type = '[Auth] Restore Browser Handoff';\r\n}\r\nclass GatewayClearAppSessionShell {\r\n static readonly type = '[Auth] Clear App Session';\r\n}\r\nclass GatewayClearAllAppSessionsShell {\r\n static readonly type = '[Auth] Clear All App Sessions';\r\n}\r\n\r\nconst CLEAR_CANDIDATE_REASONS = [\r\n 'Logout',\r\n 'UserSwitch',\r\n 'TenantSwitch',\r\n 'AppSwitch',\r\n] as const;\r\n\r\nfunction shouldClearCandidates(reason: string): boolean {\r\n return CLEAR_CANDIDATE_REASONS.some((candidate) => candidate === reason);\r\n}\r\n\r\nfunction canStart(row: DelegationRow): boolean {\r\n return (\r\n row.effectiveStatus === 'Active' &&\r\n row.allowedActions?.includes('StartSession')\r\n );\r\n}\r\n\r\n@State<DelegationSessionStateModel>({\r\n name: 'delegationSession',\r\n defaults: {\r\n active: null,\r\n candidates: [],\r\n candidatesPage: 1,\r\n candidatesPageSize: 25,\r\n candidatesTotalCount: 0,\r\n loadingActive: [],\r\n errors: {},\r\n },\r\n})\r\n@Injectable()\r\nexport class DelegationSessionState {\r\n private http = inject(HttpClient);\r\n private actions$ = inject(Actions);\r\n private store = inject(Store);\r\n private vault = inject(DelegationTokenVault);\r\n private runtime = inject(DELEGATION_RUNTIME_CONFIG);\r\n private expiryTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n this.actions$\r\n .pipe(ofActionSuccessful(GatewayLoginSuccessShell))\r\n .subscribe(() =>\r\n // Only (re)load candidates here. The prompt flag is NOT reset on login\r\n // because the host re-dispatches \"Login Success\" on every bootstrap /\r\n // refresh — resetting here would re-prompt on each refresh. The flag is\r\n // reset on explicit logout / user / app switch (see EndDelegationSession),\r\n // so the prompt fires once per real login.\r\n this.store.dispatch(new LoadDelegationCandidates()),\r\n );\r\n\r\n this.actions$\r\n .pipe(ofActionDispatched(GatewayLogoutShell, GatewayLoginFailureShell))\r\n .subscribe(() => this.store.dispatch(new EndDelegationSession('Logout')));\r\n\r\n this.actions$\r\n .pipe(\r\n ofActionDispatched(\r\n GatewayLaunchApplicationShell,\r\n GatewaySetAppSessionShell,\r\n GatewayRestoreBrowserHandoffShell,\r\n GatewayClearAppSessionShell,\r\n GatewayClearAllAppSessionsShell,\r\n ),\r\n )\r\n .subscribe(() =>\r\n this.store.dispatch(new EndDelegationSession('AppSwitch')),\r\n );\r\n\r\n this.actions$\r\n .pipe(\r\n ofActionSuccessful(\r\n GatewayLaunchApplicationShell,\r\n GatewaySetAppSessionShell,\r\n GatewayRestoreBrowserHandoffShell,\r\n ),\r\n )\r\n .subscribe(() => this.store.dispatch(new LoadDelegationCandidates()));\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Selectors\r\n // ---------------------------------------------------------------------------\r\n\r\n @Selector()\r\n static getActive(\r\n state: DelegationSessionStateModel,\r\n ): ActiveDelegationSession | null {\r\n return state.active;\r\n }\r\n\r\n @Selector()\r\n static getCandidates(state: DelegationSessionStateModel): DelegationRow[] {\r\n return state.candidates;\r\n }\r\n\r\n @Selector()\r\n static getCandidatesTotalCount(state: DelegationSessionStateModel): number {\r\n return state.candidatesTotalCount;\r\n }\r\n\r\n @Selector()\r\n static isDelegated(state: DelegationSessionStateModel): boolean {\r\n return !!state.active;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: DelegationSessionStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: DelegationSessionStateModel,\r\n ): Record<string, string | null | undefined> {\r\n return state.errors;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Actions\r\n // ---------------------------------------------------------------------------\r\n\r\n @Action(LoadDelegationCandidates)\r\n loadCandidates(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { page, pageSize, append }: LoadDelegationCandidates,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/user/activedelegations`,\r\n {\r\n params: new HttpParams().set('page', page).set('pageSize', pageSize),\r\n },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationSessionActionKey.LoadCandidates,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const next = (response.data?.items ?? []).filter(canStart);\r\n const current = append ? ctx.getState().candidates : [];\r\n const candidates = [...current, ...next].filter(\r\n (row, index, rows) =>\r\n rows.findIndex(\r\n (candidate) => candidate.delegationId === row.delegationId,\r\n ) === index,\r\n );\r\n const active = ctx.getState().active;\r\n if (\r\n active &&\r\n page === 1 &&\r\n !candidates.some(\r\n (row) => row.delegationId === active.delegation.delegationId,\r\n ) &&\r\n (response.data?.totalCount ?? 0) <= pageSize\r\n ) {\r\n queueMicrotask(() =>\r\n this.store.dispatch(new EndDelegationSession('ScopeChanged')),\r\n );\r\n }\r\n return {\r\n candidates,\r\n candidatesPage: response.data?.page ?? page,\r\n candidatesPageSize: response.data?.pageSize ?? pageSize,\r\n candidatesTotalCount: response.data?.totalCount ?? candidates.length,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(StartDelegationSession)\r\n start(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { delegation }: StartDelegationSession,\r\n ) {\r\n const previous = ctx.getState().active;\r\n return this.startSession(ctx, delegation, previous, 'StartSession');\r\n }\r\n\r\n private startSession(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n delegation: DelegationRow,\r\n previous: ActiveDelegationSession | null,\r\n reason: string,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationSessionStartResponse>>(\r\n `${BASE}/${delegation.delegationId}/session`,\r\n {},\r\n {\r\n headers: new HttpHeaders({ noMessage: 'true' }),\r\n },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationSessionActionKey.StartSession,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n this.vault.set(response.data.accessToken);\r\n const active: ActiveDelegationSession = {\r\n delegation,\r\n expiresAtUtc: response.data.expiresAtUtc,\r\n delegationVersion: response.data.delegationVersion,\r\n };\r\n this.scheduleExpiry(active);\r\n return { active };\r\n },\r\n }).pipe(\r\n switchMap(() =>\r\n from(\r\n Promise.resolve(\r\n this.runtime.onContextChanged({\r\n previous,\r\n current: ctx.getState().active,\r\n reason,\r\n }),\r\n ),\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n @Action(EndDelegationSession)\r\n end(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { reason }: EndDelegationSession,\r\n ) {\r\n // Client-local only — there is no server end-session endpoint (doc 05).\r\n const previous = ctx.getState().active;\r\n if (!previous && !this.vault.token()) {\r\n return EMPTY;\r\n }\r\n this.clearExpiry();\r\n this.vault.clear();\r\n ctx.patchState({\r\n active: null,\r\n ...(shouldClearCandidates(reason)\r\n ? { candidates: [], candidatesTotalCount: 0, candidatesPage: 1 }\r\n : {}),\r\n });\r\n return from(\r\n Promise.resolve(\r\n this.runtime.onContextChanged({ previous, current: null, reason }),\r\n ),\r\n ).pipe(\r\n switchMap(() =>\r\n shouldClearCandidates(reason)\r\n ? EMPTY\r\n : this.store.dispatch(new LoadDelegationCandidates()),\r\n ),\r\n );\r\n }\r\n\r\n @Action(SwitchDelegationSession)\r\n switch(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { delegation }: SwitchDelegationSession,\r\n ) {\r\n const previous = ctx.getState().active;\r\n return this.startSession(ctx, delegation, previous, 'SwitchSession');\r\n }\r\n\r\n private scheduleExpiry(active: ActiveDelegationSession): void {\r\n this.clearExpiry();\r\n const delay = Math.max(0, Date.parse(active.expiresAtUtc) - Date.now());\r\n this.expiryTimer = setTimeout(\r\n () => this.store.dispatch(new EndDelegationSession('Expired')),\r\n delay,\r\n );\r\n }\r\n\r\n private clearExpiry(): void {\r\n if (this.expiryTimer !== null) {\r\n clearTimeout(this.expiryTimer);\r\n this.expiryTimer = null;\r\n }\r\n }\r\n}\r\n","import { computed, inject, Injectable } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport { finalize, Observable, shareReplay } from 'rxjs';\r\nimport { DelegationPromptReceiptService } from '../../runtime/delegation-prompt-receipts';\r\nimport {\r\n EndDelegationSession,\r\n LoadDelegationCandidates,\r\n StartDelegationSession,\r\n SwitchDelegationSession,\r\n} from './delegation-session.actions';\r\nimport {\r\n DelegationSessionActionKey,\r\n DelegationSessionInvalidationReason,\r\n DelegationSessionStateModel,\r\n} from './delegation-session.model';\r\nimport { DelegationSessionState } from './delegation-session.state';\r\nimport { DelegationRow } from '../delegations/delegations.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationSessionFacade {\r\n private readonly store = inject(Store);\r\n private readonly promptReceipts = inject(DelegationPromptReceiptService);\r\n private endInFlight: Observable<unknown> | null = null;\r\n\r\n // ---------------------------------------------------------------------------\r\n // Data slices\r\n // ---------------------------------------------------------------------------\r\n readonly active = select(DelegationSessionState.getActive);\r\n readonly candidates = select(DelegationSessionState.getCandidates);\r\n readonly candidatesTotalCount = select(\r\n DelegationSessionState.getCandidatesTotalCount,\r\n );\r\n readonly isDelegated = select(DelegationSessionState.isDelegated);\r\n\r\n private readonly loadingActive = select(\r\n DelegationSessionState.getLoadingActive,\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Derived (interceptor + topbar)\r\n // ---------------------------------------------------------------------------\r\n /** On-behalf-of (delegator). */\r\n readonly onBehalfOf = computed(\r\n () => this.active()?.delegation.delegator ?? null,\r\n );\r\n /** Executed-by (actual logged-in / delegated user). */\r\n readonly executedBy = computed(\r\n () => this.active()?.delegation.delegatedUser ?? null,\r\n );\r\n readonly hasCandidates = computed(() => this.candidates().length > 0);\r\n readonly hasMoreCandidates = computed(\r\n () => this.candidates().length < this.candidatesTotalCount(),\r\n );\r\n\r\n readonly isStarting = computed(() =>\r\n this.loadingActive().includes(DelegationSessionActionKey.StartSession),\r\n );\r\n readonly isLoadingCandidates = computed(() =>\r\n this.loadingActive().includes(DelegationSessionActionKey.LoadCandidates),\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Dispatchers\r\n // ---------------------------------------------------------------------------\r\n loadCandidates(page = 1, pageSize = 25, append = false) {\r\n return this.store.dispatch(\r\n new LoadDelegationCandidates(page, pageSize, append),\r\n );\r\n }\r\n loadMoreCandidates() {\r\n const state = this.store.selectSnapshot<DelegationSessionStateModel>(\r\n (snapshot) => snapshot.delegationSession,\r\n );\r\n if (!state || state.candidates.length >= state.candidatesTotalCount) {\r\n return this.store.dispatch([]);\r\n }\r\n return this.loadCandidates(\r\n state.candidatesPage + 1,\r\n state.candidatesPageSize,\r\n true,\r\n );\r\n }\r\n claimPromptCandidates(candidates: DelegationRow[]) {\r\n return this.promptReceipts.claimUnseen(candidates);\r\n }\r\n startSession(delegation: DelegationRow) {\r\n return this.store.dispatch(new StartDelegationSession(delegation));\r\n }\r\n switchSession(delegation: DelegationRow) {\r\n return this.store.dispatch(new SwitchDelegationSession(delegation));\r\n }\r\n endSession(reason: DelegationSessionInvalidationReason = 'Manual') {\r\n if (this.endInFlight) {\r\n return this.endInFlight;\r\n }\r\n const operation = this.store\r\n .dispatch(new EndDelegationSession(reason))\r\n .pipe(\r\n finalize(() => (this.endInFlight = null)),\r\n shareReplay({ bufferSize: 1, refCount: false }),\r\n );\r\n this.endInFlight = operation;\r\n return operation;\r\n }\r\n}\r\n","import type {\r\n EntityData,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport type { DelegationParty } from '../../store/delegations/delegations.model';\r\n\r\nexport function toDelegationUserValue(\r\n party: DelegationParty | null | undefined,\r\n): EntityUserValue {\r\n const displayName = party?.displayName?.trim() || party?.email?.trim() || '';\r\n\r\n return {\r\n id: party?.userId,\r\n displayName,\r\n email: party?.email ?? undefined,\r\n };\r\n}\r\n\r\nexport function toDelegationUserEntity(\r\n party: DelegationParty | null | undefined,\r\n options: { showEmail?: boolean; label?: string } = {},\r\n): EntityData {\r\n return {\r\n name: options.label ?? '',\r\n viewType: 'User',\r\n value: toDelegationUserValue(party),\r\n configuration: {\r\n hideLabel: !options.label,\r\n showDisplayName: true,\r\n showEmail: options.showEmail ?? true,\r\n },\r\n };\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\n/**\r\n * Confirmation dialog before starting (or switching to) a delegated session.\r\n * Calls the facade, which POSTs to `delegationToken/{id}` and stores the raw\r\n * token in memory only.\r\n */\r\n@Component({\r\n selector: 'mt-start-session-dialog',\r\n imports: [CommonModule, Button, EntityPreview, TranslocoDirective],\r\n templateUrl: './start-session-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class StartSessionDialog {\r\n readonly delegation = input.required<DelegationRow>();\r\n readonly intent = input<'start' | 'switch'>('start');\r\n\r\n private readonly ref: ModalRef = inject(ModalRef);\r\n private readonly facade = inject(DelegationSessionFacade);\r\n private readonly toast = inject(ToastService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n protected readonly isBusy = this.facade.isStarting;\r\n\r\n protected readonly bodyKey = computed(() =>\r\n this.intent() === 'switch'\r\n ? 'delegations.session.switchConfirmBody'\r\n : 'delegations.session.startConfirmBody',\r\n );\r\n protected readonly confirmLabelKey = computed(() =>\r\n this.intent() === 'switch'\r\n ? 'delegations.action.switchSession'\r\n : 'delegations.action.startSession',\r\n );\r\n protected readonly successMessageKey = computed(() =>\r\n this.intent() === 'switch'\r\n ? 'delegations.session.switched'\r\n : 'delegations.session.started',\r\n );\r\n\r\n protected userEntity(party: DelegationRow['delegator']) {\r\n return toDelegationUserEntity(party, { showEmail: false });\r\n }\r\n\r\n confirm(): void {\r\n const row = this.delegation();\r\n const op$ =\r\n this.intent() === 'switch'\r\n ? this.facade.switchSession(row)\r\n : this.facade.startSession(row);\r\n op$.subscribe({\r\n next: () => {\r\n this.toast.success(this.transloco.translate(this.successMessageKey()));\r\n this.ref.close(true);\r\n },\r\n error: () => {\r\n /* error surfaced via shared toast pipeline; keep dialog open */\r\n },\r\n });\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col gap-4 p-2\">\r\n <div class=\"flex items-start gap-3\">\r\n <div class=\"flex flex-col min-w-0\">\r\n <mt-entity-preview\r\n [data]=\"userEntity(delegation().delegator)\"\r\n ></mt-entity-preview>\r\n </div>\r\n </div>\r\n\r\n <p class=\"text-sm text-surface-600 leading-relaxed\">\r\n {{ t(bodyKey()) }}\r\n </p>\r\n\r\n <div class=\"flex justify-end gap-2 pt-2 border-t border-surface-200\">\r\n <mt-button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n [label]=\"t('delegations.common.cancel')\"\r\n [disabled]=\"isBusy()\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n <mt-button\r\n color=\"primary\"\r\n icon=\"user.users-check\"\r\n [label]=\"t(confirmLabelKey())\"\r\n [loading]=\"isBusy()\"\r\n (click)=\"confirm()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\n/**\r\n * Post-login candidate prompt. It intentionally only lets the user choose a\r\n * delegation; the existing StartSessionDialog still performs explicit consent.\r\n */\r\n@Component({\r\n selector: 'mt-delegation-candidates-prompt-dialog',\r\n imports: [CommonModule, Button, EntityPreview, Icon, TranslocoDirective],\r\n templateUrl: './delegation-candidates-prompt-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationCandidatesPromptDialog {\r\n readonly candidates = input.required<DelegationRow[]>();\r\n\r\n private readonly ref: ModalRef = inject(ModalRef);\r\n\r\n protected userEntity(party: DelegationRow['delegator']) {\r\n return toDelegationUserEntity(party, { showEmail: false });\r\n }\r\n\r\n protected select(row: DelegationRow): void {\r\n this.ref.close(row);\r\n }\r\n\r\n protected close(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col gap-4 p-2\">\r\n <p class=\"text-sm leading-relaxed text-surface-600\">\r\n {{ t(\"delegations.session.promptBody\") }}\r\n </p>\r\n\r\n <div class=\"flex max-h-80 flex-col gap-2 overflow-y-auto pr-1\">\r\n @for (cand of candidates(); track cand.delegationId) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center justify-between gap-3 rounded-2xl border border-solid border-surface-200 bg-surface-0 px-3 py-3 text-start transition-colors hover:border-primary-300 hover:bg-primary-50/50 focus-visible:border-primary-400 focus-visible:outline-none\"\r\n [attr.aria-label]=\"\r\n t('delegations.session.promptStartAria', {\r\n delegatorName: cand.delegator.displayName,\r\n })\r\n \"\r\n (click)=\"select(cand)\"\r\n >\r\n <span class=\"flex min-w-0 items-center gap-3\">\r\n <mt-entity-preview\r\n [data]=\"userEntity(cand.delegator)\"\r\n ></mt-entity-preview>\r\n </span>\r\n <span\r\n class=\"inline-flex shrink-0 items-center gap-1.5 text-sm font-medium text-primary\"\r\n >\r\n <span class=\"hidden sm:inline\">\r\n {{ t(\"delegations.action.startSession\") }}\r\n </span>\r\n <mt-icon icon=\"arrow.arrow-right\" class=\"text-base\"></mt-icon>\r\n </span>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"flex justify-end border-t border-surface-200 pt-3\">\r\n <mt-button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n [label]=\"t('delegations.common.close')\"\r\n (click)=\"close()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Chip } from '@masterteam/components/chip';\r\nimport { DelegationEffectiveStatus } from '../../../store/delegations/delegations.model';\r\n\r\ninterface StatusVisual {\r\n i18nKey: string;\r\n styleClass: string;\r\n}\r\n\r\nconst STATUS_VISUAL: Record<\r\n DelegationEffectiveStatus | 'InactiveToday',\r\n StatusVisual\r\n> = {\r\n Active: {\r\n i18nKey: 'delegations.status.active',\r\n styleClass: 'mt-status-chip mt-status-chip--active',\r\n },\r\n Scheduled: {\r\n i18nKey: 'delegations.status.scheduled',\r\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\r\n },\r\n PendingApproval: {\r\n i18nKey: 'delegations.status.pendingApproval',\r\n styleClass: 'mt-status-chip mt-status-chip--pending',\r\n },\r\n InactiveToday: {\r\n i18nKey: 'delegations.status.inactiveToday',\r\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\r\n },\r\n Expired: {\r\n i18nKey: 'delegations.status.expired',\r\n styleClass: 'mt-status-chip mt-status-chip--expired',\r\n },\r\n Rejected: {\r\n i18nKey: 'delegations.status.rejected',\r\n styleClass: 'mt-status-chip mt-status-chip--rejected',\r\n },\r\n Cancelled: {\r\n i18nKey: 'delegations.status.cancelled',\r\n styleClass: 'mt-status-chip mt-status-chip--cancelled',\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'mt-delegation-status-chip',\r\n standalone: true,\r\n imports: [Chip, TranslocoDirective],\r\n template: `\r\n <ng-container *transloco=\"let t\">\r\n @let v = visual();\r\n <mt-chip [label]=\"t(v.i18nKey)\" [styleClass]=\"v.styleClass\"></mt-chip>\r\n </ng-container>\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: inline-flex;\r\n }\r\n :host ::ng-deep .mt-status-chip {\r\n font-weight: 500;\r\n font-size: 0.75rem;\r\n border-radius: 9999px;\r\n padding-inline: 0.625rem;\r\n padding-block: 0.125rem;\r\n }\r\n :host ::ng-deep .mt-status-chip--active {\r\n background-color: rgb(220 252 231);\r\n color: rgb(22 101 52);\r\n }\r\n :host ::ng-deep .mt-status-chip--scheduled {\r\n background-color: rgb(219 234 254);\r\n color: rgb(30 64 175);\r\n }\r\n :host ::ng-deep .mt-status-chip--pending {\r\n background-color: rgb(254 249 195);\r\n color: rgb(133 77 14);\r\n }\r\n :host ::ng-deep .mt-status-chip--expired {\r\n background-color: rgb(243 244 246);\r\n color: rgb(75 85 99);\r\n }\r\n :host ::ng-deep .mt-status-chip--rejected {\r\n background-color: rgb(254 226 226);\r\n color: rgb(153 27 27);\r\n }\r\n :host ::ng-deep .mt-status-chip--cancelled {\r\n background-color: rgb(229 231 235);\r\n color: rgb(55 65 81);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--active {\r\n background-color: rgba(34, 197, 94, 0.2);\r\n color: rgb(134 239 172);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--scheduled {\r\n background-color: rgba(59, 130, 246, 0.2);\r\n color: rgb(147 197 253);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--pending {\r\n background-color: rgba(234, 179, 8, 0.2);\r\n color: rgb(253 224 71);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--expired {\r\n background-color: rgba(148, 163, 184, 0.2);\r\n color: rgb(203 213 225);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--rejected {\r\n background-color: rgba(239, 68, 68, 0.2);\r\n color: rgb(252 165 165);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--cancelled {\r\n background-color: rgba(148, 163, 184, 0.15);\r\n color: rgb(203 213 225);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class DelegationStatusChip {\r\n readonly status = input.required<DelegationEffectiveStatus>();\r\n readonly reasonCode = input<string | null | undefined>(null);\r\n\r\n protected readonly visual = computed<StatusVisual>(\r\n () =>\r\n STATUS_VISUAL[\r\n this.status() === 'Scheduled' && this.reasonCode() === 'InactiveToday'\r\n ? 'InactiveToday'\r\n : this.status()\r\n ] ?? STATUS_VISUAL.Scheduled,\r\n );\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\r\n\r\n/**\r\n * Embeddable delegation menu content (doc 05, 09): renders the candidate /\r\n * active-session rows and the start / switch / end actions, with no trigger of\r\n * its own. Designed to be dropped inside a host menu (e.g. the user-avatar\r\n * dropdown) or the topbar popover. Reads the shared `DelegationSessionFacade`\r\n * signals; candidate loading + the post-login prompt stay in the always-mounted\r\n * `TopbarDelegationMenu` controller.\r\n *\r\n * Emits `closeRequested` after any action so the host overlay can dismiss.\r\n */\r\n@Component({\r\n selector: 'mt-delegation-menu-panel',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Avatar,\r\n Icon,\r\n RouterLink,\r\n TranslocoDirective,\r\n DelegationStatusChip,\r\n ],\r\n templateUrl: './delegation-menu-panel.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DelegationMenuPanel {\r\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\r\n readonly managePath = input<string>('/delegations');\r\n readonly showManageLink = input<boolean>(true);\r\n readonly closeRequested = output<void>();\r\n\r\n private readonly facade = inject(DelegationSessionFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n protected readonly active = this.facade.active;\r\n protected readonly candidates = this.facade.candidates;\r\n protected readonly hasCandidates = this.facade.hasCandidates;\r\n protected readonly hasMoreCandidates = this.facade.hasMoreCandidates;\r\n protected readonly isLoadingCandidates = this.facade.isLoadingCandidates;\r\n protected readonly onBehalfOf = this.facade.onBehalfOf;\r\n protected readonly executedBy = this.facade.executedBy;\r\n\r\n protected readonly mode = computed<'hidden' | 'candidates' | 'active'>(() => {\r\n if (this.active()) return 'active';\r\n if (this.hasCandidates()) return 'candidates';\r\n return 'hidden';\r\n });\r\n\r\n /** Two-letter initials for a delegator avatar (matches the user-menu pattern). */\r\n protected initials(\r\n party: DelegationRow['delegator'] | null | undefined,\r\n ): string {\r\n const name = party?.displayName?.trim() || party?.email?.trim() || '';\r\n const parts = name.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return '?';\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n }\r\n\r\n protected start(row: DelegationRow, event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closeRequested.emit();\r\n this.openConfirm(row, 'start');\r\n }\r\n\r\n protected switchTo(row: DelegationRow, event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closeRequested.emit();\r\n this.openConfirm(row, 'switch');\r\n }\r\n\r\n protected endSession(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closeRequested.emit();\r\n this.facade.endSession('Manual').subscribe();\r\n }\r\n\r\n protected onManage(): void {\r\n this.closeRequested.emit();\r\n }\r\n\r\n protected loadMore(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.facade.loadMoreCandidates().subscribe();\r\n }\r\n\r\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch'): void {\r\n this.modal.openModal(StartSessionDialog, 'dialog', {\r\n header: this.transloco.translate(\r\n intent === 'switch'\r\n ? 'delegations.action.switchSession'\r\n : 'delegations.action.startSession',\r\n ),\r\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row, intent },\r\n });\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n @if (mode() !== \"hidden\") {\r\n <div class=\"flex w-full flex-col\">\r\n @if (mode() === \"active\" && active(); as session) {\r\n <!-- Active session -->\r\n <div class=\"flex items-center gap-3 border-b border-surface px-4 py-3\">\r\n <mt-avatar\r\n [label]=\"initials(onBehalfOf())\"\r\n shape=\"circle\"\r\n styleClass=\"!size-9 !text-sm !bg-primary-100 !text-primary-700\"\r\n ></mt-avatar>\r\n <div class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"text-[0.625rem] font-medium uppercase text-surface-500\"\r\n >\r\n {{ t(\"delegations.session.actingOnBehalfOf\") }}\r\n </span>\r\n <span class=\"truncate text-sm font-semibold text-surface-900\">\r\n {{ onBehalfOf()?.displayName }}\r\n </span>\r\n <span class=\"truncate text-xs text-surface-500\">\r\n {{\r\n t(\"delegations.session.executedBy\", {\r\n actualUserName: executedBy()?.displayName,\r\n })\r\n }}\r\n </span>\r\n </div>\r\n <mt-delegation-status-chip\r\n status=\"Active\"\r\n ></mt-delegation-status-chip>\r\n </div>\r\n\r\n <div class=\"flex flex-col p-1.5\">\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium text-surface-700 hover:bg-surface-100\"\r\n (click)=\"endSession($event)\"\r\n >\r\n <mt-icon icon=\"arrow.arrow-left\" styleClass=\"text-base\"></mt-icon>\r\n <span>{{ t(\"delegations.action.endSession\") }}</span>\r\n </button>\r\n </div>\r\n\r\n @if (candidates().length > 1) {\r\n <div class=\"border-t border-surface p-1.5\">\r\n <div\r\n class=\"px-2 pb-1 text-[0.625rem] font-medium uppercase text-surface-400\"\r\n >\r\n {{ t(\"delegations.session.switchToAnother\") }}\r\n </div>\r\n @for (cand of candidates(); track cand.delegationId) {\r\n @if (cand.delegationId !== session.delegation.delegationId) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-3 rounded-lg px-2 py-2 text-start hover:bg-surface-100\"\r\n [attr.aria-label]=\"\r\n t('delegations.action.switchSession') +\r\n ': ' +\r\n cand.delegator.displayName\r\n \"\r\n (click)=\"switchTo(cand, $event)\"\r\n >\r\n <mt-avatar\r\n [label]=\"initials(cand.delegator)\"\r\n shape=\"circle\"\r\n styleClass=\"!size-8 !text-xs !bg-surface-100 !text-surface-600\"\r\n ></mt-avatar>\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-sm font-medium text-surface-800\"\r\n >\r\n {{ cand.delegator.displayName }}\r\n </span>\r\n <mt-icon\r\n icon=\"arrow.switch-horizontal-01\"\r\n styleClass=\"text-base text-surface-400\"\r\n ></mt-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n } @else if (mode() === \"candidates\") {\r\n <!-- Candidates available -->\r\n <div class=\"border-b border-surface px-4 py-3\">\r\n <div class=\"text-sm font-semibold text-surface-900\">\r\n {{ t(\"delegations.session.youCanActAs\") }}\r\n </div>\r\n <div class=\"mt-0.5 text-xs text-surface-500\">\r\n {{ t(\"delegations.session.chooseDelegatorHint\") }}\r\n </div>\r\n </div>\r\n <div class=\"flex max-h-72 flex-col overflow-y-auto p-1.5\">\r\n @for (cand of candidates(); track cand.delegationId) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-3 rounded-lg px-2 py-2 text-start hover:bg-surface-100\"\r\n [attr.aria-label]=\"\r\n t('delegations.action.startSession') +\r\n ': ' +\r\n cand.delegator.displayName\r\n \"\r\n (click)=\"start(cand, $event)\"\r\n >\r\n <mt-avatar\r\n [label]=\"initials(cand.delegator)\"\r\n shape=\"circle\"\r\n styleClass=\"!size-8 !text-xs !bg-primary-100 !text-primary-700\"\r\n ></mt-avatar>\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-sm font-medium text-surface-800\">\r\n {{ cand.delegator.displayName }}\r\n </span>\r\n @if (cand.delegator.email) {\r\n <span class=\"truncate text-xs text-surface-500\">\r\n {{ cand.delegator.email }}\r\n </span>\r\n }\r\n </span>\r\n <mt-icon\r\n icon=\"arrow.arrow-right\"\r\n styleClass=\"text-base text-surface-400\"\r\n ></mt-icon>\r\n </button>\r\n }\r\n @if (hasMoreCandidates()) {\r\n <button\r\n type=\"button\"\r\n class=\"mx-2 my-1 rounded-lg px-3 py-2 text-sm font-medium text-primary hover:bg-primary-50 disabled:opacity-60\"\r\n [disabled]=\"isLoadingCandidates()\"\r\n (click)=\"loadMore($event)\"\r\n >\r\n {{ t(\"delegations.session.loadMore\") }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @if (showManageLink()) {\r\n <div class=\"border-t border-surface p-1.5\">\r\n <a\r\n [routerLink]=\"managePath()\"\r\n (click)=\"onManage()\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-sm text-surface-700 hover:bg-surface-100\"\r\n >\r\n <mt-icon\r\n icon=\"general.settings-02\"\r\n styleClass=\"text-base\"\r\n ></mt-icon>\r\n <span>{{ t(\"delegations.session.manage\") }}</span>\r\n </a>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Popover } from 'primeng/popover';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\r\nimport DelegationCandidatesPromptDialog from '../delegation-candidates-prompt-dialog/delegation-candidates-prompt-dialog';\r\nimport { DelegationMenuPanel } from '../delegation-menu-panel/delegation-menu-panel';\r\n\r\n/**\r\n * Topbar surface + controller for the delegation runtime (doc 05, 09).\r\n *\r\n * Always-mounted controller: loads the delegation candidates and shows the\r\n * post-login prompt. Visible trigger states:\r\n * - hidden — no candidates, no active session;\r\n * - candidates — icon button (matches sibling topbar icons) + count badge;\r\n * - active — delegator avatar + \"Acting on behalf of {delegator}\".\r\n *\r\n * The popover content is the shared {@link DelegationMenuPanel}, which can also\r\n * be embedded directly in a host menu (e.g. the user-avatar dropdown). Set\r\n * `headless` to keep this controller mounted (loading + prompt) while rendering\r\n * the panel elsewhere.\r\n */\r\n@Component({\r\n selector: 'mt-topbar-delegation-menu',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Avatar,\r\n Icon,\r\n Popover,\r\n TranslocoDirective,\r\n DelegationMenuPanel,\r\n ],\r\n templateUrl: './topbar-delegation-menu.html',\r\n styleUrls: ['./topbar-delegation-menu.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TopbarDelegationMenu implements OnInit {\r\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\r\n readonly managePath = input<string>('/delegations');\r\n readonly compact = input<boolean>(false);\r\n readonly showManageLink = input<boolean>(true);\r\n readonly promptOnCandidates = input<boolean>(true);\r\n /**\r\n * Render no topbar UI at all (controller only) while keeping candidate\r\n * loading + the post-login prompt. Use when the menu is surfaced elsewhere —\r\n * e.g. embedded in the user-avatar dropdown via {@link DelegationMenuPanel}.\r\n */\r\n readonly headless = input<boolean>(false);\r\n\r\n private readonly facade = inject(DelegationSessionFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n protected readonly popover = viewChild<Popover>('popover');\r\n\r\n protected readonly active = this.facade.active;\r\n protected readonly candidates = this.facade.candidates;\r\n protected readonly hasCandidates = this.facade.hasCandidates;\r\n protected readonly onBehalfOf = this.facade.onBehalfOf;\r\n protected readonly executedBy = this.facade.executedBy;\r\n protected readonly popoverOpen = signal(false);\r\n private promptPending = false;\r\n private promptRefreshQueued = false;\r\n private promptFlowOpen = false;\r\n\r\n protected readonly mode = computed<'hidden' | 'candidates' | 'active'>(() => {\r\n if (this.active()) return 'active';\r\n if (this.hasCandidates()) return 'candidates';\r\n return 'hidden';\r\n });\r\n\r\n constructor() {\r\n // The receipt service atomically persists opaque delegation/version hashes\r\n // before opening, so recreation, refresh, and concurrent loads cannot\r\n // reopen the same prompt.\r\n effect(() => {\r\n const candidates = this.candidates();\r\n if (!this.promptOnCandidates() || this.active() || !candidates.length) {\r\n return;\r\n }\r\n this.checkPromptCandidates(candidates);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.facade.loadCandidates();\r\n }\r\n\r\n /** Two-letter initials for a delegator avatar (matches the user-menu pattern). */\r\n protected initials(\r\n party: DelegationRow['delegator'] | null | undefined,\r\n ): string {\r\n const name = party?.displayName?.trim() || party?.email?.trim() || '';\r\n const parts = name.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return '?';\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n }\r\n\r\n togglePopover(event: Event): void {\r\n this.popover()?.toggle(event);\r\n }\r\n\r\n closePopover(): void {\r\n this.popover()?.hide();\r\n }\r\n\r\n private checkPromptCandidates(candidates: DelegationRow[]): void {\r\n if (this.promptPending || this.promptFlowOpen) {\r\n this.promptRefreshQueued = true;\r\n return;\r\n }\r\n\r\n this.promptPending = true;\r\n void this.facade\r\n .claimPromptCandidates(candidates)\r\n .then((unseen) => {\r\n if (unseen.length && !this.active()) {\r\n this.openCandidatesPrompt(unseen);\r\n }\r\n })\r\n .finally(() => {\r\n this.promptPending = false;\r\n if (this.promptRefreshQueued) {\r\n this.promptRefreshQueued = false;\r\n const latest = this.candidates();\r\n if (this.promptOnCandidates() && !this.active() && latest.length) {\r\n this.checkPromptCandidates(latest);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch') {\r\n return this.modal.openModal(StartSessionDialog, 'dialog', {\r\n header: this.transloco.translate(\r\n intent === 'switch'\r\n ? 'delegations.action.switchSession'\r\n : 'delegations.action.startSession',\r\n ),\r\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row, intent },\r\n });\r\n }\r\n\r\n private openCandidatesPrompt(candidates: DelegationRow[]): void {\r\n this.promptFlowOpen = true;\r\n const ref = this.modal.openModal(\r\n DelegationCandidatesPromptDialog,\r\n 'dialog',\r\n {\r\n header: this.transloco.translate('delegations.session.availableTitle'),\r\n styleClass: '!w-[min(96vw,34rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { candidates },\r\n },\r\n );\r\n\r\n ref.onClose.subscribe((row: DelegationRow | null | undefined) => {\r\n if (row) {\r\n this.openConfirm(row, 'start').onClose.subscribe(() =>\r\n this.finishPromptFlow(),\r\n );\r\n } else {\r\n this.finishPromptFlow();\r\n }\r\n });\r\n }\r\n\r\n private finishPromptFlow(): void {\r\n this.promptFlowOpen = false;\r\n if (!this.promptRefreshQueued) return;\r\n this.promptRefreshQueued = false;\r\n const latest = this.candidates();\r\n if (this.promptOnCandidates() && !this.active() && latest.length) {\r\n this.checkPromptCandidates(latest);\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <!-- Headless = controller only (no topbar UI); the menu is surfaced in the\r\n host user dropdown via <mt-delegation-menu-panel>. -->\r\n @if (!headless() && mode() !== \"hidden\") {\r\n @if (mode() === \"active\") {\r\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">\r\n {{\r\n t(\"delegations.session.banner\", {\r\n delegatorName: onBehalfOf()?.displayName,\r\n })\r\n }}.\r\n {{\r\n t(\"delegations.session.executedBy\", {\r\n actualUserName: executedBy()?.displayName,\r\n })\r\n }}\r\n </span>\r\n }\r\n\r\n <div class=\"mt-delegation-trigger flex items-center\">\r\n @if (mode() === \"active\") {\r\n <!-- Active: show the delegator like a user identity, with a switcher caret -->\r\n <button\r\n type=\"button\"\r\n class=\"mt-delegation-trigger__button mt-delegation-trigger__button--active flex min-w-0 max-w-full cursor-pointer items-center gap-2 rounded-full p-1 pe-2 text-current\"\r\n [attr.aria-label]=\"\r\n t('delegations.session.banner', {\r\n delegatorName: onBehalfOf()?.displayName,\r\n }) +\r\n '. ' +\r\n t('delegations.session.executedBy', {\r\n actualUserName: executedBy()?.displayName,\r\n })\r\n \"\r\n [attr.aria-expanded]=\"popoverOpen()\"\r\n aria-haspopup=\"dialog\"\r\n (click)=\"togglePopover($event)\"\r\n >\r\n <span class=\"relative shrink-0\">\r\n <mt-avatar\r\n [label]=\"initials(onBehalfOf())\"\r\n shape=\"circle\"\r\n styleClass=\"!size-7 !text-[0.7rem] !bg-primary-100 !text-primary-700\"\r\n ></mt-avatar>\r\n <span\r\n class=\"absolute -bottom-0.5 -end-0.5 flex size-3.5 items-center justify-center rounded-full bg-emerald-500 ring-2 ring-white\"\r\n aria-hidden=\"true\"\r\n >\r\n <mt-icon\r\n icon=\"user.users-check\"\r\n styleClass=\"text-[0.55rem] text-white\"\r\n ></mt-icon>\r\n </span>\r\n </span>\r\n @if (!compact()) {\r\n <span\r\n class=\"mt-delegation-trigger__label hidden min-w-0 flex-col text-start leading-tight md:flex\"\r\n >\r\n <span class=\"text-[0.625rem] font-medium uppercase opacity-60\">\r\n {{ t(\"delegations.session.actingOnBehalfOf\") }}\r\n </span>\r\n <span class=\"truncate text-sm font-semibold\">\r\n {{ onBehalfOf()?.displayName }}\r\n </span>\r\n </span>\r\n }\r\n <mt-icon\r\n icon=\"arrow.chevron-down\"\r\n styleClass=\"text-sm opacity-70\"\r\n ></mt-icon>\r\n </button>\r\n } @else {\r\n <!-- Candidates: plain icon button matching the other topbar icons -->\r\n <button\r\n type=\"button\"\r\n class=\"mt-delegation-trigger__icon relative flex size-9 cursor-pointer items-center justify-center rounded-full text-current\"\r\n [attr.aria-label]=\"t('delegations.session.availableTitle')\"\r\n [attr.aria-expanded]=\"popoverOpen()\"\r\n aria-haspopup=\"dialog\"\r\n (click)=\"togglePopover($event)\"\r\n >\r\n <mt-icon icon=\"user.users-plus\" styleClass=\"text-xl\"></mt-icon>\r\n @if (candidates().length > 0) {\r\n <span\r\n class=\"absolute -top-0.5 -end-0.5 inline-flex min-w-[1.05rem] items-center justify-center rounded-full bg-primary px-1 text-[0.625rem] font-bold leading-4 text-white ring-2 ring-white\"\r\n >\r\n {{ candidates().length }}\r\n </span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <p-popover\r\n #popover\r\n [pt]=\"{ content: { class: 'p-0!' } }\"\r\n (onShow)=\"popoverOpen.set(true)\"\r\n (onHide)=\"popoverOpen.set(false)\"\r\n >\r\n <div class=\"w-72 max-w-[88vw]\">\r\n <mt-delegation-menu-panel\r\n [managePath]=\"managePath()\"\r\n [showManageLink]=\"showManageLink()\"\r\n (closeRequested)=\"closePopover()\"\r\n ></mt-delegation-menu-panel>\r\n </div>\r\n </p-popover>\r\n }\r\n</ng-container>\r\n","import {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n ApproveDelegationRequest,\r\n CreateDelegationLegacyRequest,\r\n CreateDelegationV2Request,\r\n DelegationListQuery,\r\n DelegationScopePreviewRequest,\r\n RejectDelegationRequest,\r\n UpdateDelegationLegacyRequest,\r\n UpdateDelegationV2Request,\r\n} from './delegations.model';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Lists / detail\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class GetMyDelegations {\r\n static readonly type = '[Delegations] Get My Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetAssignedDelegations {\r\n static readonly type = '[Delegations] Get Assigned Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetApprovalDelegations {\r\n static readonly type = '[Delegations] Get Approval Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetAdminDelegations {\r\n static readonly type = '[Delegations] Get Admin Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetActiveAssignedDelegations {\r\n static readonly type = '[Delegations] Get Active Assigned Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetDelegationDetail {\r\n static readonly type = '[Delegations] Get Delegation Detail';\r\n constructor(\r\n public id: number,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class ClearDelegationDetail {\r\n static readonly type = '[Delegations] Clear Delegation Detail';\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Scope\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class GetScopeOptions {\r\n static readonly type = '[Delegations] Get Scope Options';\r\n constructor(\r\n public delegatorUserId?: string,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class PreviewScope {\r\n static readonly type = '[Delegations] Preview Scope';\r\n constructor(\r\n public request: DelegationScopePreviewRequest,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class ClearScopePreview {\r\n static readonly type = '[Delegations] Clear Scope Preview';\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Create / edit (legacy + v2)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class CreateDelegationLegacy {\r\n static readonly type = '[Delegations] Create Delegation (legacy)';\r\n constructor(public request: CreateDelegationLegacyRequest) {}\r\n}\r\n\r\nexport class CreateDelegationV2 {\r\n static readonly type = '[Delegations] Create Delegation (v2)';\r\n constructor(\r\n public request: CreateDelegationV2Request | AdminCreateDelegationV2Request,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class UpdateDelegationLegacy {\r\n static readonly type = '[Delegations] Update Delegation (legacy)';\r\n constructor(\r\n public id: number,\r\n public request: UpdateDelegationLegacyRequest,\r\n ) {}\r\n}\r\n\r\nexport class UpdateDelegationV2 {\r\n static readonly type = '[Delegations] Update Delegation (v2)';\r\n constructor(\r\n public id: number,\r\n public request: UpdateDelegationV2Request | AdminUpdateDelegationV2Request,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Decisions\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class ApproveDelegation {\r\n static readonly type = '[Delegations] Approve Delegation';\r\n constructor(\r\n public id: number,\r\n public request: ApproveDelegationRequest,\r\n ) {}\r\n}\r\n\r\nexport class RejectDelegation {\r\n static readonly type = '[Delegations] Reject Delegation';\r\n constructor(\r\n public id: number,\r\n public request: RejectDelegationRequest,\r\n ) {}\r\n}\r\n\r\nexport class CancelDelegation {\r\n static readonly type = '[Delegations] Cancel Delegation';\r\n constructor(\r\n public id: number,\r\n public rowVersion: string,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\n// ============================================================================\r\n// Status / approval / actions (doc 01, 16)\r\n// ============================================================================\r\n\r\nexport type DelegationEffectiveStatus =\r\n | 'PendingApproval'\r\n | 'Scheduled'\r\n | 'Active'\r\n | 'Expired'\r\n | 'Rejected'\r\n | 'Cancelled';\r\n\r\nexport type DelegationApprovalStatus =\r\n | 'NotRequired'\r\n | 'Pending'\r\n | 'Approved'\r\n | 'Rejected';\r\n\r\nexport type DelegationAllowedAction =\r\n | 'View'\r\n | 'Edit'\r\n | 'Approve'\r\n | 'Reject'\r\n | 'Cancel'\r\n | 'StartSession'\r\n | 'EndSession';\r\n\r\nexport type DelegationDayRuleMode = 'FullRange' | 'SpecificDays';\r\nexport type DelegationDisplayValue =\r\n | string\r\n | {\r\n ar?: string | null;\r\n en?: string | null;\r\n defaultAr?: string | null;\r\n defaultEn?: string | null;\r\n [locale: string]: unknown;\r\n }\r\n | null;\r\n\r\n// ============================================================================\r\n// Parties + row (doc 02)\r\n// ============================================================================\r\n\r\nexport interface DelegationParty {\r\n userId: string;\r\n displayName: string;\r\n email?: string | null;\r\n}\r\n\r\nexport interface DelegationApprovalInfo {\r\n requiresApproval: boolean;\r\n approvalStatus: DelegationApprovalStatus;\r\n}\r\n\r\nexport interface DelegationCancellationInfo {\r\n cancelledBy?: DelegationParty | null;\r\n cancelledAtUtc?: string | null;\r\n cancellationReason?: string | null;\r\n}\r\n\r\nexport interface DelegationRow {\r\n delegationId: number;\r\n delegator: DelegationParty;\r\n delegatedUser: DelegationParty;\r\n startsAtUtc: string;\r\n endsAtUtc: string;\r\n timeZoneId: string;\r\n dayRuleMode: DelegationDayRuleMode;\r\n specificDays: number[];\r\n effectiveStatus: DelegationEffectiveStatus;\r\n statusReasonCode: string;\r\n createdBy: DelegationParty;\r\n createdAtUtc: string;\r\n approval: DelegationApprovalInfo;\r\n cancellation: DelegationCancellationInfo;\r\n allowedActions: DelegationAllowedAction[];\r\n rowVersion: string;\r\n}\r\n\r\nexport interface DelegationPage<T> {\r\n items: T[];\r\n page: number;\r\n pageSize: number;\r\n totalCount: number;\r\n}\r\n\r\n// ============================================================================\r\n// Scope — grants based (doc 03, 04)\r\n// ============================================================================\r\n\r\nexport interface DelegationScopeTarget {\r\n applicationKey: string;\r\n targetType: string;\r\n targetKey: string;\r\n /** Backend-localized name (preferred display source in the new contract). */\r\n name?: DelegationDisplayValue;\r\n parentTargetType?: string | null;\r\n parentTargetKey?: string | null;\r\n parentDisplayName?: DelegationDisplayValue;\r\n parentLevelId?: number | null;\r\n legacyModuleId?: number | null;\r\n targetId?: number | null;\r\n levelId?: number | null;\r\n levelModuleId?: number | null;\r\n domainModuleId?: number | null;\r\n moduleKey?: string | null;\r\n permissionModuleType?: string | null;\r\n permissionTargetId?: number | null;\r\n isDelegable?: boolean;\r\n displayName?: DelegationDisplayValue;\r\n displayLabel?: DelegationDisplayValue;\r\n label?: DelegationDisplayValue;\r\n}\r\n\r\nexport interface DelegationScopeAction {\r\n applicationKey: string;\r\n operationKey: string;\r\n operationKind: string;\r\n /** Backend-localized name (preferred display source in the new contract). */\r\n name?: DelegationDisplayValue;\r\n displayName?: DelegationDisplayValue;\r\n displayLabel?: DelegationDisplayValue;\r\n operationDisplayName?: DelegationDisplayValue;\r\n operationLabel?: DelegationDisplayValue;\r\n label?: DelegationDisplayValue;\r\n permissionCommand?: string | null;\r\n businessActionCode?: string | null;\r\n isHighRisk?: boolean;\r\n isDelegable?: boolean;\r\n isDelegableSnapshot?: boolean;\r\n sortOrder?: number | null;\r\n}\r\n\r\nexport interface DelegationScopeFact {\r\n key?: string | null;\r\n code?: string | null;\r\n id?: string | number | null;\r\n displayName?: DelegationDisplayValue;\r\n displayLabel?: DelegationDisplayValue;\r\n label?: DelegationDisplayValue;\r\n [extra: string]: unknown;\r\n}\r\n\r\nexport interface DelegationGrant {\r\n /** Optional backend-provided stable grant identity; preferred for de-dup when present. */\r\n key?: string;\r\n applicationKey: string;\r\n target: DelegationScopeTarget;\r\n action: DelegationScopeAction;\r\n accessibilities: DelegationScopeFact[];\r\n dataFilters: DelegationScopeFact[];\r\n constraints: DelegationScopeFact[];\r\n}\r\n\r\nexport interface DelegationScopeSelection {\r\n grants: DelegationGrant[];\r\n metadata: Record<string, unknown>;\r\n}\r\n\r\nexport interface DelegationScopeCombinationRule {\r\n applicationKey?: string | null;\r\n targetType: string;\r\n targetKey: string;\r\n operationKey: string;\r\n accessibilityKeys?: string[] | null;\r\n dataFilterKeys?: string[] | null;\r\n constraintKeys?: string[] | null;\r\n [extra: string]: unknown;\r\n}\r\n\r\n/**\r\n * Legacy `scope/options` grouping kept only as a compatibility fallback. The\r\n * current FE selector contract is `permissions`.\r\n */\r\nexport interface DelegationScopeHierarchyTarget {\r\n target: DelegationScopeTarget;\r\n operations: DelegationScopeAction[];\r\n sortOrder?: number | null;\r\n}\r\n\r\nexport interface DelegationScopeHierarchyGroup {\r\n groupType: string;\r\n groupKey: string;\r\n displayName?: DelegationDisplayValue;\r\n levelId?: number | null;\r\n sortOrder?: number | null;\r\n targets: DelegationScopeHierarchyTarget[];\r\n}\r\n\r\n/**\r\n * New `scope/options` contract (doc 03): `permissions` is a Template -> Level ->\r\n * Module hierarchy where Level and Level Module are both selectable permission\r\n * surfaces, each carrying its own backend-filtered `operations`. `appAccessibility`\r\n * lists optional accessibility grants with backend-localized names.\r\n */\r\nexport interface DelegationScopeModuleNode {\r\n applicationKey: string;\r\n targetType: string; // 'LevelModule'\r\n targetKey: string;\r\n name?: DelegationDisplayValue;\r\n legacyModuleId?: number | null;\r\n levelId?: number | null;\r\n levelModuleId?: number | null;\r\n domainModuleId?: number | null;\r\n targetId?: number | null;\r\n moduleKey?: string | null;\r\n permissionModuleType?: string | null;\r\n permissionTargetId?: number | null;\r\n sortOrder?: number | null;\r\n operations?: DelegationScopeAction[] | null;\r\n}\r\n\r\nexport interface DelegationScopeLevelNode {\r\n applicationKey: string;\r\n targetType: string; // 'Level'\r\n targetKey: string;\r\n name?: DelegationDisplayValue;\r\n legacyModuleId?: number | null;\r\n levelId?: number | null;\r\n targetId?: number | null;\r\n permissionModuleType?: string | null;\r\n permissionTargetId?: number | null;\r\n sortOrder?: number | null;\r\n operations?: DelegationScopeAction[] | null;\r\n modules?: DelegationScopeModuleNode[] | null;\r\n}\r\n\r\nexport interface DelegationScopePermissionGroup {\r\n groupType: string; // 'Template'\r\n groupKey: string;\r\n name?: DelegationDisplayValue;\r\n templateId?: number | null;\r\n sortOrder?: number | null;\r\n levels?: DelegationScopeLevelNode[] | null;\r\n}\r\n\r\nexport interface DelegationScopeViewOperation extends DelegationScopeAction {\r\n selected?: boolean;\r\n isAvailable?: boolean;\r\n accessibilities?: DelegationScopeFact[] | null;\r\n dataFilters?: DelegationScopeFact[] | null;\r\n constraints?: DelegationScopeFact[] | null;\r\n}\r\n\r\nexport interface DelegationScopeViewModule extends Omit<\r\n DelegationScopeModuleNode,\r\n 'operations'\r\n> {\r\n isAvailable?: boolean;\r\n operations?: DelegationScopeViewOperation[] | null;\r\n}\r\n\r\nexport interface DelegationScopeViewLevel extends Omit<\r\n DelegationScopeLevelNode,\r\n 'modules' | 'operations'\r\n> {\r\n isAvailable?: boolean;\r\n operations?: DelegationScopeViewOperation[] | null;\r\n modules?: DelegationScopeViewModule[] | null;\r\n}\r\n\r\nexport interface DelegationScopeViewTemplate extends Omit<\r\n DelegationScopePermissionGroup,\r\n 'levels'\r\n> {\r\n isAvailable?: boolean;\r\n levels?: DelegationScopeViewLevel[] | null;\r\n}\r\n\r\nexport interface DelegationScopeView {\r\n templates?: DelegationScopeViewTemplate[] | null;\r\n}\r\n\r\nexport interface DelegationAppAccessibility {\r\n accessibilityGroupId?: number | null;\r\n applicationKey: string;\r\n accessibilityKey: string;\r\n name?: DelegationDisplayValue;\r\n labelKey?: string | null;\r\n}\r\n\r\nexport interface DelegationScopeOptions {\r\n permissions?: DelegationScopePermissionGroup[] | null;\r\n appAccessibility?: DelegationAppAccessibility[] | null;\r\n hierarchy?: DelegationScopeHierarchyGroup[] | null;\r\n grants?: DelegationGrant[] | null;\r\n metadata?: Record<string, unknown>;\r\n targets?: DelegationScopeTarget[] | null;\r\n operations?: DelegationScopeAction[] | null;\r\n accessibilities?: DelegationScopeFact[] | null;\r\n presets?: Record<string, unknown>[] | null;\r\n combinationRules?: DelegationScopeCombinationRule[] | null;\r\n nonDelegableOperations?: (string | DelegationScopeFact)[] | null;\r\n dataFilters?: DelegationScopeFact[] | null;\r\n constraints?: DelegationScopeFact[] | null;\r\n}\r\n\r\nexport interface DelegationScopeWarning {\r\n code?: string;\r\n message: string;\r\n}\r\n\r\nexport interface DelegationScopeDeniedItem {\r\n applicationKey: string;\r\n targetType: string;\r\n targetKey: string;\r\n operationKey: string;\r\n permissionCommand?: string;\r\n reasonCode: string;\r\n}\r\n\r\nexport interface DelegationScopePreview {\r\n isValid: boolean;\r\n normalizedScope: DelegationScopeSelection;\r\n scopeHash: string;\r\n summary: DelegationDisplayValue;\r\n warnings: DelegationScopeWarning[];\r\n deniedItems: DelegationScopeDeniedItem[];\r\n}\r\n\r\n// ============================================================================\r\n// Detail (doc 02)\r\n// ============================================================================\r\n\r\nexport interface DelegationStatusInfo {\r\n effectiveStatus: DelegationEffectiveStatus;\r\n reasonCode: string;\r\n calculatedAtUtc: string;\r\n}\r\n\r\nexport interface DelegationDetail {\r\n row: DelegationRow;\r\n description?: string | null;\r\n scope: DelegationScopeSelection;\r\n scopeView?: DelegationScopeView | null;\r\n status: DelegationStatusInfo;\r\n}\r\n\r\n// ============================================================================\r\n// Legacy create/edit DTO returned by create/edit (doc 02)\r\n// ============================================================================\r\n\r\nexport interface DelegationDto {\r\n id: number;\r\n fromUserId: string;\r\n toUserId: string;\r\n description?: string;\r\n isActive?: boolean;\r\n delegationDaysType: DelegationDayRuleMode;\r\n specificDays: number[];\r\n applicationId?: number;\r\n requiresApproval?: boolean;\r\n effectiveStatus: DelegationEffectiveStatus;\r\n statusReasonCode: string;\r\n allowedActions: DelegationAllowedAction[];\r\n rowVersion: string;\r\n [extra: string]: unknown;\r\n}\r\n\r\n// ============================================================================\r\n// List query (doc 02)\r\n// ============================================================================\r\n\r\nexport type DelegationSortDirection =\r\n | 'asc'\r\n | 'ascending'\r\n | 'desc'\r\n | 'descending';\r\n\r\nexport interface DelegationListQuery {\r\n activeOnly?: boolean;\r\n status?: DelegationEffectiveStatus;\r\n search?: string;\r\n fromUtc?: string;\r\n toUtc?: string;\r\n sortBy?: string;\r\n sortDirection?: DelegationSortDirection;\r\n page?: number;\r\n pageSize?: number;\r\n // admin only\r\n delegatorUserId?: string;\r\n delegatedUserId?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Create / edit / decision requests (doc 04)\r\n// ============================================================================\r\n\r\nexport interface CreateDelegationLegacyRequest {\r\n delegateFrom?: string | null;\r\n delegateTo: string;\r\n description?: string;\r\n delegateFromDateTime: string;\r\n delegateToDateTime: string;\r\n accessibilityIds?: number[];\r\n moduleIds?: number[];\r\n delegationDaysType: DelegationDayRuleMode;\r\n specificDays?: number[];\r\n isActive?: boolean;\r\n requiresApproval?: boolean;\r\n}\r\n\r\nexport interface CreateDelegationV2Request {\r\n delegateFrom?: string | null;\r\n delegateTo: string;\r\n description?: string;\r\n delegateFromDateTime: string;\r\n delegateToDateTime: string;\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n requiresApproval: boolean;\n scope: DelegationScopeSelection;\r\n}\r\n\r\nexport interface AdminCreateDelegationV2Request {\r\n delegatorUserId: string;\r\n delegatedUserId: string;\r\n description?: string;\r\n delegateFromDateTime: string;\r\n delegateToDateTime: string;\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n requiresApproval: boolean;\n scope: DelegationScopeSelection;\r\n}\r\n\r\nexport type UpdateDelegationLegacyRequest = CreateDelegationLegacyRequest & {\r\n rowVersion: string;\r\n};\r\n\r\nexport type UpdateDelegationV2Request = CreateDelegationV2Request & {\r\n rowVersion: string;\r\n};\r\n\r\nexport type AdminUpdateDelegationV2Request = AdminCreateDelegationV2Request & {\r\n rowVersion: string;\r\n};\r\n\r\nexport interface DelegationScopePreviewRequest {\r\n scope: DelegationScopeSelection;\r\n delegatorUserId?: string | null;\r\n}\r\n\r\nexport interface ApproveDelegationRequest {\r\n rowVersion: string;\r\n reason?: string;\r\n}\r\n\r\nexport interface RejectDelegationRequest {\r\n rowVersion: string;\r\n reason: string;\r\n}\r\n\r\n// ============================================================================\r\n// NGXS state shape + action keys\r\n// ============================================================================\r\n\r\nexport enum DelegationsActionKey {\r\n GetMy = 'getMy',\r\n GetAssigned = 'getAssigned',\r\n GetApprovals = 'getApprovals',\r\n GetAdmin = 'getAdmin',\r\n GetActive = 'getActive',\r\n GetDetail = 'getDetail',\r\n GetScopeOptions = 'getScopeOptions',\r\n PreviewScope = 'previewScope',\r\n Create = 'create',\r\n Update = 'update',\r\n Approve = 'approve',\r\n Reject = 'reject',\r\n Cancel = 'cancel',\r\n}\r\n\r\nexport interface DelegationsStateModel extends LoadingStateShape<DelegationsActionKey> {\r\n my: DelegationPage<DelegationRow> | null;\r\n assigned: DelegationPage<DelegationRow> | null;\r\n approvals: DelegationPage<DelegationRow> | null;\r\n admin: DelegationPage<DelegationRow> | null;\r\n active: DelegationPage<DelegationRow> | null;\r\n detail: DelegationDetail | null;\r\n detailRequestedId: number | null;\r\n scopeOptions: DelegationScopeOptions | null;\r\n scopePreview: DelegationScopePreview | null;\r\n scopePreviewFingerprint: string | null;\r\n}\r\n","import { DelegationScopeSelection } from './delegations.model';\r\n\r\n/** Stable request identity used to reject stale scope-preview responses. */\r\nexport function delegationScopeFingerprint(\r\n scope: DelegationScopeSelection,\r\n): string {\r\n const grants = (scope.grants ?? [])\r\n .map((grant) => ({\r\n applicationKey: grant.applicationKey,\r\n targetType: grant.target?.targetType,\r\n targetKey: grant.target?.targetKey,\r\n operationKey: grant.action?.operationKey,\r\n accessibilities: (grant.accessibilities ?? [])\r\n .map((item) => item.key ?? item.code ?? item.id ?? '')\r\n .sort(),\r\n dataFilters: (grant.dataFilters ?? [])\r\n .map((item) => item.key ?? item.code ?? item.id ?? '')\r\n .sort(),\r\n constraints: (grant.constraints ?? [])\r\n .map((item) => item.key ?? item.code ?? item.id ?? '')\r\n .sort(),\r\n }))\r\n .sort((left, right) =>\r\n JSON.stringify(left).localeCompare(JSON.stringify(right)),\r\n );\r\n return JSON.stringify(grants);\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n Action,\r\n Actions,\r\n ofActionSuccessful,\r\n Selector,\r\n State,\r\n StateContext,\r\n Store,\r\n} from '@ngxs/store';\r\nimport { handleApiRequest } from '@masterteam/components';\r\nimport { Response } from './api.model';\r\nimport {\r\n ApproveDelegation,\r\n CancelDelegation,\r\n ClearDelegationDetail,\r\n ClearScopePreview,\r\n CreateDelegationLegacy,\r\n CreateDelegationV2,\r\n GetActiveAssignedDelegations,\r\n GetAdminDelegations,\r\n GetApprovalDelegations,\r\n GetAssignedDelegations,\r\n GetDelegationDetail,\r\n GetMyDelegations,\r\n GetScopeOptions,\r\n PreviewScope,\r\n RejectDelegation,\r\n UpdateDelegationLegacy,\r\n UpdateDelegationV2,\r\n} from './delegations.actions';\r\nimport {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n DelegationDetail,\r\n DelegationDto,\r\n DelegationListQuery,\r\n DelegationPage,\r\n DelegationRow,\r\n DelegationScopeOptions,\r\n DelegationScopePreviewRequest,\r\n DelegationScopePreview,\r\n DelegationsActionKey,\r\n DelegationsStateModel,\r\n} from './delegations.model';\r\nimport { delegationScopeFingerprint } from './scope-fingerprint';\r\nimport {\r\n EndDelegationSession,\r\n LoadDelegationCandidates,\r\n} from '../session/delegation-session.actions';\r\nimport type { ActiveDelegationSession } from '../session/delegation-session.model';\r\n\r\nconst BASE = 'identity/delegations';\r\n\r\nfunction buildListParams(query: DelegationListQuery): HttpParams {\r\n let params = new HttpParams();\r\n if (query.activeOnly != null)\r\n params = params.set('activeOnly', query.activeOnly);\r\n if (query.status) params = params.set('status', query.status);\r\n if (query.search) params = params.set('search', query.search);\r\n if (query.fromUtc) params = params.set('fromUtc', query.fromUtc);\r\n if (query.toUtc) params = params.set('toUtc', query.toUtc);\r\n if (query.sortBy) params = params.set('sortBy', query.sortBy);\r\n if (query.sortDirection)\r\n params = params.set('sortDirection', query.sortDirection);\r\n params = params.set('page', query.page ?? 1);\r\n params = params.set('pageSize', query.pageSize ?? 25);\r\n if (query.delegatorUserId)\r\n params = params.set('delegatorUserId', query.delegatorUserId);\r\n if (query.delegatedUserId)\r\n params = params.set('delegatedUserId', query.delegatedUserId);\r\n return params;\r\n}\r\n\r\n@State<DelegationsStateModel>({\r\n name: 'delegations',\r\n defaults: {\r\n my: null,\r\n assigned: null,\r\n approvals: null,\r\n admin: null,\r\n active: null,\r\n detail: null,\r\n detailRequestedId: null,\r\n scopeOptions: null,\r\n scopePreview: null,\r\n scopePreviewFingerprint: null,\r\n loadingActive: [],\r\n errors: {},\r\n },\r\n})\r\n@Injectable()\r\nexport class DelegationsState {\r\n private http = inject(HttpClient);\r\n private actions$ = inject(Actions);\r\n private store = inject(Store);\r\n\r\n constructor() {\r\n this.actions$\r\n .pipe(\r\n ofActionSuccessful(\r\n CreateDelegationLegacy,\r\n CreateDelegationV2,\r\n UpdateDelegationLegacy,\r\n UpdateDelegationV2,\r\n ApproveDelegation,\r\n RejectDelegation,\r\n CancelDelegation,\r\n ),\r\n )\r\n .subscribe((action) => {\r\n const active = (\r\n this.store.snapshot() as {\r\n delegationSession?: { active?: ActiveDelegationSession | null };\r\n }\r\n ).delegationSession?.active;\r\n if (\r\n action instanceof CancelDelegation &&\r\n active?.delegation.delegationId === action.id\r\n ) {\r\n this.store.dispatch(new EndDelegationSession('ScopeChanged'));\r\n return;\r\n }\r\n this.store.dispatch(new LoadDelegationCandidates());\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Selectors\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getMy(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.my;\r\n }\r\n\r\n @Selector()\r\n static getAssigned(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.assigned;\r\n }\r\n\r\n @Selector()\r\n static getApprovals(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.approvals;\r\n }\r\n\r\n @Selector()\r\n static getAdmin(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.admin;\r\n }\r\n\r\n @Selector()\r\n static getActive(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.active;\r\n }\r\n\r\n @Selector()\r\n static getDetail(state: DelegationsStateModel): DelegationDetail | null {\r\n return state.detail;\r\n }\r\n\r\n @Selector()\r\n static getScopePreviewFingerprint(\r\n state: DelegationsStateModel,\r\n ): string | null {\r\n return state.scopePreviewFingerprint;\r\n }\r\n\r\n @Selector()\r\n static getScopeOptions(\r\n state: DelegationsStateModel,\r\n ): DelegationScopeOptions | null {\r\n return state.scopeOptions;\r\n }\r\n\r\n @Selector()\r\n static getScopePreview(\r\n state: DelegationsStateModel,\r\n ): DelegationScopePreview | null {\r\n return state.scopePreview;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: DelegationsStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: DelegationsStateModel,\r\n ): Record<string, string | null | undefined> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // Lists\r\n // ============================================================================\r\n\r\n @Action(GetMyDelegations)\r\n getMy(ctx: StateContext<DelegationsStateModel>, { query }: GetMyDelegations) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(BASE, {\r\n params: buildListParams(query),\r\n });\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetMy,\r\n request$: req$,\r\n onSuccess: (response) => ({ my: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetAssignedDelegations)\r\n getAssigned(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetAssignedDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/assigned`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetAssigned,\r\n request$: req$,\r\n onSuccess: (response) => ({ assigned: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetApprovalDelegations)\r\n getApprovals(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetApprovalDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/assigned`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetApprovals,\r\n request$: req$,\r\n onSuccess: (response) => ({ approvals: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetAdminDelegations)\r\n getAdmin(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetAdminDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/All`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetAdmin,\r\n request$: req$,\r\n onSuccess: (response) => ({ admin: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetActiveAssignedDelegations)\r\n getActive(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetActiveAssignedDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/user/activedelegations`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetActive,\r\n request$: req$,\r\n onSuccess: (response) => ({ active: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetDelegationDetail, { cancelUncompleted: true })\r\n getDetail(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, asAdmin }: GetDelegationDetail,\r\n ) {\r\n ctx.patchState({ detail: null, detailRequestedId: id });\r\n const path = asAdmin ? `${BASE}/Admin/${id}` : `${BASE}/${id}`;\r\n const req$ = this.http.get<Response<DelegationDetail>>(path);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetDetail,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n detail:\r\n ctx.getState().detailRequestedId === id\r\n ? (response.data ?? null)\r\n : null,\r\n }),\r\n });\r\n }\r\n\r\n @Action(ClearDelegationDetail)\r\n clearDetail(ctx: StateContext<DelegationsStateModel>) {\r\n ctx.patchState({ detail: null, detailRequestedId: null });\r\n }\r\n\r\n // ============================================================================\r\n // Scope\r\n // ============================================================================\r\n\r\n @Action(GetScopeOptions)\r\n getScopeOptions(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { delegatorUserId, asAdmin }: GetScopeOptions,\r\n ) {\r\n ctx.patchState({\r\n scopeOptions: null,\r\n scopePreview: null,\r\n scopePreviewFingerprint: null,\r\n });\r\n\r\n let params = new HttpParams();\r\n if (delegatorUserId)\r\n params = params.set('delegatorUserId', delegatorUserId);\r\n const path = asAdmin\r\n ? `${BASE}/Admin/scope/options`\r\n : `${BASE}/scope/options`;\r\n const req$ = this.http.get<Response<DelegationScopeOptions>>(path, {\r\n params,\r\n });\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetScopeOptions,\r\n request$: req$,\r\n onSuccess: (response) => ({ scopeOptions: response.data ?? null }),\r\n });\r\n }\r\n\r\n @Action(PreviewScope, { cancelUncompleted: true })\r\n previewScope(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { request, asAdmin }: PreviewScope,\r\n ) {\r\n const fingerprint = delegationScopeFingerprint(request.scope);\r\n ctx.patchState({ scopePreview: null, scopePreviewFingerprint: null });\r\n const path = asAdmin\r\n ? `${BASE}/Admin/scope/preview`\r\n : `${BASE}/scope/preview`;\r\n const req$ = this.http.post<Response<DelegationScopePreview>>(\r\n path,\r\n this.buildScopePreviewRequest(request, asAdmin),\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.PreviewScope,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n scopePreview: response.data ?? null,\r\n scopePreviewFingerprint: fingerprint,\r\n }),\r\n });\r\n }\r\n\r\n @Action(ClearScopePreview)\r\n clearScopePreview(ctx: StateContext<DelegationsStateModel>) {\r\n ctx.patchState({ scopePreview: null, scopePreviewFingerprint: null });\r\n }\r\n\r\n // ============================================================================\r\n // Create / edit (response is legacy DelegationDto — clients reload list/detail)\r\n // ============================================================================\r\n\r\n @Action(CreateDelegationLegacy)\r\n createLegacy(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { request }: CreateDelegationLegacy,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationDto>>(BASE, request);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Create,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(CreateDelegationV2)\r\n createV2(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { request, asAdmin }: CreateDelegationV2,\r\n ) {\r\n const path = asAdmin ? `${BASE}/Admin/v2` : `${BASE}/v2`;\r\n const body = asAdmin\r\n ? this.buildAdminSaveRequest(request as AdminCreateDelegationV2Request)\r\n : request;\r\n const req$ = this.http.post<Response<DelegationDto>>(path, body);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Create,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(UpdateDelegationLegacy)\r\n updateLegacy(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request }: UpdateDelegationLegacy,\r\n ) {\r\n const req$ = this.http.put<Response<DelegationDto>>(\r\n `${BASE}/${id}`,\r\n request,\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Update,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(UpdateDelegationV2)\r\n updateV2(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request, asAdmin }: UpdateDelegationV2,\r\n ) {\r\n const path = asAdmin ? `${BASE}/Admin/v2/${id}` : `${BASE}/v2/${id}`;\r\n const body = asAdmin\r\n ? this.buildAdminSaveRequest(request as AdminUpdateDelegationV2Request)\r\n : request;\r\n const req$ = this.http.put<Response<DelegationDto>>(path, body);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Update,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Decisions\r\n // ============================================================================\r\n\r\n @Action(ApproveDelegation)\r\n approve(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request }: ApproveDelegation,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationDto>>(\r\n `${BASE}/${id}/approve`,\r\n request,\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Approve,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(RejectDelegation)\r\n reject(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request }: RejectDelegation,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationDto>>(\r\n `${BASE}/${id}/reject`,\r\n request,\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Reject,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(CancelDelegation)\r\n cancel(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, rowVersion, asAdmin }: CancelDelegation,\r\n ) {\r\n const path = asAdmin ? `${BASE}/Admin/${id}` : `${BASE}/${id}`;\r\n const req$ = this.http.delete<Response<boolean>>(path, {\r\n params: new HttpParams().set('rowVersion', rowVersion),\r\n });\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Cancel,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n private buildScopePreviewRequest(\r\n request: DelegationScopePreviewRequest,\r\n asAdmin: boolean,\r\n ): DelegationScopePreviewRequest {\r\n if (!asAdmin) {\r\n return { scope: request.scope };\r\n }\r\n\r\n return {\r\n delegatorUserId: request.delegatorUserId ?? null,\r\n scope: request.scope,\r\n };\r\n }\r\n\r\n private buildAdminSaveRequest(\r\n request: AdminCreateDelegationV2Request | AdminUpdateDelegationV2Request,\r\n ): AdminCreateDelegationV2Request | AdminUpdateDelegationV2Request {\r\n return {\r\n ...request,\r\n specificDays: request.specificDays ?? [],\r\n };\r\n }\r\n}\r\n","import { computed, inject, Injectable } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport {\r\n ApproveDelegation,\r\n CancelDelegation,\r\n ClearDelegationDetail,\r\n ClearScopePreview,\r\n CreateDelegationLegacy,\r\n CreateDelegationV2,\r\n GetActiveAssignedDelegations,\r\n GetAdminDelegations,\r\n GetApprovalDelegations,\r\n GetAssignedDelegations,\r\n GetDelegationDetail,\r\n GetMyDelegations,\r\n GetScopeOptions,\r\n PreviewScope,\r\n RejectDelegation,\r\n UpdateDelegationLegacy,\r\n UpdateDelegationV2,\r\n} from './delegations.actions';\r\nimport {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n ApproveDelegationRequest,\r\n CreateDelegationLegacyRequest,\r\n CreateDelegationV2Request,\r\n DelegationListQuery,\r\n DelegationScopePreviewRequest,\r\n DelegationScopeSelection,\r\n DelegationsActionKey,\r\n RejectDelegationRequest,\r\n UpdateDelegationLegacyRequest,\r\n UpdateDelegationV2Request,\r\n} from './delegations.model';\r\nimport { DelegationsState } from './delegations.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationsFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Data slices\r\n // ---------------------------------------------------------------------------\r\n readonly myPage = select(DelegationsState.getMy);\r\n readonly assignedPage = select(DelegationsState.getAssigned);\r\n readonly approvalsPage = select(DelegationsState.getApprovals);\r\n readonly adminPage = select(DelegationsState.getAdmin);\r\n readonly activePage = select(DelegationsState.getActive);\r\n readonly detail = select(DelegationsState.getDetail);\r\n readonly scopeOptions = select(DelegationsState.getScopeOptions);\r\n readonly scopePreview = select(DelegationsState.getScopePreview);\r\n readonly scopePreviewFingerprint = select(\r\n DelegationsState.getScopePreviewFingerprint,\r\n );\r\n\r\n private readonly loadingActive = select(DelegationsState.getLoadingActive);\r\n private readonly errors = select(DelegationsState.getErrors);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Derived\r\n // ---------------------------------------------------------------------------\r\n readonly myItems = computed(() => this.myPage()?.items ?? []);\r\n readonly assignedItems = computed(() => this.assignedPage()?.items ?? []);\r\n readonly approvalItems = computed(() => this.approvalsPage()?.items ?? []);\r\n readonly adminItems = computed(() => this.adminPage()?.items ?? []);\r\n readonly activeItems = computed(() => this.activePage()?.items ?? []);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Loading\r\n // ---------------------------------------------------------------------------\r\n readonly isLoadingMy = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetMy),\r\n );\r\n readonly isLoadingAssigned = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetAssigned),\r\n );\r\n readonly isLoadingApprovals = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetApprovals),\r\n );\r\n readonly isLoadingAdmin = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetAdmin),\r\n );\r\n readonly isLoadingActive = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetActive),\r\n );\r\n readonly isLoadingDetail = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetDetail),\r\n );\r\n readonly isLoadingScopeOptions = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetScopeOptions),\r\n );\r\n readonly isPreviewingScope = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.PreviewScope),\r\n );\r\n readonly isSaving = computed(\r\n () =>\r\n this.loadingActive().includes(DelegationsActionKey.Create) ||\r\n this.loadingActive().includes(DelegationsActionKey.Update),\r\n );\r\n readonly isApproving = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.Approve),\r\n );\r\n readonly isRejecting = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.Reject),\r\n );\r\n readonly isCancelling = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.Cancel),\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Errors\r\n // ---------------------------------------------------------------------------\r\n readonly errorMy = computed(\r\n () => this.errors()[DelegationsActionKey.GetMy] ?? null,\r\n );\r\n readonly errorAssigned = computed(\r\n () => this.errors()[DelegationsActionKey.GetAssigned] ?? null,\r\n );\r\n readonly errorApprovals = computed(\r\n () => this.errors()[DelegationsActionKey.GetApprovals] ?? null,\r\n );\r\n readonly errorAdmin = computed(\r\n () => this.errors()[DelegationsActionKey.GetAdmin] ?? null,\r\n );\r\n readonly errorDetail = computed(\r\n () => this.errors()[DelegationsActionKey.GetDetail] ?? null,\r\n );\r\n readonly errorScopeOptions = computed(\r\n () => this.errors()[DelegationsActionKey.GetScopeOptions] ?? null,\r\n );\r\n readonly errorSave = computed(\r\n () =>\r\n this.errors()[DelegationsActionKey.Create] ??\r\n this.errors()[DelegationsActionKey.Update] ??\r\n null,\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Dispatchers\r\n // ---------------------------------------------------------------------------\r\n getMy(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetMyDelegations(query));\r\n }\r\n getAssigned(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetAssignedDelegations(query));\r\n }\r\n getApprovals(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetApprovalDelegations(query));\r\n }\r\n getAdmin(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetAdminDelegations(query));\r\n }\r\n getActive(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetActiveAssignedDelegations(query));\r\n }\r\n getDetail(id: number, asAdmin = false) {\r\n return this.store.dispatch(new GetDelegationDetail(id, asAdmin));\r\n }\r\n clearDetail() {\r\n return this.store.dispatch(new ClearDelegationDetail());\r\n }\r\n loadScopeOptions(delegatorUserId?: string, asAdmin = false) {\r\n return this.store.dispatch(new GetScopeOptions(delegatorUserId, asAdmin));\r\n }\r\n previewScope(\r\n scope: DelegationScopeSelection,\r\n options?: {\r\n delegatorUserId?: string;\r\n asAdmin?: boolean;\r\n },\r\n ) {\r\n const request: DelegationScopePreviewRequest = {\r\n delegatorUserId: options?.delegatorUserId,\r\n scope,\r\n };\r\n return this.store.dispatch(\r\n new PreviewScope(request, options?.asAdmin ?? false),\r\n );\r\n }\r\n clearScopePreview() {\r\n return this.store.dispatch(new ClearScopePreview());\r\n }\r\n createLegacy(request: CreateDelegationLegacyRequest) {\r\n return this.store.dispatch(new CreateDelegationLegacy(request));\r\n }\r\n createV2(\r\n request: CreateDelegationV2Request | AdminCreateDelegationV2Request,\r\n asAdmin = false,\r\n ) {\r\n return this.store.dispatch(new CreateDelegationV2(request, asAdmin));\r\n }\r\n updateLegacy(id: number, request: UpdateDelegationLegacyRequest) {\r\n return this.store.dispatch(new UpdateDelegationLegacy(id, request));\r\n }\r\n updateV2(\r\n id: number,\r\n request: UpdateDelegationV2Request | AdminUpdateDelegationV2Request,\r\n asAdmin = false,\r\n ) {\r\n return this.store.dispatch(new UpdateDelegationV2(id, request, asAdmin));\r\n }\r\n approve(id: number, request: ApproveDelegationRequest) {\r\n return this.store.dispatch(new ApproveDelegation(id, request));\r\n }\r\n reject(id: number, request: RejectDelegationRequest) {\r\n return this.store.dispatch(new RejectDelegation(id, request));\r\n }\r\n cancel(id: number, rowVersion: string, asAdmin = false) {\r\n return this.store.dispatch(new CancelDelegation(id, rowVersion, asAdmin));\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\n/**\r\n * Collects a required rejection reason before calling\r\n * POST identity/delegations/{id}/reject (doc 04 — reject requires a non-empty\r\n * reason for audit/governance). Closes with `true` on success so the caller\r\n * can reload the row.\r\n */\r\n@Component({\r\n selector: 'mt-reject-delegation-dialog',\r\n imports: [CommonModule, Button, EntityPreview, TranslocoDirective],\r\n templateUrl: './reject-delegation-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class RejectDelegationDialog {\r\n readonly delegation = input.required<DelegationRow>();\r\n\r\n private readonly ref: ModalRef = inject(ModalRef);\r\n private readonly facade = inject(DelegationsFacade);\r\n\r\n protected readonly reason = signal('');\r\n protected readonly submitted = signal(false);\r\n protected readonly isBusy = this.facade.isRejecting;\r\n\r\n protected readonly isValid = computed(() => this.reason().trim().length > 0);\r\n\r\n protected onReasonInput(event: Event): void {\r\n this.reason.set((event.target as HTMLTextAreaElement).value);\r\n }\r\n\r\n protected userEntity(party: DelegationRow['delegator']) {\r\n return toDelegationUserEntity(party, { showEmail: false });\r\n }\r\n\r\n confirm(): void {\r\n this.submitted.set(true);\r\n if (!this.isValid()) return;\r\n const row = this.delegation();\r\n this.facade\r\n .reject(row.delegationId, {\r\n rowVersion: row.rowVersion,\r\n reason: this.reason().trim(),\r\n })\r\n .subscribe({\r\n next: () => this.ref.close(true),\r\n error: () => {\r\n /* error surfaced via shared toast pipeline; keep dialog open */\r\n },\r\n });\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col gap-4 p-2\">\r\n <div class=\"flex flex-col gap-1\">\r\n <div class=\"text-sm text-surface-700\">\r\n {{ t(\"delegations.confirm.reject\") }}\r\n </div>\r\n <mt-entity-preview\r\n [data]=\"userEntity(delegation().delegator)\"\r\n ></mt-entity-preview>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-1\">\r\n <label\r\n class=\"text-sm font-medium text-surface-800\"\r\n for=\"mt-reject-reason\"\r\n >\r\n {{ t(\"delegations.form.rejectionReason\") }}\r\n <span class=\"text-red-600\">*</span>\r\n </label>\r\n <textarea\r\n id=\"mt-reject-reason\"\r\n rows=\"3\"\r\n class=\"w-full rounded-md border border-surface-300 px-3 py-2 text-sm focus:border-primary focus:outline-none\"\r\n [class.border-red-400]=\"submitted() && !isValid()\"\r\n [value]=\"reason()\"\r\n (input)=\"onReasonInput($event)\"\r\n [attr.aria-invalid]=\"submitted() && !isValid()\"\r\n [placeholder]=\"t('delegations.form.rejectionReason')\"\r\n ></textarea>\r\n @if (submitted() && !isValid()) {\r\n <span class=\"text-xs text-red-600\">\r\n {{ t(\"delegations.form.rejectReasonRequired\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div class=\"flex justify-end gap-2 pt-2 border-t border-surface-200\">\r\n <mt-button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n [label]=\"t('delegations.common.cancel')\"\r\n [disabled]=\"isBusy()\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n <mt-button\r\n color=\"danger\"\r\n icon=\"general.x-close\"\r\n [label]=\"t('delegations.action.reject')\"\r\n [loading]=\"isBusy()\"\r\n [disabled]=\"!isValid()\"\r\n (click)=\"confirm()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ActivatedRoute,\r\n NavigationEnd,\r\n Router,\r\n RouterOutlet,\r\n} from '@angular/router';\r\nimport { filter } from 'rxjs';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { PageHeaderTab } from '@masterteam/components/page-header';\r\n\r\ninterface DelegationRouteTab {\r\n label: string;\r\n path: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-delegations',\r\n imports: [Page, RouterOutlet, TranslocoDirective],\r\n templateUrl: './delegations.html',\r\n styleUrl: './delegations.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class Delegations implements OnInit {\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly tabs = signal<PageHeaderTab[]>([]);\r\n protected readonly activeTab = signal<string>('');\r\n\r\n constructor() {\r\n this.router.events\r\n .pipe(\r\n filter(\r\n (event): event is NavigationEnd => event instanceof NavigationEnd,\r\n ),\r\n takeUntilDestroyed(),\r\n )\r\n .subscribe(() => this.syncSelectedTabFromRoute());\r\n }\r\n\r\n ngOnInit(): void {\r\n this.tabs.set(\r\n this.getRouteTabs().map((tab) => ({\r\n label: tab.label,\r\n value: tab.path,\r\n })),\r\n );\r\n this.syncSelectedTabFromRoute();\r\n }\r\n\r\n goBack() {\r\n void this.router.navigate(['control-panel/product-settings']);\r\n }\r\n\r\n protected onTabChange(value: string | number): void {\r\n if (typeof value !== 'string') {\r\n return;\r\n }\r\n\r\n const tab = this.getRouteTabs().find((item) => item.path === value);\r\n if (!tab) {\r\n return;\r\n }\r\n\r\n void this.router.navigate([tab.path], { relativeTo: this.route });\r\n }\r\n\r\n private syncSelectedTabFromRoute(): void {\r\n const currentPath = this.route.snapshot.firstChild?.routeConfig?.path;\r\n this.activeTab.set(currentPath || this.tabs()[0]?.value?.toString() || '');\r\n }\r\n\r\n private getRouteTabs(): DelegationRouteTab[] {\r\n return (this.route.routeConfig?.children ?? []).flatMap((childRoute) => {\r\n const path = childRoute.path?.trim();\r\n const label = childRoute.data?.['tabLabel'];\r\n\r\n if (!path || typeof label !== 'string') {\r\n return [];\r\n }\r\n\r\n return [{ path, label: this.transloco.translate(label) }];\r\n });\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <mt-page\r\n [title]=\"t('delegations.title')\"\r\n [avatarIcon]=\"'custom.hierarchy-structure'\"\r\n [tabs]=\"tabs()\"\r\n [activeTab]=\"activeTab()\"\r\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-indigo-50)',\r\n '--p-avatar-color': 'var(--p-indigo-700)',\r\n }\"\r\n (tabChange)=\"onTabChange($event)\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <router-outlet />\r\n </mt-page>\r\n</ng-container>\r\n","import type {\r\n DelegationDisplayValue,\r\n DelegationScopeAction,\r\n DelegationScopeTarget,\r\n} from '../../store/delegations/delegations.model';\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n}\r\n\r\nfunction readLocalizedValue(\r\n source: Record<string, unknown>,\r\n preferredLanguage: string,\r\n): string | null {\r\n const normalizedLanguage = preferredLanguage.toLowerCase();\r\n const baseLanguage = normalizedLanguage.split('-')[0];\r\n const preferredKeys = normalizedLanguage.startsWith('ar')\r\n ? ['defaultAr', 'ar', normalizedLanguage, baseLanguage, 'defaultEn', 'en']\r\n : ['defaultEn', 'en', normalizedLanguage, baseLanguage, 'defaultAr', 'ar'];\r\n\r\n for (const key of preferredKeys) {\r\n const value = source[key];\r\n if (typeof value === 'string' && value.trim()) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n for (const key of ['en', 'ar', 'defaultEn', 'defaultAr']) {\r\n const value = source[key];\r\n if (typeof value === 'string' && value.trim()) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction parseJsonRecord(value: string): Record<string, unknown> | null {\r\n const trimmed = value.trim();\r\n\r\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n return isRecord(parsed) ? parsed : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction resolveDisplayValue(\r\n value: unknown,\r\n preferredLanguage: string,\r\n): string | null {\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return null;\r\n }\r\n\r\n const parsed = parseJsonRecord(trimmed);\r\n if (parsed) {\r\n return (\r\n readLocalizedValue(parsed, preferredLanguage) ??\r\n readDisplayValue(\r\n parsed,\r\n ['displayName', 'displayLabel', 'label'],\r\n preferredLanguage,\r\n ) ??\r\n trimmed\r\n );\r\n }\r\n\r\n return trimmed;\r\n }\r\n\r\n if (!isRecord(value)) {\r\n return null;\r\n }\r\n\r\n return (\r\n readLocalizedValue(value, preferredLanguage) ??\r\n readDisplayValue(\r\n value,\r\n [\r\n 'displayName',\r\n 'displayLabel',\r\n 'operationDisplayName',\r\n 'operationLabel',\r\n 'label',\r\n 'name',\r\n 'value',\r\n ],\r\n preferredLanguage,\r\n )\r\n );\r\n}\r\n\r\nfunction readDisplayValue(\r\n source: Record<string, unknown>,\r\n keys: string[],\r\n preferredLanguage: string,\r\n): string | null {\r\n for (const key of keys) {\r\n const value = resolveDisplayValue(source[key], preferredLanguage);\r\n if (value) {\r\n return value;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction resolveDisplayOrHumanizedKey(\r\n source: Record<string, unknown>,\r\n displayKeys: string[],\r\n fallbackKey?: string | null,\r\n preferredLanguage = 'en',\r\n): string {\r\n const displayValue = readDisplayValue(source, displayKeys, preferredLanguage);\r\n if (displayValue) {\r\n return displayValue;\r\n }\r\n\r\n return humanizeDelegationKey(fallbackKey);\r\n}\r\n\r\nexport function humanizeDelegationKey(value?: string | null): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const normalized = value\r\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\r\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\r\n .replace(/[._-]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n\r\n if (!normalized) {\r\n return '';\r\n }\r\n\r\n return normalized.replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nexport function formatDelegationDisplayValue(\r\n value: DelegationDisplayValue | undefined,\r\n preferredLanguage = 'en',\r\n): string {\r\n return resolveDisplayValue(value, preferredLanguage) ?? '';\r\n}\r\n\r\nexport function formatDelegationTargetLabel(\r\n target: DelegationScopeTarget,\r\n preferredLanguage = 'en',\r\n): string {\r\n return resolveDisplayOrHumanizedKey(\r\n target as unknown as Record<string, unknown>,\r\n ['name', 'displayName', 'displayLabel', 'label'],\r\n target.targetKey,\r\n preferredLanguage,\r\n );\r\n}\r\n\r\nexport function formatDelegationActionLabel(\r\n action: DelegationScopeAction,\r\n preferredLanguage = 'en',\r\n): string {\r\n return resolveDisplayOrHumanizedKey(\r\n action as unknown as Record<string, unknown>,\r\n [\r\n 'name',\r\n 'displayName',\r\n 'displayLabel',\r\n 'operationDisplayName',\r\n 'operationLabel',\r\n 'label',\r\n ],\r\n action.operationKey,\r\n preferredLanguage,\r\n );\r\n}\r\n\r\nexport function formatDelegationScopeSummary(\r\n value: DelegationDisplayValue | undefined,\r\n preferredLanguage = 'en',\r\n): string {\r\n return formatDelegationDisplayValue(value, preferredLanguage);\r\n}\r\n","import type {\r\n DelegationDisplayValue,\r\n DelegationGrant,\r\n DelegationScopeAction,\r\n DelegationScopeCombinationRule,\r\n DelegationScopeFact,\r\n DelegationScopeHierarchyGroup,\r\n DelegationScopeHierarchyTarget,\r\n DelegationScopeLevelNode,\r\n DelegationScopeModuleNode,\r\n DelegationScopeOptions,\r\n DelegationScopePermissionGroup,\r\n DelegationScopeTarget,\r\n} from '../../store/delegations/delegations.model';\r\n\r\nconst DEFAULT_SORT_ORDER = Number.MAX_SAFE_INTEGER;\r\n\r\nexport interface DelegationGrantableTargetGroup {\r\n key: string;\r\n target: DelegationScopeTarget;\r\n grants: DelegationGrant[];\r\n sortOrder: number;\r\n}\r\n\r\nexport interface DelegationGrantableHierarchyGroup {\r\n key: string;\r\n groupType: string;\r\n displayName?: DelegationDisplayValue;\r\n sortOrder: number;\r\n targets: DelegationGrantableTargetGroup[];\r\n}\r\n\r\nfunction toArray<T>(value?: T[] | null): T[] {\r\n return Array.isArray(value) ? value : [];\r\n}\r\n\r\nfunction normalizeGrant(grant: DelegationGrant): DelegationGrant {\r\n return {\r\n ...grant,\r\n action: normalizeAction(grant.action),\r\n accessibilities: toArray(grant.accessibilities),\r\n dataFilters: toArray(grant.dataFilters),\r\n constraints: toArray(grant.constraints),\r\n };\r\n}\r\n\r\nfunction normalizeAction(action: DelegationScopeAction): DelegationScopeAction {\r\n return {\r\n ...action,\r\n isDelegableSnapshot:\r\n action.isDelegableSnapshot ?? action.isDelegable ?? undefined,\r\n };\r\n}\r\n\r\nfunction normalizeKey(value: unknown): string | null {\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n return trimmed || null;\r\n }\r\n\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return String(value);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeSortOrder(value: unknown): number {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n const numericValue = Number(value);\r\n return Number.isFinite(numericValue) ? numericValue : DEFAULT_SORT_ORDER;\r\n}\r\n\r\nfunction compareBySortThenKey(\r\n left: number,\r\n right: number,\r\n leftKey: string,\r\n rightKey: string,\r\n): number {\r\n if (left !== right) {\r\n return left - right;\r\n }\r\n\r\n return leftKey.localeCompare(rightKey);\r\n}\r\n\r\nfunction targetIdentity(target: DelegationScopeTarget): string {\r\n return `${target.applicationKey}::${target.targetType}::${target.targetKey}`;\r\n}\r\n\r\nfunction groupIdentity(\r\n groupType: string,\r\n groupKey: string,\r\n fallbackTargetKey?: string,\r\n): string {\r\n return `${groupType}::${groupKey || fallbackTargetKey || 'group'}`;\r\n}\r\n\r\nfunction buildHierarchyGrant(\r\n target: DelegationScopeTarget,\r\n action: DelegationScopeAction,\r\n): DelegationGrant {\r\n return normalizeGrant({\r\n applicationKey:\r\n normalizeKey(target.applicationKey) ??\r\n normalizeKey(action.applicationKey) ??\r\n '',\r\n target,\r\n action: normalizeAction(action),\r\n accessibilities: [],\r\n dataFilters: [],\r\n constraints: [],\r\n });\r\n}\r\n\r\nfunction factLookupKeys(fact: DelegationScopeFact): string[] {\r\n const candidates = [\r\n fact.key,\r\n fact.code,\r\n fact.id,\r\n fact['accessibilityKey'],\r\n fact['dataFilterKey'],\r\n fact['constraintKey'],\r\n fact['permissionKey'],\r\n fact['pageKey'],\r\n fact['value'],\r\n ];\r\n\r\n return candidates\r\n .map(normalizeKey)\r\n .filter((value): value is string => !!value);\r\n}\r\n\r\nfunction buildFactIndex(\r\n facts: DelegationScopeFact[],\r\n): Map<string, DelegationScopeFact> {\r\n const index = new Map<string, DelegationScopeFact>();\r\n\r\n for (const fact of facts) {\r\n for (const key of factLookupKeys(fact)) {\r\n if (!index.has(key)) {\r\n index.set(key, fact);\r\n }\r\n }\r\n }\r\n\r\n return index;\r\n}\r\n\r\nfunction lookupFacts(\r\n keys: string[] | null | undefined,\r\n index: Map<string, DelegationScopeFact>,\r\n): DelegationScopeFact[] {\r\n if (!Array.isArray(keys) || keys.length === 0) {\r\n return [];\r\n }\r\n\r\n const resolved: DelegationScopeFact[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const rawKey of keys) {\r\n const key = normalizeKey(rawKey);\r\n if (!key || seen.has(key)) {\r\n continue;\r\n }\r\n\r\n const match = index.get(key);\r\n if (!match) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n resolved.push(match);\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\nfunction ruleKeys(\r\n rule: DelegationScopeCombinationRule,\r\n preferredKeys: string[],\r\n): string[] | null {\r\n for (const preferredKey of preferredKeys) {\r\n const value = rule[preferredKey];\r\n if (Array.isArray(value)) {\r\n return value.map((item) => String(item));\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction matchesTarget(\r\n target: DelegationScopeTarget,\r\n rule: DelegationScopeCombinationRule,\r\n): boolean {\r\n return (\r\n target.targetType === rule.targetType &&\r\n target.targetKey === rule.targetKey &&\r\n (!rule.applicationKey ||\r\n !target.applicationKey ||\r\n target.applicationKey === rule.applicationKey)\r\n );\r\n}\r\n\r\nfunction matchesAction(\r\n action: DelegationScopeAction,\r\n rule: DelegationScopeCombinationRule,\r\n applicationKey?: string,\r\n): boolean {\r\n return (\r\n action.operationKey === rule.operationKey &&\r\n (!rule.applicationKey ||\r\n !action.applicationKey ||\r\n action.applicationKey === rule.applicationKey) &&\r\n (!applicationKey ||\r\n !action.applicationKey ||\r\n action.applicationKey === applicationKey)\r\n );\r\n}\r\n\r\nfunction grantIdentity(grant: DelegationGrant): string {\r\n return JSON.stringify({\r\n app: grant.applicationKey,\r\n target: [\r\n grant.target.applicationKey,\r\n grant.target.targetType,\r\n grant.target.targetKey,\r\n grant.target.moduleKey ?? null,\r\n grant.target.permissionModuleType ?? null,\r\n grant.target.permissionTargetId ?? null,\r\n ],\r\n action: [\r\n grant.action.applicationKey,\r\n grant.action.operationKey,\r\n grant.action.operationKind,\r\n grant.action.permissionCommand ?? null,\r\n grant.action.businessActionCode ?? null,\r\n ],\r\n accessibilities: grant.accessibilities.map(factLookupKeys),\r\n dataFilters: grant.dataFilters.map(factLookupKeys),\r\n constraints: grant.constraints.map(factLookupKeys),\r\n });\r\n}\r\n\r\nfunction buildGroupsFromHierarchy(\r\n hierarchy: DelegationScopeHierarchyGroup[],\r\n): DelegationGrantableHierarchyGroup[] {\r\n return hierarchy\r\n .map((group) => {\r\n const targets = toArray(group.targets)\r\n .map((targetNode: DelegationScopeHierarchyTarget) => {\r\n const grants = toArray(targetNode.operations)\r\n .map((operation) =>\r\n buildHierarchyGrant(targetNode.target, operation),\r\n )\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n normalizeSortOrder(left.action.sortOrder),\r\n normalizeSortOrder(right.action.sortOrder),\r\n left.action.operationKey,\r\n right.action.operationKey,\r\n ),\r\n );\r\n\r\n return {\r\n key: targetIdentity(targetNode.target),\r\n target: targetNode.target,\r\n grants,\r\n sortOrder: normalizeSortOrder(\r\n targetNode.sortOrder ?? targetNode.target.levelModuleId,\r\n ),\r\n };\r\n })\r\n .filter((targetNode) => targetNode.grants.length > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n );\r\n\r\n return {\r\n key: groupIdentity(group.groupType, group.groupKey),\r\n groupType: group.groupType,\r\n displayName: group.displayName,\r\n sortOrder: normalizeSortOrder(group.sortOrder ?? group.levelId),\r\n targets,\r\n };\r\n })\r\n .filter((group) => group.targets.length > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n );\r\n}\r\n\r\nfunction getLegacyGrantableGrants(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationGrant[] {\r\n if (!options) {\r\n return [];\r\n }\r\n\r\n const legacyGrants = toArray(options.grants).map(normalizeGrant);\r\n if (legacyGrants.length > 0) {\r\n return legacyGrants;\r\n }\r\n\r\n const targets = toArray(options.targets);\r\n const operations = toArray(options.operations);\r\n const combinationRules = toArray(options.combinationRules);\r\n\r\n if (\r\n targets.length === 0 ||\r\n operations.length === 0 ||\r\n combinationRules.length === 0\r\n ) {\r\n return [];\r\n }\r\n\r\n const accessibilityIndex = buildFactIndex(toArray(options.accessibilities));\r\n const dataFilterIndex = buildFactIndex(toArray(options.dataFilters));\r\n const constraintIndex = buildFactIndex(toArray(options.constraints));\r\n const grants: DelegationGrant[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const rule of combinationRules) {\r\n const target = targets.find((item) => matchesTarget(item, rule));\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n const applicationKey =\r\n normalizeKey(rule.applicationKey) ??\r\n normalizeKey(target.applicationKey) ??\r\n null;\r\n\r\n const action = operations.find((item) =>\r\n matchesAction(item, rule, applicationKey ?? undefined),\r\n );\r\n if (!action) {\r\n continue;\r\n }\r\n\r\n const grant: DelegationGrant = normalizeGrant({\r\n applicationKey:\r\n applicationKey ??\r\n normalizeKey(action.applicationKey) ??\r\n normalizeKey(target.applicationKey) ??\r\n '',\r\n target,\r\n action: normalizeAction(action),\r\n accessibilities: lookupFacts(\r\n ruleKeys(rule, ['accessibilityKeys', 'accessibilities']),\r\n accessibilityIndex,\r\n ),\r\n dataFilters: lookupFacts(\r\n ruleKeys(rule, ['dataFilterKeys', 'dataFilters', 'filterKeys']),\r\n dataFilterIndex,\r\n ),\r\n constraints: lookupFacts(\r\n ruleKeys(rule, ['constraintKeys', 'constraints']),\r\n constraintIndex,\r\n ),\r\n });\r\n\r\n const identity = grantIdentity(grant);\r\n if (seen.has(identity)) {\r\n continue;\r\n }\r\n\r\n seen.add(identity);\r\n grants.push(grant);\r\n }\r\n\r\n return grants;\r\n}\r\n\r\nfunction buildGroupsFromGrants(\r\n grants: DelegationGrant[],\r\n): DelegationGrantableHierarchyGroup[] {\r\n const groups = new Map<\r\n string,\r\n {\r\n groupType: string;\r\n displayName?: DelegationDisplayValue;\r\n sortOrder: number;\r\n targets: Map<string, DelegationGrantableTargetGroup>;\r\n }\r\n >();\r\n\r\n for (const grant of grants) {\r\n const parentGroupKey =\r\n normalizeKey(grant.target.parentTargetKey) ?? grant.target.targetKey;\r\n const parentGroupType =\r\n grant.target.parentTargetType ?? grant.target.targetType;\r\n const groupKey = groupIdentity(\r\n parentGroupType,\r\n parentGroupKey,\r\n grant.target.targetKey,\r\n );\r\n\r\n let group = groups.get(groupKey);\r\n if (!group) {\r\n group = {\r\n groupType: parentGroupType,\r\n displayName:\r\n grant.target.parentDisplayName ?? grant.target.displayName ?? null,\r\n sortOrder: normalizeSortOrder(\r\n grant.target.parentLevelId ?? grant.target.levelId,\r\n ),\r\n targets: new Map<string, DelegationGrantableTargetGroup>(),\r\n };\r\n groups.set(groupKey, group);\r\n }\r\n\r\n const targetKey = targetIdentity(grant.target);\r\n const existingTarget = group.targets.get(targetKey);\r\n\r\n if (existingTarget) {\r\n existingTarget.grants.push(grant);\r\n continue;\r\n }\r\n\r\n group.targets.set(targetKey, {\r\n key: targetKey,\r\n target: grant.target,\r\n grants: [grant],\r\n sortOrder: normalizeSortOrder(\r\n grant.target.levelModuleId ?? grant.target.targetId,\r\n ),\r\n });\r\n }\r\n\r\n return Array.from(groups.entries())\r\n .map(([key, value]) => ({\r\n key,\r\n groupType: value.groupType,\r\n displayName: value.displayName,\r\n sortOrder: value.sortOrder,\r\n targets: Array.from(value.targets.values())\r\n .map((targetGroup) => ({\r\n ...targetGroup,\r\n grants: [...targetGroup.grants].sort((left, right) =>\r\n compareBySortThenKey(\r\n normalizeSortOrder(left.action.sortOrder),\r\n normalizeSortOrder(right.action.sortOrder),\r\n left.action.operationKey,\r\n right.action.operationKey,\r\n ),\r\n ),\r\n }))\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n ),\r\n }))\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n );\r\n}\r\n\r\nexport function getDelegationGrantableGroups(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationGrantableHierarchyGroup[] {\r\n const hierarchyGroups = buildGroupsFromHierarchy(toArray(options?.hierarchy));\r\n if (hierarchyGroups.length > 0) {\r\n return hierarchyGroups;\r\n }\r\n\r\n return buildGroupsFromGrants(getLegacyGrantableGrants(options));\r\n}\r\n\r\nexport function getDelegationGrantableGrants(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationGrant[] {\r\n return getDelegationGrantableGroups(options).flatMap((group) =>\r\n group.targets.flatMap((targetGroup) => targetGroup.grants),\r\n );\r\n}\r\n\r\nexport function hasDelegationGrantableScope(\r\n options: DelegationScopeOptions | null | undefined,\r\n): boolean {\r\n return (\r\n getDelegationPermissionTree(options).length > 0 ||\r\n getDelegationGrantableGroups(options).length > 0\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// New `scope/options` contract (doc 03): permissions tree\r\n// Template -> Level (own operations + modules) -> Module (operations).\r\n// Both Level and LevelModule are selectable permission surfaces; each operation\r\n// leaf maps to one explicit DelegationGrant.\r\n// ============================================================================\r\n\r\nexport type DelegationScopeNodeKind =\r\n | 'template'\r\n | 'level'\r\n | 'module'\r\n | 'operation';\r\n\r\nexport interface DelegationScopeTreeNode {\r\n key: string;\r\n kind: DelegationScopeNodeKind;\r\n displayName?: DelegationDisplayValue;\r\n fallbackKey?: string | null;\r\n isHighRisk?: boolean;\r\n /** Present only on operation leaves: the explicit grant to persist/preview. */\r\n grant?: DelegationGrant;\r\n children?: DelegationScopeTreeNode[];\r\n}\r\n\r\n/** Stable selection key for an operation leaf, independent of accessibilities. */\r\nexport function delegationOperationNodeKey(grant: DelegationGrant): string {\r\n return `op:${targetIdentity(grant.target)}::${grant.action.operationKey}`;\r\n}\r\n\r\nfunction buildScopeTarget(\r\n node: DelegationScopeLevelNode | DelegationScopeModuleNode,\r\n): DelegationScopeTarget {\r\n const moduleNode = node as DelegationScopeModuleNode;\r\n return {\r\n applicationKey: node.applicationKey,\r\n targetType: node.targetType,\r\n targetKey: node.targetKey,\r\n name: node.name ?? null,\r\n displayName: node.name ?? null,\r\n legacyModuleId: node.legacyModuleId ?? null,\r\n targetId: node.targetId ?? null,\r\n levelId: node.levelId ?? null,\r\n levelModuleId: moduleNode.levelModuleId ?? null,\r\n domainModuleId: moduleNode.domainModuleId ?? null,\r\n moduleKey: moduleNode.moduleKey ?? null,\r\n permissionModuleType: node.permissionModuleType ?? null,\r\n permissionTargetId: node.permissionTargetId ?? null,\r\n };\r\n}\r\n\r\nfunction buildOperationGrant(\r\n target: DelegationScopeTarget,\r\n operation: DelegationScopeAction,\r\n): DelegationGrant {\r\n const action: DelegationScopeAction = {\r\n applicationKey: operation.applicationKey ?? target.applicationKey,\r\n operationKey: operation.operationKey,\r\n operationKind: operation.operationKind,\r\n name: operation.name ?? null,\r\n displayName: operation.name ?? operation.displayName ?? null,\r\n permissionCommand: operation.permissionCommand ?? null,\r\n businessActionCode: operation.businessActionCode ?? null,\r\n isHighRisk: operation.isHighRisk ?? false,\r\n isDelegableSnapshot: operation.isDelegableSnapshot ?? true,\r\n sortOrder: operation.sortOrder ?? null,\r\n };\r\n\r\n return {\r\n applicationKey: target.applicationKey,\r\n target,\r\n action,\r\n accessibilities: [],\r\n dataFilters: [],\r\n constraints: [],\r\n };\r\n}\r\n\r\nfunction buildOperationNodes(\r\n target: DelegationScopeTarget,\r\n operations: DelegationScopeAction[] | null | undefined,\r\n): DelegationScopeTreeNode[] {\r\n return toArray(operations)\r\n .map((operation) => {\r\n const grant = buildOperationGrant(target, operation);\r\n return {\r\n key: delegationOperationNodeKey(grant),\r\n kind: 'operation' as const,\r\n displayName: operation.name ?? operation.displayName ?? null,\r\n fallbackKey: operation.operationKey,\r\n isHighRisk: operation.isHighRisk ?? false,\r\n grant,\r\n sortOrder: normalizeSortOrder(operation.sortOrder),\r\n };\r\n })\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n}\r\n\r\nfunction buildModuleNode(\r\n module: DelegationScopeModuleNode,\r\n): DelegationScopeTreeNode & { sortOrder: number } {\r\n const target = buildScopeTarget(module);\r\n return {\r\n key: `mod:${targetIdentity(target)}`,\r\n kind: 'module',\r\n displayName: module.name ?? null,\r\n fallbackKey: module.targetKey,\r\n children: buildOperationNodes(target, module.operations),\r\n sortOrder: normalizeSortOrder(module.sortOrder ?? module.levelModuleId),\r\n };\r\n}\r\n\r\nfunction buildLevelNode(\r\n level: DelegationScopeLevelNode,\r\n): DelegationScopeTreeNode & { sortOrder: number } {\r\n const target = buildScopeTarget(level);\r\n const operationNodes = buildOperationNodes(target, level.operations);\r\n const moduleNodes = toArray(level.modules)\r\n .map(buildModuleNode)\r\n .filter((node) => (node.children?.length ?? 0) > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n\r\n return {\r\n key: `lvl:${targetIdentity(target)}`,\r\n kind: 'level',\r\n displayName: level.name ?? null,\r\n fallbackKey: level.targetKey,\r\n children: [...operationNodes, ...moduleNodes],\r\n sortOrder: normalizeSortOrder(level.sortOrder ?? level.levelId),\r\n };\r\n}\r\n\r\nfunction buildTemplateNode(\r\n group: DelegationScopePermissionGroup,\r\n): DelegationScopeTreeNode & { sortOrder: number } {\r\n const levelNodes = toArray(group.levels)\r\n .map(buildLevelNode)\r\n .filter((node) => (node.children?.length ?? 0) > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n\r\n return {\r\n key: `tpl:${group.groupKey}`,\r\n kind: 'template',\r\n displayName: group.name ?? null,\r\n fallbackKey: group.groupKey,\r\n children: levelNodes,\r\n sortOrder: normalizeSortOrder(group.sortOrder ?? group.templateId),\r\n };\r\n}\r\n\r\nexport function getDelegationPermissionTree(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationScopeTreeNode[] {\r\n return toArray(options?.permissions)\r\n .map(buildTemplateNode)\r\n .filter((node) => (node.children?.length ?? 0) > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n}\r\n\r\n/** Back-compat: project the legacy group/target/grant shape onto the tree model. */\r\nfunction legacyGroupsToTree(\r\n groups: DelegationGrantableHierarchyGroup[],\r\n): DelegationScopeTreeNode[] {\r\n return groups.map((group) => ({\r\n key: `grp:${group.key}`,\r\n kind: 'template' as const,\r\n displayName: group.displayName ?? null,\r\n fallbackKey: group.groupType,\r\n children: group.targets.map((targetGroup) => ({\r\n key: `tgt:${targetGroup.key}`,\r\n kind: 'module' as const,\r\n displayName:\r\n targetGroup.target.name ?? targetGroup.target.displayName ?? null,\r\n fallbackKey: targetGroup.target.targetKey,\r\n children: targetGroup.grants.map((grant) => ({\r\n key: delegationOperationNodeKey(grant),\r\n kind: 'operation' as const,\r\n displayName: grant.action.name ?? grant.action.displayName ?? null,\r\n fallbackKey: grant.action.operationKey,\r\n isHighRisk: grant.action.isHighRisk ?? false,\r\n grant,\r\n })),\r\n })),\r\n }));\r\n}\r\n\r\n/**\r\n * Unified scope tree for the picker. Prefers the new `permissions` contract;\r\n * falls back to the legacy hierarchy/grants projection for older environments.\r\n */\r\nexport function getDelegationScopeTree(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationScopeTreeNode[] {\r\n const fromPermissions = getDelegationPermissionTree(options);\r\n if (fromPermissions.length > 0) {\r\n return fromPermissions;\r\n }\r\n return legacyGroupsToTree(getDelegationGrantableGroups(options));\r\n}\r\n\r\n/** All operation-leaf grants in the tree, keyed by their stable node key. */\r\nexport function indexDelegationTreeGrants(\r\n nodes: DelegationScopeTreeNode[],\r\n): Map<string, DelegationGrant> {\r\n const index = new Map<string, DelegationGrant>();\r\n const walk = (list: DelegationScopeTreeNode[]): void => {\r\n for (const node of list) {\r\n if (node.kind === 'operation' && node.grant) {\r\n index.set(node.key, node.grant);\r\n }\r\n if (node.children?.length) {\r\n walk(node.children);\r\n }\r\n }\r\n };\r\n walk(nodes);\r\n return index;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { DelegationsFacade } from '../../../../store/delegations/delegations.facade';\r\nimport {\r\n DelegationAppAccessibility,\r\n DelegationDisplayValue,\r\n DelegationGrant,\r\n DelegationScopeFact,\r\n DelegationScopeSelection,\r\n} from '../../../../store/delegations/delegations.model';\r\nimport {\r\n formatDelegationDisplayValue,\r\n formatDelegationScopeSummary,\r\n humanizeDelegationKey,\r\n} from '../../delegation-scope-display';\r\nimport {\r\n DelegationScopeTreeNode,\r\n delegationOperationNodeKey,\r\n getDelegationScopeTree,\r\n indexDelegationTreeGrants,\r\n} from '../../delegation-scope-options';\r\n\r\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\r\n\r\ntype NodeCheckState = 'checked' | 'indeterminate' | 'unchecked';\r\n\r\n/**\r\n * Hierarchy-based scope picker (doc 03). Driven entirely by `scope/options`:\r\n * - renders the backend-owned Template -> Level -> Module -> operation tree as a\r\n * clean, accessible checkbox tree (parents propagate to descendant operations),\r\n * - offers optional app-accessibility grants,\r\n * - calls `scope/preview` (debounced) and surfaces summary / warnings / denied.\r\n *\r\n * `[(scope)]` two-way binds a `DelegationScopeSelection`. Scope grants are the\r\n * single source of truth for selection; the component never invents permission\r\n * metadata — it only echoes targets/actions/accessibilities returned by options.\r\n */\r\n@Component({\r\n selector: 'mt-scope-picker',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ScrollingModule,\r\n Button,\r\n Card,\r\n Icon,\r\n Tabs,\r\n TextField,\r\n SkeletonModule,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './scope-picker.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ScopePicker {\r\n readonly scope = model<DelegationScopeSelection>(EMPTY_SCOPE);\r\n readonly readonly = input<boolean>(false);\r\n readonly adminMode = input<boolean>(false);\r\n /**\r\n * Delegator whose grantable scope is loaded. Undefined = current user\r\n * (self-service). In admin mode the host rebinds this as the selected\r\n * delegator changes, and options reload reactively.\r\n */\r\n readonly delegatorUserId = input<string | undefined>(undefined);\r\n\r\n private readonly facade = inject(DelegationsFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n protected readonly options = this.facade.scopeOptions;\r\n protected readonly preview = this.facade.scopePreview;\r\n protected readonly isLoadingOptions = this.facade.isLoadingScopeOptions;\r\n protected readonly isPreviewing = this.facade.isPreviewingScope;\r\n protected readonly errorOptions = this.facade.errorScopeOptions;\r\n\r\n protected readonly activeLang = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n\r\n // --- Permission tree ------------------------------------------------------\r\n protected readonly treeModel = computed<DelegationScopeTreeNode[]>(() =>\r\n getDelegationScopeTree(this.options()),\r\n );\r\n protected readonly hasOptions = computed(() => this.treeModel().length > 0);\r\n protected readonly grantIndex = computed(() =>\r\n indexDelegationTreeGrants(this.treeModel()),\r\n );\r\n\r\n /** nodeKey -> all descendant operation-leaf keys (self for operation nodes). */\r\n protected readonly opKeyMap = computed(() => {\r\n const map = new Map<string, string[]>();\r\n const collect = (node: DelegationScopeTreeNode): string[] => {\r\n if (node.kind === 'operation') {\r\n map.set(node.key, [node.key]);\r\n return [node.key];\r\n }\r\n const keys = (node.children ?? []).flatMap(collect);\r\n map.set(node.key, keys);\r\n return keys;\r\n };\r\n this.treeModel().forEach(collect);\r\n return map;\r\n });\r\n\r\n /** Stable operation-node keys for the current scope grants. */\r\n protected readonly selectedKeys = computed(\r\n () => new Set(this.scope().grants.map(delegationOperationNodeKey)),\r\n );\r\n protected readonly selectedCount = computed(() => this.selectedKeys().size);\r\n\r\n /** Every selectable operation key (for the \"select all\" master toggle). */\r\n protected readonly allLeafKeys = computed(() =>\r\n Array.from(this.grantIndex().keys()),\r\n );\r\n protected readonly selectAllState = computed<NodeCheckState>(() => {\r\n const all = this.allLeafKeys();\r\n if (!all.length) return 'unchecked';\r\n const selected = this.selectedKeys();\r\n let count = 0;\r\n for (const key of all) {\r\n if (selected.has(key)) count++;\r\n }\r\n if (count === 0) return 'unchecked';\r\n return count === all.length ? 'checked' : 'indeterminate';\r\n });\r\n\r\n protected readonly searchTerm = signal('');\r\n protected readonly expandedKeys = signal<Set<string>>(new Set());\r\n\r\n protected readonly filteredTree = computed<DelegationScopeTreeNode[]>(() => {\r\n const term = this.searchTerm().trim().toLowerCase();\r\n if (!term) {\r\n return this.treeModel();\r\n }\r\n const prune = (\r\n node: DelegationScopeTreeNode,\r\n ): DelegationScopeTreeNode | null => {\r\n const selfMatch = this.nodeLabel(node).toLowerCase().includes(term);\r\n const children = (node.children ?? [])\r\n .map(prune)\r\n .filter((child): child is DelegationScopeTreeNode => !!child);\r\n if (children.length) {\r\n return { ...node, children };\r\n }\r\n if (selfMatch) {\r\n return node;\r\n }\r\n return null;\r\n };\r\n return this.treeModel()\r\n .map(prune)\r\n .filter((node): node is DelegationScopeTreeNode => !!node);\r\n });\r\n\r\n /**\r\n * Flattened list of currently-visible rows (respecting expand state + search)\r\n * for CDK virtual scrolling — only the on-screen rows render, so large\r\n * permission catalogs stay fast. Recomputes on tree/expand/search changes,\r\n * NOT on selection toggles.\r\n */\r\n protected readonly visibleNodes = computed<\r\n { node: DelegationScopeTreeNode; depth: number }[]\r\n >(() => {\r\n const out: { node: DelegationScopeTreeNode; depth: number }[] = [];\r\n const searching = !!this.searchTerm().trim();\r\n const expanded = this.expandedKeys();\r\n const walk = (nodes: DelegationScopeTreeNode[], depth: number): void => {\r\n for (const node of nodes) {\r\n out.push({ node, depth });\r\n const open = searching || expanded.has(node.key);\r\n if (open && node.children?.length) {\r\n walk(node.children, depth + 1);\r\n }\r\n }\r\n };\r\n walk(this.filteredTree(), 0);\r\n return out;\r\n });\r\n\r\n // --- App accessibility ----------------------------------------------------\r\n protected readonly appAccessibilities = computed<\r\n DelegationAppAccessibility[]\r\n >(() => this.options()?.appAccessibility ?? []);\r\n protected readonly selectedAccessibilityKeys = signal<Set<string>>(new Set());\r\n protected readonly selectedAccessibilityCount = computed(\r\n () => this.selectedAccessibilityKeys().size,\r\n );\r\n protected readonly hasAccessibility = computed(\r\n () => this.appAccessibilities().length > 0,\r\n );\r\n\r\n /** Inner view switch: permission tree vs app-accessibility grants. */\r\n protected readonly activeScopeTab = signal<'permissions' | 'accessibility'>(\r\n 'permissions',\r\n );\r\n\r\n constructor() {\r\n // Load (and reload) grantable options whenever the delegator changes.\r\n let initialized = false;\r\n let lastDelegatorUserId: string | undefined;\r\n effect(() => {\r\n const delegator = this.delegatorUserId();\r\n const asAdmin = this.adminMode();\r\n untracked(() => this.facade.loadScopeOptions(delegator, asAdmin));\r\n\r\n if (!initialized) {\r\n initialized = true;\r\n lastDelegatorUserId = delegator;\r\n return;\r\n }\r\n\r\n if (lastDelegatorUserId !== delegator) {\r\n // Only reset when the user actually switches between two real\r\n // delegators. The initial population (undefined -> id, e.g. edit\r\n // prefill or self-service current user arriving) must NOT wipe the\r\n // freshly-bound scope.\r\n const switchedDelegator = !!lastDelegatorUserId && !!delegator;\r\n lastDelegatorUserId = delegator;\r\n if (switchedDelegator) {\r\n untracked(() => {\r\n this.scope.set(EMPTY_SCOPE);\r\n this.selectedAccessibilityKeys.set(new Set());\r\n this.searchTerm.set('');\r\n this.activeScopeTab.set('permissions');\r\n this.facade.clearScopePreview();\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Expansion on options (re)load: Template nodes expand by default (levels\r\n // collapse so large catalogs open compact); additionally expand the path to\r\n // any already-selected grant so an edit's saved selection is visible.\r\n effect(() => {\r\n const model = this.treeModel();\r\n untracked(() =>\r\n this.expandedKeys.set(\r\n this.collectExpansion(model, this.selectedKeys(), new Set()),\r\n ),\r\n );\r\n });\r\n\r\n // One-time: when an initial (edit) scope arrives AFTER options, expand the\r\n // path to its selected grants so the user sees what's re-selected.\r\n let prefillExpanded = false;\r\n effect(() => {\r\n const grants = this.scope().grants;\r\n const model = this.treeModel();\r\n if (prefillExpanded || !grants.length || !model.length) {\r\n return;\r\n }\r\n prefillExpanded = true;\r\n untracked(() =>\r\n this.expandedKeys.update((prev) =>\r\n this.collectExpansion(model, this.selectedKeys(), prev),\r\n ),\r\n );\r\n });\r\n\r\n // Debounced scope preview.\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n this.destroyRef.onDestroy(() => {\r\n if (timer) clearTimeout(timer);\r\n });\r\n effect(() => {\r\n const s = this.scope();\r\n const delegator = this.delegatorUserId();\r\n const asAdmin = this.adminMode();\r\n untracked(() => {\r\n if (!s.grants.length) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n this.facade.clearScopePreview();\r\n return;\r\n }\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(() => {\r\n timer = null;\r\n return this.facade.previewScope(s, {\r\n delegatorUserId: delegator,\r\n asAdmin,\r\n });\r\n }, 300);\r\n });\r\n });\r\n\r\n // Initialize selected accessibilities once from the bound scope (edit).\r\n let accessibilityInitialized = false;\r\n effect(() => {\r\n const grants = this.scope().grants;\r\n if (accessibilityInitialized || !grants.length) {\r\n return;\r\n }\r\n accessibilityInitialized = true;\r\n const keys = new Set<string>();\r\n for (const grant of grants) {\r\n for (const fact of grant.accessibilities ?? []) {\r\n const key =\r\n typeof fact['accessibilityKey'] === 'string'\r\n ? (fact['accessibilityKey'] as string)\r\n : typeof fact.key === 'string'\r\n ? fact.key\r\n : null;\r\n if (key) keys.add(key);\r\n }\r\n }\r\n if (keys.size) {\r\n untracked(() => this.selectedAccessibilityKeys.set(keys));\r\n }\r\n });\r\n }\r\n\r\n // --- Expansion ------------------------------------------------------------\r\n protected isExpanded(node: DelegationScopeTreeNode): boolean {\r\n return this.searchTerm().trim() ? true : this.expandedKeys().has(node.key);\r\n }\r\n\r\n protected toggleExpand(node: DelegationScopeTreeNode): void {\r\n if (!node.children?.length) {\r\n return;\r\n }\r\n this.expandedKeys.update((set) => {\r\n const next = new Set(set);\r\n if (next.has(node.key)) {\r\n next.delete(node.key);\r\n } else {\r\n next.add(node.key);\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n protected hasChildren(node: DelegationScopeTreeNode): boolean {\r\n return !!node.children?.length;\r\n }\r\n\r\n // --- Selection ------------------------------------------------------------\r\n protected nodeState(node: DelegationScopeTreeNode): NodeCheckState {\r\n const opKeys = this.opKeyMap().get(node.key) ?? [];\r\n if (!opKeys.length) {\r\n return 'unchecked';\r\n }\r\n const selected = this.selectedKeys();\r\n let count = 0;\r\n for (const key of opKeys) {\r\n if (selected.has(key)) count++;\r\n }\r\n if (count === 0) return 'unchecked';\r\n return count === opKeys.length ? 'checked' : 'indeterminate';\r\n }\r\n\r\n protected onRowClick(node: DelegationScopeTreeNode): void {\r\n if (this.hasChildren(node)) {\r\n this.toggleExpand(node);\r\n } else {\r\n this.toggle(node);\r\n }\r\n }\r\n\r\n protected toggle(node: DelegationScopeTreeNode): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n const opKeys = this.opKeyMap().get(node.key) ?? [];\r\n if (!opKeys.length) {\r\n return;\r\n }\r\n const next = new Set(this.selectedKeys());\r\n const allSelected = opKeys.every((key) => next.has(key));\r\n for (const key of opKeys) {\r\n if (allSelected) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n }\r\n this.applySelection(next);\r\n }\r\n\r\n private applySelection(selected: Set<string>): void {\r\n const index = this.grantIndex();\r\n const facts = this.accessibilityFacts();\r\n const grants = Array.from(selected)\r\n .map((key) => index.get(key))\r\n .filter((grant): grant is DelegationGrant => !!grant)\r\n .map((grant) =>\r\n facts.length ? { ...grant, accessibilities: facts } : grant,\r\n );\r\n this.scope.update((scope) => ({ ...scope, grants }));\r\n }\r\n\r\n protected clearSelection(): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n this.scope.update((scope) => ({ ...scope, grants: [] }));\r\n }\r\n\r\n /** Master \"select all\" toggle in the tree header. */\r\n protected toggleAll(): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n if (this.selectAllState() === 'checked') {\r\n this.clearSelection();\r\n } else {\r\n this.applySelection(new Set(this.allLeafKeys()));\r\n }\r\n }\r\n\r\n protected trackVisible(\r\n _index: number,\r\n item: { node: DelegationScopeTreeNode },\r\n ): string {\r\n return item.node.key;\r\n }\r\n\r\n /**\r\n * Template keys (open by default) plus the ancestor keys of every selected\r\n * operation, so an edit's saved selection is expanded into view. Only valid\r\n * grants (those matching an option node) contribute — invalid saved grants\r\n * have no node and are simply ignored.\r\n */\r\n private collectExpansion(\r\n model: DelegationScopeTreeNode[],\r\n selected: Set<string>,\r\n base: Set<string>,\r\n ): Set<string> {\r\n const keys = new Set(base);\r\n const walk = (\r\n nodes: DelegationScopeTreeNode[],\r\n ancestors: string[],\r\n ): void => {\r\n for (const node of nodes) {\r\n if (node.kind === 'template') {\r\n keys.add(node.key);\r\n }\r\n if (node.kind === 'operation' && selected.has(node.key)) {\r\n for (const ancestor of ancestors) {\r\n keys.add(ancestor);\r\n }\r\n }\r\n if (node.children?.length) {\r\n walk(node.children, [...ancestors, node.key]);\r\n }\r\n }\r\n };\r\n model.forEach((node) => walk([node], []));\r\n return keys;\r\n }\r\n\r\n // --- App accessibility ----------------------------------------------------\r\n protected toggleAccessibility(key: string): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n this.selectedAccessibilityKeys.update((set) => {\r\n const next = new Set(set);\r\n if (next.has(key)) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n return next;\r\n });\r\n // Re-apply current selection so grants carry the new accessibility facts.\r\n this.applySelection(new Set(this.selectedKeys()));\r\n }\r\n\r\n protected isAccessibilitySelected(key: string): boolean {\r\n return this.selectedAccessibilityKeys().has(key);\r\n }\r\n\r\n private accessibilityFacts(): DelegationScopeFact[] {\r\n const selected = this.selectedAccessibilityKeys();\r\n if (!selected.size) {\r\n return [];\r\n }\r\n return this.appAccessibilities()\r\n .filter((item) => selected.has(item.accessibilityKey))\r\n .map((item) => ({\r\n key: item.accessibilityKey,\r\n accessibilityKey: item.accessibilityKey,\r\n name: item.name ?? null,\r\n displayName: item.name ?? null,\r\n }));\r\n }\r\n\r\n // --- Labels / preview -----------------------------------------------------\r\n protected nodeLabel(node: DelegationScopeTreeNode): string {\r\n return (\r\n formatDelegationDisplayValue(\r\n node.displayName ?? undefined,\r\n this.currentLanguage(),\r\n ) || humanizeDelegationKey(node.fallbackKey)\r\n );\r\n }\r\n\r\n protected accessibilityLabel(item: DelegationAppAccessibility): string {\r\n return (\r\n formatDelegationDisplayValue(\r\n item.name ?? undefined,\r\n this.currentLanguage(),\r\n ) || humanizeDelegationKey(item.accessibilityKey)\r\n );\r\n }\r\n\r\n protected getPreviewSummary(\r\n summary: DelegationDisplayValue | undefined,\r\n ): string {\r\n return formatDelegationScopeSummary(summary, this.currentLanguage());\r\n }\r\n\r\n protected formatDeniedOperation(value?: string | null): string {\r\n return humanizeDelegationKey(value);\r\n }\r\n\r\n protected formatDeniedTarget(value?: string | null): string {\r\n return humanizeDelegationKey(value);\r\n }\r\n\r\n protected trackNode(_index: number, node: DelegationScopeTreeNode): string {\r\n return node.key;\r\n }\r\n\r\n private currentLanguage(): string {\r\n return this.activeLang() ?? this.transloco.getActiveLang();\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <!-- Reusable tri-state checkbox box -->\r\n <ng-template #checkbox let-state=\"state\">\r\n <span\r\n class=\"flex size-[18px] shrink-0 items-center justify-center rounded-[5px] border transition-colors\"\r\n [class.border-primary-500]=\"state !== 'unchecked'\"\r\n [class.bg-primary-500]=\"state !== 'unchecked'\"\r\n [class.text-white]=\"state !== 'unchecked'\"\r\n [class.border-surface-300]=\"state === 'unchecked'\"\r\n [class.bg-surface-0]=\"state === 'unchecked'\"\r\n >\r\n @if (state === \"checked\") {\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n class=\"size-3\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n } @else if (state === \"indeterminate\") {\r\n <span class=\"h-[2px] w-2.5 rounded-full bg-white\"></span>\r\n }\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n @if (isLoadingOptions()) {\r\n <mt-card [paddingless]=\"true\">\r\n <div class=\"flex flex-col gap-3 p-4\">\r\n <p-skeleton height=\"2.5rem\"></p-skeleton>\r\n @for (item of [0, 1, 2, 3, 4, 5]; track $index) {\r\n <p-skeleton height=\"2rem\"></p-skeleton>\r\n }\r\n </div>\r\n </mt-card>\r\n } @else {\r\n @if (errorOptions(); as errorMessage) {\r\n <div\r\n class=\"rounded-2xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n }\r\n\r\n @if (!hasOptions() && !errorOptions()) {\r\n <mt-card [paddingless]=\"true\">\r\n <div\r\n class=\"flex min-h-72 flex-col items-center justify-center gap-4 px-6 py-8 text-center\"\r\n >\r\n <div\r\n class=\"flex size-16 items-center justify-center rounded-3xl bg-surface-50 text-primary\"\r\n >\r\n <svg\r\n viewBox=\"0 0 64 64\"\r\n class=\"size-9\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect\r\n x=\"10\"\r\n y=\"12\"\r\n width=\"44\"\r\n height=\"38\"\r\n rx=\"12\"\r\n class=\"fill-primary/10 stroke-primary/35\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M21 27H43\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M21 35H37\"\r\n class=\"stroke-primary/70\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"space-y-1\">\r\n <p class=\"text-base font-medium text-surface-900\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </p>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ t(\"delegations.scope.noGrantableOptions\") }}\r\n </p>\r\n </div>\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n @if (hasOptions()) {\r\n <mt-card [paddingless]=\"true\" class=\"overflow-hidden\">\r\n <!-- Inner view switch: Permissions / Pages & accessibility -->\r\n @if (hasAccessibility()) {\r\n <div class=\"border-b border-surface px-3 pt-2.5 pb-0\">\r\n <mt-tabs\r\n mode=\"underline\"\r\n [(active)]=\"activeScopeTab\"\r\n [options]=\"[\r\n {\r\n value: 'permissions',\r\n label: t('delegations.scope.permissionsTab'),\r\n badge: selectedCount() || null,\r\n },\r\n {\r\n value: 'accessibility',\r\n label: t('delegations.scope.accessibilityTitle'),\r\n badge: selectedAccessibilityCount() || null,\r\n },\r\n ]\"\r\n fluid\r\n ></mt-tabs>\r\n </div>\r\n }\r\n\r\n @if (activeScopeTab() === \"permissions\" || !hasAccessibility()) {\r\n <!-- Toolbar: table-style search + clear -->\r\n <div\r\n class=\"flex items-center gap-2 border-b border-surface px-3 py-2\"\r\n >\r\n <div class=\"min-w-0 flex-1\">\r\n <mt-text-field\r\n [ngModel]=\"searchTerm()\"\r\n (ngModelChange)=\"searchTerm.set($event)\"\r\n icon=\"general.search-lg\"\r\n [placeholder]=\"t('delegations.scope.searchPlaceholder')\"\r\n ></mt-text-field>\r\n </div>\r\n @if (selectedCount() > 0) {\r\n <span class=\"shrink-0 text-xs font-medium text-surface-500\">\r\n {{ selectedCount() }} {{ t(\"delegations.scope.selected\") }}\r\n </span>\r\n <mt-button\r\n variant=\"text\"\r\n size=\"small\"\r\n [label]=\"t('delegations.scope.clear')\"\r\n [disabled]=\"readonly()\"\r\n (click)=\"clearSelection()\"\r\n ></mt-button>\r\n }\r\n </div>\r\n\r\n <!-- Select-all header -->\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-2 border-b border-surface px-3 py-2 text-start hover:bg-surface-50\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"\r\n selectAllState() === 'indeterminate'\r\n ? 'mixed'\r\n : selectAllState() === 'checked'\r\n \"\r\n [disabled]=\"readonly()\"\r\n (click)=\"toggleAll()\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n checkbox;\r\n context: { state: selectAllState() }\r\n \"\r\n ></ng-container>\r\n <span\r\n class=\"text-xs font-semibold uppercase tracking-wide text-surface-500\"\r\n >\r\n {{ t(\"delegations.scope.selectAll\") }}\r\n </span>\r\n </button>\r\n\r\n <!-- Virtualized permission tree -->\r\n @if (visibleNodes().length > 0) {\r\n <cdk-virtual-scroll-viewport\r\n itemSize=\"40\"\r\n class=\"block h-[20rem]\"\r\n >\r\n <div\r\n *cdkVirtualFor=\"\r\n let item of visibleNodes();\r\n trackBy: trackVisible\r\n \"\r\n class=\"group flex h-10 items-center gap-2 pe-2 transition-colors hover:bg-surface-50\"\r\n [style.padding-inline-start.rem]=\"0.5 + item.depth * 1.25\"\r\n >\r\n @if (hasChildren(item.node)) {\r\n <button\r\n type=\"button\"\r\n class=\"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md text-surface-400 hover:bg-surface-100 hover:text-surface-600\"\r\n [attr.aria-expanded]=\"isExpanded(item.node)\"\r\n [attr.aria-label]=\"nodeLabel(item.node)\"\r\n (click)=\"\r\n toggleExpand(item.node); $event.stopPropagation()\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n isExpanded(item.node)\r\n ? 'arrow.chevron-down'\r\n : 'arrow.chevron-right'\r\n \"\r\n styleClass=\"text-base\"\r\n ></mt-icon>\r\n </button>\r\n } @else {\r\n <span class=\"size-6 shrink-0\"></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"\r\n nodeState(item.node) === 'indeterminate'\r\n ? 'mixed'\r\n : nodeState(item.node) === 'checked'\r\n \"\r\n [attr.aria-label]=\"nodeLabel(item.node)\"\r\n class=\"shrink-0\"\r\n [class.cursor-pointer]=\"!readonly()\"\r\n [disabled]=\"readonly()\"\r\n (click)=\"toggle(item.node); $event.stopPropagation()\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n checkbox;\r\n context: { state: nodeState(item.node) }\r\n \"\r\n ></ng-container>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2 text-start\"\r\n (click)=\"onRowClick(item.node)\"\r\n >\r\n <span\r\n class=\"truncate text-sm\"\r\n [class.font-semibold]=\"item.node.kind === 'template'\"\r\n [class.text-surface-900]=\"item.node.kind === 'template'\"\r\n [class.font-medium]=\"\r\n item.node.kind === 'level' ||\r\n item.node.kind === 'module'\r\n \"\r\n [class.text-surface-800]=\"\r\n item.node.kind === 'level' ||\r\n item.node.kind === 'module'\r\n \"\r\n [class.text-surface-600]=\"item.node.kind === 'operation'\"\r\n >\r\n {{ nodeLabel(item.node) }}\r\n </span>\r\n @if (\r\n item.node.kind === \"operation\" && item.node.isHighRisk\r\n ) {\r\n <span\r\n class=\"shrink-0 rounded-full bg-amber-100 px-2 py-0.5 text-[0.625rem] font-medium text-amber-700\"\r\n >\r\n {{ t(\"delegations.scope.highRisk\") }}\r\n </span>\r\n }\r\n </button>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <p class=\"px-3 py-8 text-center text-sm text-surface-500\">\r\n {{ t(\"components.table.no-data-found\") }}\r\n </p>\r\n }\r\n } @else {\r\n <!-- App accessibility -->\r\n <div class=\"flex flex-col gap-3 p-4\">\r\n <p class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.scope.accessibilityHint\") }}\r\n </p>\r\n <div class=\"flex flex-wrap gap-2\">\r\n @for (\r\n item of appAccessibilities();\r\n track item.accessibilityKey\r\n ) {\r\n @let selected =\r\n isAccessibilitySelected(item.accessibilityKey);\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex cursor-pointer items-center gap-1.5 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors\"\r\n [class.border-primary-400]=\"selected\"\r\n [class.bg-primary-50]=\"selected\"\r\n [class.text-primary-700]=\"selected\"\r\n [class.border-surface-200]=\"!selected\"\r\n [class.text-surface-600]=\"!selected\"\r\n [class.hover:border-primary-300]=\"!readonly()\"\r\n [disabled]=\"readonly()\"\r\n [attr.aria-pressed]=\"selected\"\r\n (click)=\"toggleAccessibility(item.accessibilityKey)\"\r\n >\r\n <span\r\n class=\"inline-flex size-1.5 rounded-full\"\r\n [class.bg-primary-500]=\"selected\"\r\n [class.bg-surface-300]=\"!selected\"\r\n ></span>\r\n {{ accessibilityLabel(item) }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Compact live scope preview -->\r\n <div\r\n class=\"flex flex-col gap-1.5 rounded-lg border border-surface bg-surface-50 px-3 py-2\"\r\n >\r\n <div class=\"flex items-center gap-2 text-xs\">\r\n <span class=\"shrink-0 font-semibold text-surface-700\">\r\n {{ t(\"delegations.scope.previewTitle\") }}:\r\n </span>\r\n @if (isPreviewing()) {\r\n <p-skeleton width=\"8rem\" height=\"0.7rem\"></p-skeleton>\r\n } @else if (preview(); as p) {\r\n @if (p.isValid) {\r\n <span class=\"min-w-0 flex-1 truncate text-surface-900\">\r\n {{\r\n getPreviewSummary(p.summary) ||\r\n t(\"delegations.column.scopeSummary\")\r\n }}\r\n </span>\r\n } @else {\r\n <span class=\"font-medium text-red-700\">\r\n {{ t(\"delegations.scope.previewInvalid\") }}\r\n </span>\r\n }\r\n } @else {\r\n <span class=\"text-surface-500\">\r\n {{ t(\"delegations.scope.noSelection\") }}\r\n </span>\r\n }\r\n </div>\r\n @if (preview(); as p) {\r\n @if (p.warnings.length > 0) {\r\n <ul\r\n class=\"list-inside list-disc space-y-0.5 text-xs text-amber-700\"\r\n >\r\n @for (w of p.warnings; track $index) {\r\n <li>{{ w.message }}</li>\r\n }\r\n </ul>\r\n }\r\n @if (p.deniedItems.length > 0) {\r\n <ul class=\"list-inside list-disc space-y-0.5 text-xs text-red-700\">\r\n @for (d of p.deniedItems; track $index) {\r\n <li>\r\n {{ formatDeniedTarget(d.targetKey) }} /\r\n {{ formatDeniedOperation(d.operationKey) }} -\r\n {{ d.reasonCode }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport {\r\n DateFieldConfig,\r\n DynamicFormConfig,\r\n MultiSelectFieldConfig,\n RadioButtonFieldConfig,\n REQUEST_CONTEXT,\n TextareaFieldConfig,\n ToggleFieldConfig,\r\n UserSearchFieldConfig,\r\n ValidatorConfig,\r\n} from '@masterteam/components';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { ScopePicker } from './scope-picker/scope-picker';\r\nimport {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n CreateDelegationV2Request,\r\n DelegationRow,\r\n DelegationScopeSelection,\r\n UpdateDelegationV2Request,\r\n} from '../../../store/delegations/delegations.model';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { delegationScopeFingerprint } from '../../../store/delegations/scope-fingerprint';\n\r\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\r\n\r\ninterface DelegationFormUserValue {\r\n id: string;\r\n userId: string;\r\n displayName: string;\r\n userName: string;\r\n email?: string | null;\r\n photo?: string | null;\r\n isExternal: boolean;\r\n}\r\n\r\nfunction getCurrentDelegatorFromLocalStorage(): DelegationFormUserValue | null {\r\n if (typeof localStorage === 'undefined') {\r\n return null;\r\n }\r\n\r\n try {\r\n const raw = localStorage.getItem('auth');\r\n if (!raw) return null;\r\n\r\n const parsed = JSON.parse(raw) as Record<string, unknown> | null;\r\n if (!parsed || typeof parsed !== 'object') return null;\r\n\r\n const state =\r\n ((parsed['state'] as Record<string, unknown> | undefined) ?? parsed) ||\r\n null;\r\n const userWrapper = state?.['user'] as Record<string, unknown> | undefined;\r\n const user =\r\n (userWrapper?.['user'] as Record<string, unknown> | undefined) ??\r\n userWrapper;\r\n\r\n if (!user || typeof user !== 'object') return null;\r\n\r\n const id =\r\n (user['id'] as string | undefined) ??\r\n (user['userId'] as string | undefined);\r\n if (!id) return null;\r\n\r\n const photo = user['photo'];\r\n const photoPath =\r\n typeof photo === 'string'\r\n ? photo\r\n : ((photo as { fileName?: string } | undefined)?.fileName ?? null);\r\n\r\n return {\r\n id,\r\n userId: id,\r\n displayName:\r\n (user['displayName'] as string | undefined) ??\r\n (user['name'] as string | undefined) ??\r\n (user['userName'] as string | undefined) ??\r\n '',\r\n userName: (user['userName'] as string | undefined) ?? '',\r\n email: (user['email'] as string | undefined) ?? null,\r\n photo: photoPath,\r\n isExternal: !!user['isExternal'],\r\n };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Backend requires ISO 8601 **UTC** timestamps ending with `Z`\r\n * (Masterteam.Shared `ISO8601DateTimeConverter`). The date field can emit a\r\n * `Date` or an offset string like `2026-06-01T13:47:00+00:00`; normalize both\r\n * to the same instant rendered with `Z` (otherwise the command fails to bind →\r\n * \"command field is required\").\r\n */\r\nfunction toUtcIso(value: unknown): string | undefined {\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? undefined : value.toISOString();\r\n }\r\n if (typeof value === 'string' && value.trim()) {\r\n const parsed = new Date(value);\r\n return Number.isNaN(parsed.getTime()) ? value : parsed.toISOString();\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractUserId(value: unknown): string | undefined {\r\n if (typeof value === 'string') {\r\n return value.trim() || undefined;\r\n }\r\n\r\n if (!value || typeof value !== 'object') {\r\n return undefined;\r\n }\r\n\r\n const record = value as Record<string, unknown>;\r\n for (const key of ['userId', 'id']) {\r\n const candidate = record[key];\r\n if (typeof candidate === 'string' && candidate.trim()) {\r\n return candidate.trim();\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Delegation create/edit form (doc 04). Uses the v2 explicit-scope endpoints so\r\n * the persisted `DelegationScopeSelection` matches what scope/preview validated.\r\n *\r\n * - Delegator is server-derived; only the delegated user is collected.\r\n * - On edit, scope grants + rowVersion come from the loaded detail.\r\n * - Times are sent as UTC instants; Identity resolves the trusted user timezone.\n */\r\n@Component({\r\n selector: 'mt-delegation-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Button,\r\n DynamicForm,\r\n ReactiveFormsModule,\r\n ScopePicker,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './delegation-form.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationForm implements OnInit {\r\n readonly delegationForEdit = input<DelegationRow | null>(null);\r\n readonly readonly = input<boolean>(false);\r\n /**\r\n * Admin-managed mode: also collect the Delegator / From user, so an admin can\r\n * create a delegation between two selected users (Ahmed → Sara). Self-service\r\n * leaves this false; the delegator defaults to the current user server-side.\r\n */\r\n readonly adminMode = input<boolean>(false);\r\n\r\n private readonly halfWidth = 'flex flex-col gap-1 lg:col-span-6';\r\n private readonly fullWidth = 'flex flex-col gap-1 lg:col-span-12';\r\n\r\n modal = inject(ModalService);\r\n ref: ModalRef = inject(ModalRef);\r\n private readonly transloco = inject(TranslocoService);\n private readonly facade = inject(DelegationsFacade);\n\r\n delegationFormControl = new FormControl();\r\n formValue = toSignal(this.delegationFormControl.valueChanges);\r\n\r\n detail = this.facade.detail;\r\n isDetailLoading = this.facade.isLoadingDetail;\r\n scopePreview = this.facade.scopePreview;\r\n isPreviewingScope = this.facade.isPreviewingScope;\r\n isSaving = this.facade.isSaving;\r\n\r\n context = new HttpContext().set(REQUEST_CONTEXT, { useBaseUrl: false });\r\n\r\n protected readonly scope = signal<DelegationScopeSelection>(EMPTY_SCOPE);\r\n protected readonly currentDelegator = signal<DelegationFormUserValue | null>(\r\n getCurrentDelegatorFromLocalStorage(),\r\n );\r\n\r\n /** Floor for both date pickers — captured once so it doesn't drift on recompute. */\r\n protected readonly now = signal(new Date());\r\n\r\n /** Currently-chosen start date, used to floor the end-date picker. */\r\n protected readonly selectedStartDate = computed<Date | undefined>(() => {\r\n const value = this.formValue()?.delegateFromDateTime;\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? undefined : value;\r\n }\r\n if (typeof value === 'string' && value.trim()) {\r\n const parsed = new Date(value);\r\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\r\n }\r\n return undefined;\r\n });\r\n\r\n /** Selected delegator id drives scope/options loading and the admin payload. */\r\n protected readonly selectedDelegatorId = computed<string | undefined>(() => {\r\n if (this.adminMode()) {\r\n return extractUserId(this.formValue()?.delegateFrom);\r\n }\r\n return this.currentDelegator()?.id;\r\n });\r\n\r\n /** Admin mode waits for a chosen delegator; self-service always has one. */\r\n protected readonly showScopePicker = computed(\r\n () => !this.adminMode() || !!this.selectedDelegatorId(),\r\n );\r\n\r\n protected readonly specificDaysOptions = signal([\r\n { label: this.transloco.translate('delegations.days.sunday'), value: 0 },\r\n { label: this.transloco.translate('delegations.days.monday'), value: 1 },\r\n { label: this.transloco.translate('delegations.days.tuesday'), value: 2 },\r\n { label: this.transloco.translate('delegations.days.wednesday'), value: 3 },\r\n { label: this.transloco.translate('delegations.days.thursday'), value: 4 },\r\n { label: this.transloco.translate('delegations.days.friday'), value: 5 },\r\n { label: this.transloco.translate('delegations.days.saturday'), value: 6 },\r\n ]);\r\n\r\n protected readonly formConfig = computed<DynamicFormConfig>(() => ({\r\n sections: [\r\n {\r\n key: 'delegationForm',\r\n type: 'header',\r\n bodyClass: 'grid grid-cols-1 gap-4 items-start lg:grid-cols-12',\r\n order: 1,\r\n fields: [\r\n new UserSearchFieldConfig({\r\n key: 'delegateFrom',\r\n label: this.transloco.translate('delegations.column.delegatorName'),\r\n apiUrl: 'Identity/users',\r\n context: this.context,\r\n validators: [ValidatorConfig.required()],\r\n cssClass: this.halfWidth,\r\n colSpan: 6,\r\n order: 0,\r\n disabled:\r\n this.readonly() ||\r\n !this.adminMode() ||\r\n !!this.delegationForEdit(),\r\n }),\r\n new UserSearchFieldConfig({\r\n key: 'delegateTo',\r\n label: this.transloco.translate('delegations.column.delegatedTo'),\r\n apiUrl: this.adminMode()\r\n ? `Identity/delegations/Admin/delegate-candidates?delegatorUserId=${encodeURIComponent(this.selectedDelegatorId() ?? '')}`\r\n : 'Identity/delegations/delegate-candidates',\r\n dataKey: 'data.items',\r\n paramName: 'search',\r\n minLength: 2,\r\n context: this.context,\r\n validators: [ValidatorConfig.required()],\r\n cssClass: this.halfWidth,\r\n colSpan: 6,\r\n order: 1,\r\n disabled: this.readonly(),\r\n } as ConstructorParameters<typeof UserSearchFieldConfig>[0]),\r\n new TextareaFieldConfig({\r\n key: 'description',\r\n label: this.transloco.translate('delegations.form.description'),\r\n placeholder: this.transloco.translate(\r\n 'delegations.form.description',\r\n ),\r\n cssClass: this.fullWidth,\r\n colSpan: 12,\r\n order: 2,\r\n disabled: this.readonly(),\r\n }),\r\n new DateFieldConfig({\r\n key: 'delegateFromDateTime',\r\n label: this.transloco.translate('delegations.column.startDate'),\r\n placeholder: this.transloco.translate(\r\n 'delegations.column.startDate',\r\n ),\r\n validators: [ValidatorConfig.required()],\r\n showTime: true,\r\n minDate: this.now(),\r\n cssClass: this.halfWidth,\r\n colSpan: 6,\r\n order: 3,\r\n disabled: this.readonly(),\r\n }),\r\n new DateFieldConfig({\r\n key: 'delegateToDateTime',\r\n label: this.transloco.translate('delegations.column.endDate'),\r\n placeholder: this.transloco.translate('delegations.column.endDate'),\r\n validators: [ValidatorConfig.required()],\r\n showTime: true,\r\n // End can't precede the chosen start; fall back to now until a start\r\n // is picked. Both floors keep past dates non-selectable.\r\n minDate: this.selectedStartDate() ?? this.now(),\r\n cssClass: this.halfWidth,\r\n colSpan: 6,\r\n order: 4,\r\n disabled: this.readonly(),\r\n }),\r\n new RadioButtonFieldConfig({\r\n key: 'delegationDaysType',\r\n label: this.transloco.translate('delegations.form.daysApply'),\r\n options: [\r\n {\r\n label: this.transloco.translate('delegations.form.fullRange'),\r\n value: 'FullRange',\r\n },\r\n {\r\n label: this.transloco.translate(\r\n 'delegations.form.specificDays',\r\n ),\r\n value: 'SpecificDays',\r\n },\r\n ],\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n validators: [ValidatorConfig.required()],\r\n cssClass: this.fullWidth,\r\n colSpan: 12,\r\n order: 5,\r\n disabled: this.readonly(),\r\n }),\r\n new MultiSelectFieldConfig({\r\n key: 'specificDays',\r\n label: this.transloco.translate('delegations.form.specificDays'),\r\n options: this.specificDaysOptions(),\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n maxSelectedLabels: 7,\r\n relations: [\r\n {\r\n key: 'delegationDaysType',\r\n value: 'SpecificDays',\r\n action: 'show',\r\n },\r\n ],\r\n cssClass: this.fullWidth,\r\n colSpan: 12,\r\n order: 6,\r\n disabled: this.readonly(),\r\n }),\r\n new ToggleFieldConfig({\n key: 'requiresApproval',\r\n label: this.transloco.translate(\r\n 'delegations.form.requiresApproval',\r\n ),\r\n cssClass: `${this.fullWidth} mt-2`,\r\n order: 7,\n disabled: this.readonly(),\r\n }),\r\n ],\r\n },\r\n ],\r\n }));\r\n\r\n // Prefill (edit) and default-init (create) must each happen exactly once, so\r\n // later signal changes (detail re-emits, field edits) never wipe the user's\r\n // in-progress scope selection or field values.\r\n private editPrefilled = false;\r\n private createInitialized = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const editing = this.delegationForEdit();\r\n const d = this.detail();\r\n untracked(() => {\r\n if (editing && d && d.row.delegationId === editing.delegationId) {\r\n if (this.editPrefilled) return;\r\n this.editPrefilled = true;\r\n this.delegationFormControl.patchValue({\r\n delegateFrom: this.mapPartyToUserValue(d.row.delegator),\r\n delegateTo: d.row.delegatedUser,\r\n description: d.description ?? '',\r\n delegateFromDateTime: d.row.startsAtUtc,\r\n delegateToDateTime: d.row.endsAtUtc,\r\n delegationDaysType: d.row.dayRuleMode,\r\n specificDays: d.row.specificDays ?? [],\r\n requiresApproval: d.row.approval?.requiresApproval ?? false,\n });\r\n this.scope.set({\r\n grants: d.scope?.grants ?? [],\r\n metadata: d.scope?.metadata ?? {},\r\n });\r\n } else if (!editing) {\r\n if (this.createInitialized) return;\r\n this.createInitialized = true;\r\n this.delegationFormControl.reset({\r\n delegateFrom: null,\r\n delegationDaysType: 'FullRange',\r\n specificDays: [],\r\n requiresApproval: true,\n });\r\n this.scope.set(EMPTY_SCOPE);\r\n }\r\n });\r\n });\r\n\r\n effect(() => {\r\n const currentDelegator = this.currentDelegator();\r\n if (this.adminMode() || this.delegationForEdit() || !currentDelegator) {\r\n return;\r\n }\r\n\r\n const existingDelegator = extractUserId(\r\n this.delegationFormControl.getRawValue()?.delegateFrom,\r\n );\r\n if (existingDelegator === currentDelegator.id) {\r\n return;\r\n }\r\n\r\n this.delegationFormControl.patchValue({\r\n delegateFrom: currentDelegator,\r\n });\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n const editing = this.delegationForEdit();\r\n if (editing) {\r\n this.facade.getDetail(editing.delegationId, this.adminMode());\r\n }\r\n }\r\n\r\n protected readonly canSubmit = computed(() => {\r\n const value = this.formValue();\r\n const start = Date.parse(toUtcIso(value?.delegateFromDateTime) ?? '');\r\n const end = Date.parse(toUtcIso(value?.delegateToDateTime) ?? '');\r\n const specificDaysValid =\r\n value?.delegationDaysType !== 'SpecificDays' ||\r\n (Array.isArray(value?.specificDays) && value.specificDays.length > 0);\r\n const usersDiffer =\r\n extractUserId(value?.delegateFrom) !== extractUserId(value?.delegateTo);\r\n const currentScope = this.scope();\r\n return (\r\n !this.readonly() &&\r\n Number.isFinite(start) &&\r\n Number.isFinite(end) &&\r\n start < end &&\r\n end > Date.now() &&\r\n specificDaysValid &&\r\n usersDiffer &&\r\n currentScope.grants.length > 0 &&\r\n !!this.scopePreview()?.isValid &&\r\n this.facade.scopePreviewFingerprint() ===\r\n delegationScopeFingerprint(currentScope) &&\r\n !this.isPreviewingScope()\r\n );\r\n });\r\n\r\n onSubmit(): void {\r\n if (this.readonly() || !this.delegationFormControl.valid) return;\r\n if (!this.canSubmit()) return;\r\n\r\n const value = this.delegationFormControl.getRawValue();\r\n const scope = this.scope();\r\n const delegationDaysType = (value?.delegationDaysType ?? 'FullRange') as\r\n | 'FullRange'\r\n | 'SpecificDays';\r\n const specificDays =\r\n delegationDaysType === 'SpecificDays' ? (value?.specificDays ?? []) : [];\r\n const description = value?.description;\r\n const delegateFromDateTime = toUtcIso(value?.delegateFromDateTime) ?? '';\r\n const delegateToDateTime = toUtcIso(value?.delegateToDateTime) ?? '';\r\n const requiresApproval = !!value?.requiresApproval;\r\n const delegatedUserId = extractUserId(value?.delegateTo) ?? '';\r\n const selectedDelegatorId = this.selectedDelegatorId();\r\n\r\n const editing = this.delegationForEdit();\r\n if (this.adminMode()) {\r\n if (!selectedDelegatorId || !delegatedUserId) {\r\n return;\r\n }\r\n\r\n const base: AdminCreateDelegationV2Request = {\r\n delegatorUserId: selectedDelegatorId,\r\n delegatedUserId,\r\n description,\r\n delegateFromDateTime,\r\n delegateToDateTime,\r\n delegationDaysType,\r\n specificDays,\r\n requiresApproval,\n scope,\r\n };\r\n\r\n if (editing) {\r\n const latestRowVersion =\r\n this.detail()?.row?.rowVersion ?? editing.rowVersion;\r\n const req: AdminUpdateDelegationV2Request = {\r\n ...base,\r\n rowVersion: latestRowVersion,\r\n };\r\n this.facade.updateV2(editing.delegationId, req, true).subscribe({\r\n next: () => this.ref.close(true),\r\n });\r\n return;\r\n }\r\n\r\n this.facade.createV2(base, true).subscribe({\r\n next: () => this.ref.close(true),\r\n });\r\n return;\r\n }\r\n\r\n const base: CreateDelegationV2Request = {\r\n delegateFrom: null,\r\n delegateTo: delegatedUserId,\r\n description,\r\n delegateFromDateTime,\r\n delegateToDateTime,\r\n delegationDaysType,\r\n specificDays,\r\n requiresApproval,\n scope,\r\n };\r\n\r\n if (editing) {\r\n // Prefer the freshest rowVersion from the loaded detail (the form loads\r\n // detail on open); fall back to the list row only if detail is absent.\r\n const latestRowVersion =\r\n this.detail()?.row?.rowVersion ?? editing.rowVersion;\r\n const req: UpdateDelegationV2Request = {\r\n ...base,\r\n rowVersion: latestRowVersion,\r\n };\r\n this.facade.updateV2(editing.delegationId, req).subscribe({\r\n next: () => this.ref.close(true),\r\n });\r\n } else {\r\n const req: CreateDelegationV2Request = base;\r\n this.facade.createV2(req).subscribe({\r\n next: () => this.ref.close(true),\r\n });\r\n }\r\n }\r\n\r\n private mapPartyToUserValue(\r\n party: DelegationRow['delegator'],\r\n ): DelegationFormUserValue {\r\n return {\r\n id: party.userId,\r\n userId: party.userId,\r\n displayName: party.displayName,\r\n userName: party.email || party.displayName,\r\n email: party.email ?? null,\r\n photo: null,\r\n isExternal: false,\r\n };\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div\r\n [class]=\"\r\n 'flex h-full min-h-0 min-w-0 flex-col overflow-hidden ' +\r\n modal.contentClass\r\n \"\r\n >\r\n <div\r\n class=\"grid min-h-0 flex-1 gap-4 overflow-y-auto p-4 max-[640px]:p-3 lg:grid-cols-2 lg:items-start\"\r\n >\r\n <section\r\n class=\"flex flex-col gap-4 rounded-3xl border border-surface-200 bg-surface-0 p-4 shadow-xs lg:sticky lg:top-0\"\r\n >\r\n <mt-dynamic-form\r\n [formConfig]=\"formConfig()\"\r\n [formControl]=\"delegationFormControl\"\r\n />\r\n </section>\r\n\r\n <section class=\"flex min-h-0 flex-col gap-3\">\r\n <div class=\"flex flex-col gap-1\">\r\n <h3 class=\"text-xl font-semibold text-surface-900\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{\r\n adminMode() && !showScopePicker()\r\n ? t(\"delegations.form.selectDelegatorFirst\")\r\n : t(\"delegations.scope.permissionsSubtitle\")\r\n }}\r\n </p>\r\n </div>\r\n\r\n @if (showScopePicker()) {\r\n <mt-scope-picker\r\n [(scope)]=\"scope\"\r\n [readonly]=\"readonly()\"\r\n [adminMode]=\"adminMode()\"\r\n [delegatorUserId]=\"selectedDelegatorId()\"\r\n ></mt-scope-picker>\r\n } @else {\r\n <div\r\n class=\"flex min-h-72 flex-col items-center justify-center gap-4 rounded-3xl border border-dashed border-surface-300 bg-surface-50 px-6 py-8 text-center\"\r\n >\r\n <div\r\n class=\"flex size-18 items-center justify-center rounded-3xl bg-surface-0 text-primary shadow-sm\"\r\n >\r\n <svg\r\n viewBox=\"0 0 64 64\"\r\n class=\"size-10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect\r\n x=\"10\"\r\n y=\"12\"\r\n width=\"44\"\r\n height=\"40\"\r\n rx=\"12\"\r\n class=\"fill-primary/10 stroke-primary/35\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M22 28H42\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M22 36H34\"\r\n class=\"stroke-primary/70\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <circle\r\n cx=\"45\"\r\n cy=\"20\"\r\n r=\"7\"\r\n class=\"fill-surface-0 stroke-primary\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M45 17V23\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M42 20H48\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"space-y-1\">\r\n <p class=\"text-base font-medium text-surface-900\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </p>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ t(\"delegations.form.selectDelegatorFirst\") }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </section>\r\n </div>\r\n </div>\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('delegations.common.cancel')\"\r\n variant=\"outlined\"\r\n (click)=\"ref.close()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n />\r\n @if (!readonly()) {\r\n <mt-button\r\n [label]=\"\r\n delegationForEdit()\r\n ? t('delegations.common.update')\r\n : t('delegations.common.create')\r\n \"\r\n [loading]=\"isSaving()\"\r\n [disabled]=\"!delegationFormControl.valid || !canSubmit()\"\r\n (click)=\"onSubmit()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n />\r\n }\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\r\nimport type {\r\n DelegationDisplayValue,\r\n DelegationParty,\r\n DelegationScopeViewLevel,\r\n DelegationScopeViewModule,\r\n DelegationScopeViewOperation,\r\n DelegationScopeViewTemplate,\r\n} from '../../../store/delegations/delegations.model';\r\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\r\nimport {\r\n formatDelegationDisplayValue,\r\n humanizeDelegationKey,\r\n} from '../delegation-scope-display';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\ntype DetailTab = 'overview' | 'scope';\r\ntype ScopeViewNode =\r\n | {\r\n kind: 'template';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n depth: number;\r\n children: ScopeViewNode[];\r\n }\r\n | {\r\n kind: 'level';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n depth: number;\r\n children: ScopeViewNode[];\r\n }\r\n | {\r\n kind: 'module';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n depth: number;\r\n children: ScopeViewNode[];\r\n }\r\n | {\r\n kind: 'operation';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n isHighRisk: boolean;\r\n depth: number;\r\n };\r\n\r\n/**\r\n * Read-only drawer that shows `DelegationDetail` row/status plus saved scope\r\n * from `scopeView`. The persisted `scope.grants` shape is not parsed for\r\n * display; it remains a backend validation/persistence shape.\r\n */\r\n@Component({\r\n selector: 'mt-delegation-detail-drawer',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Button,\r\n EntityPreview,\r\n SkeletonModule,\r\n Tabs,\r\n TranslocoDirective,\r\n DelegationStatusChip,\r\n ],\r\n templateUrl: './delegation-detail-drawer.html',\r\n styleUrls: ['./delegation-detail-drawer.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationDetailDrawer implements OnInit {\r\n readonly delegationId = input.required<number>();\r\n readonly adminMode = input<boolean>(false);\r\n\r\n private readonly facade = inject(DelegationsFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly ref: ModalRef = inject(ModalRef);\r\n\r\n protected readonly activeTab = signal<DetailTab>('overview');\r\n protected readonly tabOptions = computed(() => [\r\n {\r\n value: 'overview' as DetailTab,\r\n label: this.transloco.translate('delegations.tabs.overview'),\r\n },\r\n {\r\n value: 'scope' as DetailTab,\r\n label: this.transloco.translate('delegations.column.scopeSummary'),\r\n },\r\n ]);\r\n\r\n private readonly weekdayKeys = [\r\n 'sunday',\r\n 'monday',\r\n 'tuesday',\r\n 'wednesday',\r\n 'thursday',\r\n 'friday',\r\n 'saturday',\r\n ] as const;\r\n\r\n protected readonly isLoading = this.facade.isLoadingDetail;\r\n protected readonly detail = this.facade.detail;\r\n protected readonly row = computed(() => this.detail()?.row ?? null);\r\n protected readonly scopeNodes = computed(() =>\r\n this.buildScopeViewTree(this.detail()?.scopeView?.templates),\r\n );\r\n protected readonly scopeVisibleNodes = computed(() =>\r\n this.flattenScopeNodes(this.scopeNodes()),\r\n );\r\n protected readonly selectedOperationCount = computed(\r\n () =>\r\n this.scopeVisibleNodes().filter((node) => node.kind === 'operation')\r\n .length,\r\n );\r\n\r\n ngOnInit(): void {\r\n this.facade.getDetail(this.delegationId(), this.adminMode());\r\n }\r\n\r\n protected formatSpecificDays(\r\n days: readonly number[] | null | undefined,\r\n ): string {\r\n if (!days?.length) {\r\n return this.transloco.translate('delegations.form.fullRange');\r\n }\r\n return days\r\n .filter((d) => d >= 0 && d < this.weekdayKeys.length)\r\n .map((d) =>\r\n this.transloco.translate(`delegations.days.${this.weekdayKeys[d]}`),\r\n )\r\n .join(', ');\r\n }\r\n\r\n protected approvalLabel(): string {\r\n const s = this.row()?.approval?.approvalStatus ?? 'NotRequired';\r\n return this.transloco.translate(`delegations.approvalStatus.${s}`);\r\n }\r\n\r\n protected userEntity(party: DelegationParty, label?: string) {\r\n return toDelegationUserEntity(party, { label });\r\n }\r\n\r\n protected hasChildren(node: ScopeViewNode): boolean {\r\n return 'children' in node && node.children.length > 0;\r\n }\r\n\r\n protected trackScopeNode(_index: number, node: ScopeViewNode): string {\r\n return node.key;\r\n }\r\n\r\n private buildScopeViewTree(\r\n templates: DelegationScopeViewTemplate[] | null | undefined,\r\n ): ScopeViewNode[] {\r\n return this.toArray(templates)\r\n .map((template) => this.toTemplateNode(template))\r\n .filter((node) => this.hasScopeChildren(node));\r\n }\r\n\r\n private flattenScopeNodes(nodes: ScopeViewNode[]): ScopeViewNode[] {\r\n const out: ScopeViewNode[] = [];\r\n const walk = (items: ScopeViewNode[]): void => {\r\n for (const node of items) {\r\n out.push(node);\r\n if ('children' in node) {\r\n walk(node.children);\r\n }\r\n }\r\n };\r\n walk(nodes);\r\n return out;\r\n }\r\n\r\n private toTemplateNode(template: DelegationScopeViewTemplate): ScopeViewNode {\r\n const key = `tpl:${template.groupKey}`;\r\n return {\r\n kind: 'template',\r\n key,\r\n label: this.displayLabel(template.name, template.groupKey),\r\n fallbackKey: template.groupKey,\r\n isAvailable: template.isAvailable !== false,\r\n depth: 0,\r\n children: this.toArray(template.levels).flatMap((level) =>\r\n this.toLevelNodes(level),\r\n ),\r\n };\r\n }\r\n\r\n private toLevelNodes(level: DelegationScopeViewLevel): ScopeViewNode[] {\r\n const operationNodes = this.toArray(level.operations)\r\n .filter((operation) => operation.selected !== false)\r\n .map((operation) => this.toOperationNode(operation, level.targetKey, 2));\r\n const moduleNodes = this.toArray(level.modules)\r\n .map((module) => this.toModuleNode(module))\r\n .filter((node) => this.hasScopeChildren(node));\r\n const children = [...operationNodes, ...moduleNodes];\r\n\r\n if (children.length === 0) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n kind: 'level',\r\n key: `lvl:${level.applicationKey}:${level.targetKey}`,\r\n label: this.displayLabel(level.name, level.targetKey),\r\n fallbackKey: level.targetKey,\r\n isAvailable: level.isAvailable !== false,\r\n depth: 1,\r\n children,\r\n },\r\n ];\r\n }\r\n\r\n private toModuleNode(module: DelegationScopeViewModule): ScopeViewNode {\r\n return {\r\n kind: 'module',\r\n key: `mod:${module.applicationKey}:${module.targetKey}`,\r\n label: this.displayLabel(module.name, module.targetKey),\r\n fallbackKey: module.targetKey,\r\n isAvailable: module.isAvailable !== false,\r\n depth: 2,\r\n children: this.toArray(module.operations)\r\n .filter((operation) => operation.selected !== false)\r\n .map((operation) =>\r\n this.toOperationNode(operation, module.targetKey, 3),\r\n ),\r\n };\r\n }\r\n\r\n private toOperationNode(\r\n operation: DelegationScopeViewOperation,\r\n parentKey: string,\r\n depth: number,\r\n ): ScopeViewNode {\r\n return {\r\n kind: 'operation',\r\n key: `op:${parentKey}:${operation.operationKey}`,\r\n label: this.displayLabel(\r\n operation.name ?? operation.displayName,\r\n operation.operationKey,\r\n ),\r\n fallbackKey: operation.operationKey,\r\n isAvailable: operation.isAvailable !== false,\r\n isHighRisk: operation.isHighRisk ?? false,\r\n depth,\r\n };\r\n }\r\n\r\n private displayLabel(\r\n value: DelegationDisplayValue | undefined,\r\n fallbackKey?: string | null,\r\n ): string {\r\n return (\r\n formatDelegationDisplayValue(value, this.transloco.getActiveLang()) ||\r\n humanizeDelegationKey(fallbackKey)\r\n );\r\n }\r\n\r\n private toArray<T>(value: T[] | null | undefined): T[] {\r\n return Array.isArray(value) ? value : [];\r\n }\r\n\r\n private hasScopeChildren(\r\n node: ScopeViewNode,\r\n ): node is Extract<ScopeViewNode, { children: ScopeViewNode[] }> {\r\n return 'children' in node && node.children.length > 0;\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col h-full\">\r\n <!-- Tabs -->\r\n <div class=\"border-b border-surface-200 px-4 pt-2\">\r\n <mt-tabs\r\n mode=\"underline\"\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n fluid\r\n ></mt-tabs>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (isLoading() && !detail()) {\r\n <p-skeleton height=\"2rem\" class=\"mb-3\"></p-skeleton>\r\n <p-skeleton height=\"6rem\" class=\"mb-3\"></p-skeleton>\r\n <p-skeleton height=\"6rem\"></p-skeleton>\r\n } @else if (detail(); as d) {\r\n @if (activeTab() === \"overview\") {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex items-center justify-between gap-3\">\r\n <div class=\"flex items-center gap-3 min-w-0\">\r\n <mt-entity-preview\r\n [data]=\"\r\n userEntity(\r\n d.row.delegator,\r\n t('delegations.column.delegatorName')\r\n )\r\n \"\r\n ></mt-entity-preview>\r\n </div>\r\n <mt-delegation-status-chip\r\n [status]=\"d.status.effectiveStatus\"\r\n [reasonCode]=\"d.status.reasonCode\"\r\n ></mt-delegation-status-chip>\r\n </div>\r\n\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col\">\r\n <mt-entity-preview\r\n [data]=\"\r\n userEntity(\r\n d.row.delegatedUser,\r\n t('delegations.column.delegatedTo')\r\n )\r\n \"\r\n ></mt-entity-preview>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.approval\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">{{\r\n approvalLabel()\r\n }}</span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.startDate\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">\r\n {{ d.row.startsAtUtc | date: \"medium\" }}\r\n </span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.endDate\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">\r\n {{ d.row.endsAtUtc | date: \"medium\" }}\r\n </span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.form.timeZone\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">{{\r\n d.row.timeZoneId\r\n }}</span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.days\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">\r\n @if (d.row.dayRuleMode === \"FullRange\") {\r\n {{ t(\"delegations.form.fullRange\") }}\r\n } @else {\r\n {{ formatSpecificDays(d.row.specificDays) }}\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n @if (d.row.cancellation?.cancellationReason) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3 text-sm text-surface-800\"\r\n >\r\n <div class=\"font-medium\">\r\n {{ t(\"delegations.form.cancellationReason\") }}\r\n </div>\r\n <div>{{ d.row.cancellation.cancellationReason }}</div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Scope tab -->\r\n <div\r\n class=\"flex flex-col overflow-hidden rounded-lg border border-surface\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between gap-2 border-b border-surface bg-surface-50 px-3 py-2\"\r\n >\r\n <span class=\"text-xs font-semibold uppercase text-surface-500\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </span>\r\n @if (selectedOperationCount() > 0) {\r\n <span class=\"text-xs font-medium text-surface-500\">\r\n {{ selectedOperationCount() }}\r\n {{ t(\"delegations.scope.selected\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (scopeVisibleNodes().length > 0) {\r\n <div class=\"flex max-h-[34rem] flex-col overflow-y-auto\">\r\n @for (\r\n node of scopeVisibleNodes();\r\n track trackScopeNode($index, node)\r\n ) {\r\n <div\r\n class=\"group flex min-h-10 items-center gap-2 pe-3 transition-colors hover:bg-surface-50\"\r\n [style.padding-inline-start.rem]=\"0.75 + node.depth * 1.25\"\r\n >\r\n @if (hasChildren(node)) {\r\n <span\r\n class=\"flex size-6 shrink-0 items-center justify-center rounded-md text-surface-400\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg\r\n viewBox=\"0 0 20 20\"\r\n class=\"size-4\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M5 7L10 12L15 7\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </span>\r\n } @else {\r\n <span class=\"size-6 shrink-0\"></span>\r\n }\r\n\r\n <span\r\n class=\"flex size-[18px] shrink-0 items-center justify-center rounded-[5px] border border-primary-500 bg-primary-500 text-white\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n class=\"size-3\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </span>\r\n\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-sm\"\r\n [class.font-semibold]=\"node.kind === 'template'\"\r\n [class.text-surface-900]=\"node.kind === 'template'\"\r\n [class.font-medium]=\"\r\n node.kind === 'level' || node.kind === 'module'\r\n \"\r\n [class.text-surface-800]=\"\r\n node.kind === 'level' || node.kind === 'module'\r\n \"\r\n [class.text-surface-600]=\"node.kind === 'operation'\"\r\n >\r\n {{ node.label }}\r\n </span>\r\n\r\n @if (node.kind === \"operation\" && node.isHighRisk) {\r\n <span\r\n class=\"shrink-0 rounded-full bg-amber-100 px-2 py-0.5 text-[0.625rem] font-medium text-amber-700\"\r\n >\r\n {{ t(\"delegations.scope.highRisk\") }}\r\n </span>\r\n }\r\n\r\n @if (!node.isAvailable) {\r\n <span\r\n class=\"shrink-0 rounded-full bg-surface-100 px-2 py-0.5 text-[0.625rem] font-medium text-surface-500\"\r\n >\r\n {{ t(\"delegations.scope.unavailable\") }}\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <p class=\"px-3 py-8 text-center text-sm text-surface-500\">\r\n {{ t(\"delegations.scope.noSelection\") }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"border-t border-surface-200 px-4 py-3 flex items-center justify-end\"\r\n >\r\n <mt-button\r\n [label]=\"t('delegations.common.cancel')\"\r\n variant=\"outlined\"\r\n (click)=\"ref.close()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule, Location } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n numberAttribute,\r\n OnInit,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Table } from '@masterteam/components/table';\r\nimport type {\r\n ColumnDef,\r\n TableAction,\r\n TableStatusMapValue,\r\n} from '@masterteam/components/table';\r\nimport { finalize } from 'rxjs';\r\nimport {\r\n DelegationAllowedAction,\r\n DelegationEffectiveStatus,\r\n DelegationListQuery,\r\n DelegationRow,\r\n} from '../../../store/delegations/delegations.model';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\r\nimport DelegationForm from '../delegation-form/delegation-form';\r\nimport DelegationDetailDrawer from '../delegation-detail-drawer/delegation-detail-drawer';\r\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\r\nimport RejectDelegationDialog from '../reject-delegation-dialog/reject-delegation-dialog';\r\nimport { toDelegationUserValue } from '../delegation-user-entity';\r\n\r\ntype DelegationTab = 'my' | 'assigned' | 'approvals';\r\n\r\ntype DelegationTableRow = DelegationRow & {\r\n displayStatus: DelegationEffectiveStatus | 'InactiveToday';\r\n listedUser: ReturnType<typeof toDelegationUserValue>;\r\n delegatorUser: ReturnType<typeof toDelegationUserValue>;\r\n delegatedToUser: ReturnType<typeof toDelegationUserValue>;\r\n createdByUser: ReturnType<typeof toDelegationUserValue>;\r\n daysText: string;\r\n};\r\n\r\nfunction defaultTrueBooleanAttribute(value: unknown): boolean {\r\n return value === undefined || value === null ? true : booleanAttribute(value);\r\n}\r\n\r\nfunction defaultRouteInput<T>(fallback: T): (value: unknown) => T {\r\n return (value) =>\r\n value === undefined || value === null ? fallback : (value as T);\r\n}\r\n\r\nconst DELEGATION_TABS: readonly DelegationTab[] = [\r\n 'my',\r\n 'assigned',\r\n 'approvals',\r\n];\r\n\r\n/** Route param → a valid tab, or null when absent/unknown (host redirects to default). */\r\nfunction normalizeTab(value: unknown): DelegationTab | null {\r\n return DELEGATION_TABS.includes(value as DelegationTab)\r\n ? (value as DelegationTab)\r\n : null;\r\n}\r\n\r\n/** Query param (string) → number, or null when absent/non-numeric. */\r\nfunction toNullableNumber(value: unknown): number | null {\r\n if (value === undefined || value === null || value === '') return null;\r\n const n = numberAttribute(value, NaN);\r\n return Number.isNaN(n) ? null : n;\r\n}\r\n\r\n/**\r\n * Delegations portal page (doc 02, 09): two lists — My Delegations (current user\r\n * is delegator) and Delegated To Me (current user is delegate). Rows render only\r\n * the BE-returned `allowedActions`; status comes from `effectiveStatus`.\r\n */\r\n@Component({\r\n selector: 'mt-delegations-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Breadcrumb,\r\n Card,\r\n Page,\r\n Table,\r\n Tabs,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './delegations-list.html',\r\n styleUrl: './delegations-list.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationsList implements OnInit {\r\n /**\r\n * Admin/control-panel breadcrumb. Hidden on the client self-service surface\r\n * (its links point at /control-panel/*). Bound from route data via\r\n * `withComponentInputBinding()` — admin leaves it default; client passes\r\n * `data: { showBreadcrumb: false }`.\r\n */\r\n readonly showBreadcrumb = input<boolean, unknown>(true, {\r\n transform: defaultTrueBooleanAttribute,\r\n });\r\n\r\n /**\r\n * Admin routes can embed the list under `mt-delegations`, which already owns\r\n * the page title, back button, and route tabs.\r\n */\r\n readonly showPageShell = input<boolean, unknown>(true, {\r\n transform: defaultTrueBooleanAttribute,\r\n });\r\n\r\n /**\r\n * Admin-managed surface: the create/edit form also collects the Delegator /\r\n * From user (admin creates a delegation between two users). Client\r\n * self-service leaves this false. Bound from route data via\r\n * `withComponentInputBinding()` — admin passes `data: { adminMode: true }`.\r\n */\r\n readonly adminMode = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly surfaceTitleKey = input<string, unknown>('delegations.title', {\r\n transform: defaultRouteInput('delegations.title'),\r\n });\r\n readonly assignedTabLabelKey = input<string, unknown>(\r\n 'delegations.delegatedToMe',\r\n {\r\n transform: defaultRouteInput('delegations.delegatedToMe'),\r\n },\r\n );\r\n readonly assignedDecisionTab = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly assignedEmptyStateKey = input<string, unknown>(\r\n 'delegations.empty.assigned',\r\n {\r\n transform: defaultRouteInput('delegations.empty.assigned'),\r\n },\r\n );\r\n readonly assignedStatus = input<DelegationEffectiveStatus | null>(null);\r\n readonly showApprovalTab = input<boolean, unknown>(true, {\r\n transform: defaultTrueBooleanAttribute,\r\n });\r\n readonly approvalTabLabelKey = input<string, unknown>(\r\n 'delegations.tabs.approvals',\r\n {\r\n transform: defaultRouteInput('delegations.tabs.approvals'),\r\n },\r\n );\r\n readonly approvalEmptyStateKey = input<string, unknown>(\r\n 'delegations.empty.pending',\r\n {\r\n transform: defaultRouteInput('delegations.empty.pending'),\r\n },\r\n );\r\n readonly approvalStatus = input<DelegationEffectiveStatus, unknown>(\r\n 'PendingApproval',\r\n {\r\n transform:\r\n defaultRouteInput<DelegationEffectiveStatus>('PendingApproval'),\r\n },\r\n );\r\n\r\n /**\r\n * Route-driven mode (client self-service): the active tab is the `:tab` route\r\n * segment and the open drawer is a `?view=`/`?edit=` query param, so tabs and\r\n * drawers are deep-linkable + back-button aware. When false (admin/default),\r\n * tabs and drawers are managed internally exactly as before.\r\n */\r\n readonly routed = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n /** Bound from the `:tab` route param via `withComponentInputBinding()`. */\r\n readonly tab = input<DelegationTab | null, unknown>(null, {\r\n transform: normalizeTab,\r\n });\r\n /** Bound from the `?view=<id>` query param (detail drawer). */\r\n readonly view = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n /** Back-compatible notification deep-link aliases for opening details. */\r\n readonly selected = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly itemSelected = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly selectedItemId = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly selectedItem = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly itemId = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly delegationId = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n /** Bound from the `?edit=<id>` query param (edit drawer). */\r\n readonly edit = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n\r\n private readonly facade = inject(DelegationsFacade);\r\n private readonly location = inject(Location);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n protected readonly breadcrumbItems = linkedSignal(() => [\r\n {\r\n label: '',\r\n icon: 'general.home-line',\r\n routerLink: '/control-panel/workspaces',\r\n },\r\n {\r\n label: this.transloco.translate('product-settings.product-settings'),\r\n routerLink: '/control-panel/product-settings',\r\n },\r\n {\r\n label: this.transloco.translate('delegations.title'),\r\n },\r\n ]);\r\n\r\n protected readonly activeTab = signal<DelegationTab>('my');\r\n protected readonly surfaceTitle = computed(() =>\r\n this.transloco.translate(this.surfaceTitleKey()),\r\n );\r\n\r\n protected readonly isLoading = computed(() =>\r\n this.adminMode()\r\n ? this.facade.isLoadingAdmin()\r\n : this.activeTab() === 'my'\r\n ? this.facade.isLoadingMy()\r\n : this.activeTab() === 'approvals'\r\n ? this.facade.isLoadingApprovals()\r\n : this.facade.isLoadingAssigned(),\r\n );\r\n protected readonly rows = computed(() =>\r\n this.adminMode()\r\n ? this.facade.adminItems()\r\n : this.activeTab() === 'my'\r\n ? this.facade.myItems()\r\n : this.activeTab() === 'approvals'\r\n ? this.facade.approvalItems()\r\n : this.facade.assignedItems(),\r\n );\r\n protected readonly currentPage = computed(() =>\r\n this.adminMode()\r\n ? this.facade.adminPage()\r\n : this.activeTab() === 'my'\r\n ? this.facade.myPage()\r\n : this.activeTab() === 'approvals'\r\n ? this.facade.approvalsPage()\r\n : this.facade.assignedPage(),\r\n );\r\n private readonly currentQuery = signal<DelegationListQuery>({\r\n page: 1,\r\n pageSize: 25,\r\n });\r\n protected readonly tableRows = computed<DelegationTableRow[]>(() =>\r\n this.rows().map((row) => ({\r\n ...row,\r\n displayStatus:\r\n row.effectiveStatus === 'Scheduled' &&\r\n row.statusReasonCode === 'InactiveToday'\r\n ? 'InactiveToday'\r\n : row.effectiveStatus,\r\n listedUser: toDelegationUserValue(this.getListedParty(row)),\r\n delegatorUser: toDelegationUserValue(row.delegator),\r\n delegatedToUser: toDelegationUserValue(row.delegatedUser),\r\n createdByUser: toDelegationUserValue(row.createdBy),\r\n daysText: this.formatDays(row),\r\n })),\r\n );\r\n protected readonly emptyStateKey = computed(() =>\r\n this.adminMode()\r\n ? 'components.table.no-data-found'\r\n : this.activeTab() === 'my'\r\n ? 'delegations.empty.my'\r\n : this.activeTab() === 'approvals'\r\n ? this.approvalEmptyStateKey()\r\n : this.assignedEmptyStateKey(),\r\n );\r\n private readonly detailQueryId = computed(\r\n () =>\r\n this.view() ??\r\n this.selected() ??\r\n this.itemSelected() ??\r\n this.selectedItemId() ??\r\n this.selectedItem() ??\r\n this.itemId() ??\r\n this.delegationId(),\r\n );\r\n\r\n protected readonly tableActions = computed<TableAction[]>(() => [\r\n {\r\n icon: 'general.plus',\r\n label: this.transloco.translate('delegations.action.create'),\r\n color: 'primary',\r\n action: () => this.openForm(null),\r\n },\r\n ]);\r\n\r\n protected readonly rowActions = signal<TableAction[]>([\r\n {\r\n icon: 'general.eye',\r\n tooltip: this.transloco.translate('delegations.action.view'),\r\n color: 'primary',\r\n variant: 'outlined',\r\n action: (row: DelegationRow) => this.onView(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'View'),\r\n },\r\n {\r\n icon: 'custom.pencil',\r\n tooltip: this.transloco.translate('delegations.action.edit'),\r\n color: 'primary',\r\n action: (row: DelegationRow) => this.onEdit(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Edit'),\r\n },\r\n {\r\n icon: 'general.check',\r\n tooltip: this.transloco.translate('delegations.action.approve'),\r\n color: 'primary',\r\n action: (row: DelegationRow) => this.approve(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Approve'),\r\n loading: (row: DelegationRow) =>\r\n this.busyIds().includes(`approve:${row.delegationId}`),\r\n confirmation: { type: 'popup' },\r\n },\r\n {\r\n icon: 'general.x-close',\r\n tooltip: this.transloco.translate('delegations.action.reject'),\r\n color: 'danger',\r\n variant: 'outlined',\r\n // Opens a dialog that collects a required reason (no inline popup confirm).\r\n action: (row: DelegationRow) => this.reject(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Reject'),\r\n },\r\n {\r\n icon: 'general.trash-01',\r\n tooltip: this.transloco.translate('delegations.action.cancel'),\r\n color: 'danger',\r\n variant: 'outlined',\r\n action: (row: DelegationRow) => this.cancel(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Cancel'),\r\n loading: (row: DelegationRow) =>\r\n this.busyIds().includes(`cancel:${row.delegationId}`),\r\n confirmation: {\r\n type: 'popup',\r\n message: this.transloco.translate('delegations.confirm.cancel'),\r\n icon: 'general.x-circle',\r\n acceptButton: { severity: 'danger' },\r\n },\r\n },\r\n {\r\n icon: 'arrow.arrow-right',\r\n tooltip: this.transloco.translate('delegations.action.startSession'),\r\n color: 'primary',\r\n action: (row: DelegationRow) => this.startSession(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'StartSession'),\r\n },\r\n ]);\r\n\r\n /**\r\n * Table status accent colors. Kept in visual sync with the canonical palette\r\n * in `delegation-status-chip` (its light-mode text colors) so the list table\r\n * and the status chip render the same hue for each status.\r\n */\r\n private readonly statusColors: Record<\r\n DelegationEffectiveStatus | 'InactiveToday',\r\n string\r\n > = {\r\n Active: '#166534',\r\n Scheduled: '#1e40af',\r\n PendingApproval: '#854d0e',\r\n InactiveToday: '#1e40af',\r\n Expired: '#4b5563',\r\n Rejected: '#991b1b',\r\n Cancelled: '#374151',\r\n };\r\n\r\n protected readonly statusMap = linkedSignal<\r\n Record<DelegationEffectiveStatus | 'InactiveToday', TableStatusMapValue>\r\n >(() => ({\r\n Active: {\r\n display: this.transloco.translate('delegations.status.active'),\r\n color: this.statusColors.Active,\r\n },\r\n Scheduled: {\r\n display: this.transloco.translate('delegations.status.scheduled'),\r\n color: this.statusColors.Scheduled,\r\n },\r\n PendingApproval: {\r\n display: this.transloco.translate('delegations.status.pendingApproval'),\r\n color: this.statusColors.PendingApproval,\r\n },\r\n InactiveToday: {\r\n display: this.transloco.translate('delegations.status.inactiveToday'),\r\n color: this.statusColors.InactiveToday,\r\n },\r\n Expired: {\r\n display: this.transloco.translate('delegations.status.expired'),\r\n color: this.statusColors.Expired,\r\n },\r\n Rejected: {\r\n display: this.transloco.translate('delegations.status.rejected'),\r\n color: this.statusColors.Rejected,\r\n },\r\n Cancelled: {\r\n display: this.transloco.translate('delegations.status.cancelled'),\r\n color: this.statusColors.Cancelled,\r\n },\r\n }));\r\n\r\n protected readonly tableColumns = linkedSignal<ColumnDef[]>(() => {\r\n const baseColumns: ColumnDef[] = [\r\n {\r\n key: 'displayStatus',\r\n label: this.transloco.translate('delegations.column.status'),\r\n type: 'status',\r\n statusMap: this.statusMap(),\r\n },\r\n {\r\n key: 'startsAtUtc',\r\n label: this.transloco.translate('delegations.column.startDate'),\r\n type: 'dateTime',\r\n },\r\n {\r\n key: 'endsAtUtc',\r\n label: this.transloco.translate('delegations.column.endDate'),\r\n type: 'dateTime',\r\n },\r\n {\r\n key: 'createdByUser',\r\n label: this.transloco.translate('delegations.column.createdBy'),\r\n type: 'user',\r\n },\r\n {\r\n key: 'createdAtUtc',\r\n label: this.transloco.translate('delegations.column.createdDate'),\r\n type: 'dateTime',\r\n },\r\n {\r\n key: 'daysText',\r\n label: this.transloco.translate('delegations.column.days'),\r\n type: 'text',\r\n },\r\n ];\r\n\r\n if (this.adminMode()) {\r\n return [\r\n {\r\n key: 'delegatorUser',\r\n label: this.transloco.translate('delegations.column.delegatorName'),\r\n type: 'user',\r\n },\r\n {\r\n key: 'delegatedToUser',\r\n label: this.transloco.translate('delegations.column.delegatedTo'),\r\n type: 'user',\r\n },\r\n ...baseColumns,\r\n ];\r\n }\r\n\r\n return [\r\n {\r\n key: 'listedUser',\r\n label: this.transloco.translate(\r\n this.activeTab() === 'my'\r\n ? 'delegations.column.delegatedTo'\r\n : 'delegations.column.delegatorName',\r\n ),\r\n type: 'user',\r\n },\r\n ...baseColumns,\r\n ];\r\n });\r\n\r\n private readonly busyIds = signal<string[]>([]);\r\n\r\n private readonly weekdayKeys = [\r\n 'sunday',\r\n 'monday',\r\n 'tuesday',\r\n 'wednesday',\r\n 'thursday',\r\n 'friday',\r\n 'saturday',\r\n ] as const;\r\n\r\n // Route-driven drawer refs (only used when `routed()`). The active id is\r\n // captured per-subscription so an async `onClose` can tell a user-dismiss\r\n // (route still points at the id) from a route-driven / superseded close.\r\n private detailRef: ModalRef | null = null;\r\n private detailOpenId: number | null = null;\r\n private editRef: ModalRef | null = null;\r\n private editOpenId: number | null = null;\r\n\r\n constructor() {\r\n // Tab → route sync. `ngOnInit` performs the first load; this effect only\r\n // reacts to later route changes (tab switches, Back/Forward).\r\n effect(() => {\r\n if (!this.routed()) return;\r\n const t = this.tab() ?? 'my';\r\n untracked(() => {\r\n if (t !== this.activeTab()) {\r\n this.activeTab.set(t);\r\n this.loadCurrentTab();\r\n }\r\n });\r\n });\r\n\r\n // Detail (`?view=`) drawer ↔ route.\r\n effect(() => {\r\n if (!this.routed()) return;\r\n const id = this.detailQueryId();\r\n untracked(() => this.syncDetailDrawer(id));\r\n });\r\n\r\n // Edit (`?edit=`) drawer ↔ route. `view` takes precedence: while a view is\r\n // open, the edit drawer is suppressed (and reopens if `view` later clears).\r\n effect(() => {\r\n if (!this.routed()) return;\r\n const id = this.edit();\r\n const hasView = this.detailQueryId() != null;\r\n untracked(() => this.syncEditDrawer(hasView ? null : id));\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.routed()) {\r\n this.activeTab.set(this.tab() ?? 'my');\r\n }\r\n this.loadCurrentTab();\r\n }\r\n\r\n protected switchTab(tab: DelegationTab): void {\r\n if (this.routed()) {\r\n // Sibling tab segment; drop any open drawer query params.\r\n void this.router.navigate(['..', tab], {\r\n relativeTo: this.route,\r\n queryParams: {},\r\n });\r\n return;\r\n }\r\n this.activeTab.set(tab);\r\n this.loadCurrentTab();\r\n }\r\n\r\n protected goBack(): void {\r\n this.location.back();\r\n }\r\n\r\n private loadCurrentTab(\r\n query: DelegationListQuery = { page: 1, pageSize: 25 },\r\n ): void {\r\n this.currentQuery.set(query);\r\n if (this.adminMode()) {\r\n this.facade.getAdmin(query);\r\n return;\r\n }\r\n\r\n if (this.activeTab() === 'my') {\r\n this.facade.getMy(query);\r\n } else if (this.activeTab() === 'approvals') {\r\n this.facade.getApprovals({\r\n ...query,\r\n status: this.approvalStatus(),\r\n });\r\n } else {\r\n this.facade.getAssigned({\r\n ...query,\r\n status: query.status ?? this.assignedStatus() ?? undefined,\r\n });\r\n }\r\n }\r\n\r\n private reloadCurrentTab(): void {\r\n this.loadCurrentTab(this.currentQuery());\r\n }\r\n\r\n protected onLazyLoad(event: {\r\n currentPage?: number;\r\n pageSize?: number;\r\n }): void {\r\n this.loadCurrentTab({\r\n ...this.currentQuery(),\r\n page: event.currentPage ?? 1,\r\n pageSize: event.pageSize ?? this.currentPage()?.pageSize ?? 25,\r\n });\r\n }\r\n\r\n protected has(row: DelegationRow, action: DelegationAllowedAction): boolean {\r\n return row.allowedActions?.includes(action) ?? false;\r\n }\r\n\r\n protected formatDays(row: DelegationRow): string {\r\n if (row.dayRuleMode === 'SpecificDays' && row.specificDays?.length) {\r\n return row.specificDays\r\n .filter((d) => d >= 0 && d < this.weekdayKeys.length)\r\n .map((d) =>\r\n this.transloco.translate(`delegations.days.${this.weekdayKeys[d]}`),\r\n )\r\n .join(', ');\r\n }\r\n return this.transloco.translate('delegations.form.fullRange');\r\n }\r\n\r\n protected getListedParty(row: DelegationRow) {\r\n return this.activeTab() === 'my' ? row.delegatedUser : row.delegator;\r\n }\r\n\r\n // View/Edit entry points: in routed mode flip the URL (the sync effects open\r\n // the drawer); otherwise open imperatively as before.\r\n private onView(row: DelegationRow): void {\r\n if (this.routed()) {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { view: row.delegationId, edit: null },\r\n queryParamsHandling: 'merge',\r\n });\r\n return;\r\n }\r\n this.openDetailById(row.delegationId);\r\n }\r\n\r\n private onEdit(row: DelegationRow): void {\r\n if (this.routed()) {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { edit: row.delegationId, view: null },\r\n queryParamsHandling: 'merge',\r\n });\r\n return;\r\n }\r\n this.openForm(row);\r\n }\r\n\r\n private openDetailById(delegationId: number): ModalRef {\r\n return this.modal.openModal(DelegationDetailDrawer, 'drawer', {\r\n header: this.transloco.translate('delegations.action.view'),\r\n styleClass:\r\n '!absolute !shadow-none !w-full !max-w-full sm:!w-[52rem] xl:!w-[64rem]',\r\n position: 'end',\r\n appendTo: 'page-content',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: {\r\n delegationId,\r\n adminMode: this.adminMode(),\r\n },\r\n });\r\n }\r\n\r\n private openForm(row: DelegationRow | null): ModalRef {\r\n const ref = this.modal.openModal(\r\n DelegationForm,\r\n row ? 'drawer' : 'dialog',\r\n {\r\n header: this.transloco.translate(\r\n row ? 'delegations.action.edit' : 'delegations.action.create',\r\n ),\r\n styleClass: row\r\n ? '!absolute !shadow-none !w-full !max-w-full sm:!w-[68rem] xl:!w-[84rem]'\r\n : '!w-[min(98vw,88rem)] !max-w-[98vw] !h-[min(94vh,56rem)] !max-h-[94vh] !overflow-hidden',\r\n position: row ? 'end' : '',\r\n appendTo: row ? 'page-content' : 'body',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: {\r\n delegationForEdit: row,\r\n readonly: false,\r\n adminMode: this.adminMode(),\r\n },\r\n },\r\n );\r\n // Routed edit reload/clear is handled by `syncEditDrawer`; create and\r\n // non-routed edit self-manage their reload here.\r\n if (!this.routed() || row == null) {\r\n ref.onClose.subscribe((saved: boolean) => {\r\n if (saved) this.reloadCurrentTab();\r\n });\r\n }\r\n return ref;\r\n }\r\n\r\n private syncDetailDrawer(id: number | null): void {\r\n if (id != null && this.detailOpenId !== id) {\r\n const openingId = id;\r\n this.closeDetail();\r\n this.detailOpenId = openingId;\r\n this.detailRef = this.openDetailById(openingId);\r\n this.detailRef.onClose.subscribe(() => {\r\n if (this.detailOpenId !== openingId) return; // superseded by a switch\r\n this.detailRef = null;\r\n this.detailOpenId = null;\r\n // Route still points here ⇒ the user dismissed the drawer; clear it.\r\n if (this.detailQueryId() === openingId) this.clearDetailQuery();\r\n });\r\n } else if (id == null) {\r\n this.closeDetail();\r\n }\r\n }\r\n\r\n private syncEditDrawer(id: number | null): void {\r\n if (id != null && this.editOpenId !== id) {\r\n const openingId = id;\r\n this.closeEdit();\r\n this.editOpenId = openingId;\r\n // The detail drawer loads its own data, but the form prefills from the\r\n // list row when present; fall back to an id-only stub on a cold deep-link\r\n // (the form then sources rowVersion from the detail it loads).\r\n const row =\r\n this.rows().find((r) => r.delegationId === openingId) ??\r\n ({ delegationId: openingId } as DelegationRow);\r\n this.editRef = this.openForm(row);\r\n this.editRef.onClose.subscribe((saved: boolean) => {\r\n if (this.editOpenId !== openingId) return; // superseded\r\n this.editRef = null;\r\n this.editOpenId = null;\r\n if (saved) this.reloadCurrentTab();\r\n if (this.edit() === openingId) this.clearQuery('edit');\r\n });\r\n } else if (id == null) {\r\n this.closeEdit();\r\n }\r\n }\r\n\r\n private closeDetail(): void {\r\n if (this.detailRef) {\r\n this.detailOpenId = null; // mark superseded so the pending onClose no-ops\r\n const ref = this.detailRef;\r\n this.detailRef = null;\r\n ref.close();\r\n }\r\n }\r\n\r\n private closeEdit(): void {\r\n if (this.editRef) {\r\n this.editOpenId = null;\r\n const ref = this.editRef;\r\n this.editRef = null;\r\n ref.close();\r\n }\r\n }\r\n\r\n private clearQuery(param: 'view' | 'edit'): void {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { [param]: null },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n private clearDetailQuery(): void {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: {\r\n view: null,\r\n selected: null,\r\n itemSelected: null,\r\n selectedItemId: null,\r\n selectedItem: null,\r\n itemId: null,\r\n delegationId: null,\r\n },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n private approve(row: DelegationRow): void {\r\n this.mark(`approve:${row.delegationId}`, true);\r\n this.facade\r\n .approve(row.delegationId, { rowVersion: row.rowVersion })\r\n .pipe(finalize(() => this.mark(`approve:${row.delegationId}`, false)))\r\n .subscribe({ next: () => this.reloadCurrentTab() });\r\n }\r\n\r\n private reject(row: DelegationRow): void {\r\n const ref = this.modal.openModal(RejectDelegationDialog, 'dialog', {\r\n header: this.transloco.translate('delegations.action.reject'),\r\n styleClass: '!w-[min(96vw,30rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row },\r\n });\r\n ref.onClose.subscribe((rejected: boolean) => {\r\n if (rejected) this.reloadCurrentTab();\r\n });\r\n }\r\n\r\n private cancel(row: DelegationRow): void {\r\n this.mark(`cancel:${row.delegationId}`, true);\r\n this.facade\r\n .cancel(row.delegationId, row.rowVersion, this.adminMode())\r\n .pipe(finalize(() => this.mark(`cancel:${row.delegationId}`, false)))\r\n .subscribe({ next: () => this.reloadCurrentTab() });\r\n }\r\n\r\n private startSession(row: DelegationRow): void {\r\n const ref = this.modal.openModal(StartSessionDialog, 'dialog', {\r\n header: this.transloco.translate('delegations.action.startSession'),\r\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row, intent: 'start' },\r\n });\r\n ref.onClose.subscribe((started: boolean) => {\r\n if (started) this.reloadCurrentTab();\r\n });\r\n }\r\n\r\n private mark(key: string, on: boolean): void {\r\n this.busyIds.update((ids) =>\r\n on ? [...ids, key] : ids.filter((id) => id !== key),\r\n );\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <ng-template #tableContent>\r\n <div class=\"flex flex-col gap-4\">\r\n @if (!adminMode()) {\r\n @let assignedLabel =\r\n assignedDecisionTab()\r\n ? t(\"delegations.action.approve\") +\r\n \" / \" +\r\n t(\"delegations.action.reject\")\r\n : t(assignedTabLabelKey());\r\n\r\n <mt-tabs\r\n mode=\"underline\"\r\n [active]=\"activeTab()\"\r\n [options]=\"\r\n showApprovalTab()\r\n ? [\r\n { value: 'my', label: t('delegations.myDelegations') },\r\n { value: 'assigned', label: assignedLabel },\r\n { value: 'approvals', label: t(approvalTabLabelKey()) },\r\n ]\r\n : [\r\n { value: 'my', label: t('delegations.myDelegations') },\r\n { value: 'assigned', label: assignedLabel },\r\n ]\r\n \"\r\n fluid\r\n (onChange)=\"switchTab($event)\"\r\n ></mt-tabs>\r\n }\r\n\r\n <mt-table\r\n [data]=\"tableRows()\"\r\n [columns]=\"tableColumns()\"\r\n [actions]=\"tableActions()\"\r\n [rowActions]=\"rowActions()\"\r\n [loading]=\"isLoading()\"\r\n [lazy]=\"true\"\r\n [lazyTotalRecords]=\"currentPage()?.totalCount ?? 0\"\r\n dataKey=\"delegationId\"\r\n [noCard]=\"true\"\r\n (lazyLoad)=\"onLazyLoad($event)\"\r\n >\r\n <ng-template #empty>\r\n <div\r\n class=\"flex min-h-64 flex-col items-center justify-center gap-4 px-6 py-10 text-center\"\r\n >\r\n <div\r\n class=\"flex size-16 items-center justify-center rounded-3xl bg-surface-0 text-primary shadow-sm\"\r\n >\r\n <svg\r\n viewBox=\"0 0 64 64\"\r\n class=\"size-9\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect\r\n x=\"10\"\r\n y=\"14\"\r\n width=\"44\"\r\n height=\"36\"\r\n rx=\"12\"\r\n class=\"fill-primary/10 stroke-primary/35\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M21 28H43\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M21 36H35\"\r\n class=\"stroke-primary/70\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <p class=\"max-w-sm text-sm text-surface-500\">\r\n {{ t(emptyStateKey()) }}\r\n </p>\r\n </div>\r\n </ng-template>\r\n </mt-table>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #adminContent>\r\n <div class=\"flex min-h-full flex-col gap-4\">\r\n @if (showBreadcrumb()) {\r\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\r\n }\r\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n @if (adminMode()) {\r\n @if (showPageShell()) {\r\n <mt-page\r\n [title]=\"surfaceTitle()\"\r\n [avatarIcon]=\"'custom.hierarchy-structure'\"\r\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-indigo-50)',\r\n '--p-avatar-color': 'var(--p-indigo-700)',\r\n }\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <ng-container *ngTemplateOutlet=\"adminContent\"></ng-container>\r\n </mt-page>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"adminContent\"></ng-container>\r\n }\r\n } @else {\r\n <div class=\"flex h-full flex-col gap-4 ps-4 pt-4\">\r\n <mt-card class=\"rounded-e-none!\" [title]=\"surfaceTitle()\">\r\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\r\n </mt-card>\r\n </div>\r\n }\r\n</ng-container>\r\n","import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { inject } from '@angular/core';\r\nimport { catchError, throwError } from 'rxjs';\r\nimport {\r\n DELEGATED_RUNTIME_REQUEST,\r\n DELEGATION_RUNTIME_CONFIG,\r\n} from '../runtime/delegation-runtime';\r\nimport { DelegationTokenVault } from '../runtime/delegation-token-vault';\r\nimport { DelegationSessionFacade } from '../store/session/delegation-session.facade';\r\nimport type { DelegationSessionInvalidationReason } from '../store/session/delegation-session.model';\r\n\r\nconst FORBIDDEN_PATHS = [\r\n /\\/(?:identity\\/)?(?:auth|login|logout|token)(?:\\/|$)/i,\r\n /\\/identity\\/delegations(?:\\/|$)/i,\r\n /\\/(?:settings|assets|public)(?:\\/|$)/i,\r\n];\r\n\r\nconst INVALIDATION_REASONS: Record<\r\n string,\r\n DelegationSessionInvalidationReason\r\n> = {\r\n scopechanged: 'ScopeChanged',\r\n versionchanged: 'VersionChanged',\r\n sessionmismatch: 'SessionMismatch',\r\n actormismatch: 'ActorMismatch',\r\n applicationmismatch: 'ApplicationMismatch',\r\n tenantmismatch: 'TenantMismatch',\r\n expired: 'Expired',\r\n tokenexpired: 'Expired',\r\n invalid: 'TokenInvalid',\r\n tokeninvalid: 'TokenInvalid',\r\n};\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nfunction field(value: unknown, key: string): unknown {\r\n return isRecord(value) ? value[key] : undefined;\r\n}\r\n\r\nfunction delegationReasonCode(error: HttpErrorResponse): string | null {\r\n const body = error.error;\r\n const errors = field(body, 'errors');\r\n const directDetails = field(body, 'errorDetails');\r\n const nestedDetails = field(errors, 'details');\r\n const value =\r\n field(directDetails, 'delegationReasonCode') ??\r\n field(nestedDetails, 'delegationReasonCode');\r\n return typeof value === 'string' ? value : null;\r\n}\r\n\r\nfunction invalidationReason(\r\n error: HttpErrorResponse,\r\n): DelegationSessionInvalidationReason | null {\r\n const code = delegationReasonCode(error);\r\n if (!code) return null;\r\n const normalized = (code.split('.').pop() ?? code)\r\n .replace(/[^a-z]/gi, '')\r\n .toLowerCase();\r\n return INVALIDATION_REASONS[normalized] ?? null;\r\n}\r\n\r\nfunction isTrustedRuntimeUrl(\r\n requestUrl: string,\r\n configuredBase: string,\r\n document: Document,\r\n): boolean {\r\n if (\r\n !configuredBase ||\r\n FORBIDDEN_PATHS.some((rule) => rule.test(requestUrl))\r\n ) {\r\n return false;\r\n }\r\n try {\r\n const pageBase = document.baseURI;\r\n const request = new URL(requestUrl, pageBase);\r\n const api = new URL(configuredBase, pageBase);\r\n const apiPath = api.pathname.endsWith('/')\r\n ? api.pathname\r\n : `${api.pathname}/`;\r\n return (\r\n request.origin === api.origin &&\r\n (request.pathname === api.pathname ||\r\n request.pathname.startsWith(apiPath))\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Adds delegated authority only to explicitly marked, trusted business-runtime\r\n * requests. Register after the normal authorization interceptor.\r\n */\r\nexport const appDelegationInterceptor: HttpInterceptorFn = (req, next) => {\r\n if (!req.context.get(DELEGATED_RUNTIME_REQUEST)) {\r\n return next(req);\r\n }\r\n\r\n const config = inject(DELEGATION_RUNTIME_CONFIG);\r\n const document = inject(DOCUMENT);\r\n if (\r\n !isTrustedRuntimeUrl(\r\n req.url,\r\n config.resolveApplicationApiBaseUrl(),\r\n document,\r\n )\r\n ) {\r\n return next(req);\r\n }\r\n\r\n const token = inject(DelegationTokenVault).token();\r\n if (!token) {\r\n return next(req);\r\n }\r\n\r\n const facade = inject(DelegationSessionFacade);\r\n return next(\r\n req.clone({ setHeaders: { 'app-delegation': `Bearer ${token}` } }),\r\n ).pipe(\r\n catchError((error: unknown) => {\r\n if (error instanceof HttpErrorResponse && error.status === 403) {\r\n const reason = invalidationReason(error);\r\n if (reason) {\r\n facade.endSession(reason).subscribe();\r\n }\r\n }\r\n return throwError(() => error);\r\n }),\r\n );\r\n};\r\n","// store/index.ts\r\nexport * from './delegations';\r\nexport * from './session';\r\n","// Runtime UI surfaces — projected into host topbars + opened via ModalService.\r\nexport { TopbarDelegationMenu } from './lib/delegations/topbar-delegation-menu/topbar-delegation-menu';\r\nexport { DelegationMenuPanel } from './lib/delegations/delegation-menu-panel/delegation-menu-panel';\r\nexport { DelegationStatusChip } from './lib/delegations/delegation-status-chip/delegation-status-chip';\r\nexport { default as StartSessionDialog } from './lib/delegations/start-session-dialog/start-session-dialog';\r\nexport { default as RejectDelegationDialog } from './lib/delegations/reject-delegation-dialog/reject-delegation-dialog';\r\n\r\n// Management UI — portal page (My Delegations / Delegated To Me) + form + detail drawer.\r\nexport { default as Delegations } from './lib/delegations/delegations';\r\nexport { default as DelegationsList } from './lib/delegations/delegations-list/delegations-list';\r\nexport { default as DelegationForm } from './lib/delegations/delegation-form/delegation-form';\r\nexport { default as DelegationDetailDrawer } from './lib/delegations/delegation-detail-drawer/delegation-detail-drawer';\r\nexport { ScopePicker } from './lib/delegations/delegation-form/scope-picker/scope-picker';\r\n\r\n// HTTP\r\nexport { appDelegationInterceptor } from './interceptors/app-delegation.interceptor';\r\nexport * from './runtime';\r\n\r\n// Store (models, actions, state, facades — both delegations and session)\r\nexport * from './store';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BASE","__decorate","isRecord","EMPTY_SCOPE","i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-delegations.mjs","sources":["../../../../packages/masterteam/delegations/src/runtime/delegation-runtime.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-prompt-receipts.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.actions.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.model.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-token-vault.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.state.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-user-entity.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-candidates-prompt-dialog/delegation-candidates-prompt-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-candidates-prompt-dialog/delegation-candidates-prompt-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-status-chip/delegation-status-chip.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-menu-panel/delegation-menu-panel.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-menu-panel/delegation-menu-panel.html","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.ts","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.html","../../../../packages/masterteam/delegations/src/store/delegations/delegations.actions.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.model.ts","../../../../packages/masterteam/delegations/src/store/delegations/scope-fingerprint.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.state.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-scope-display.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-scope-options.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.html","../../../../packages/masterteam/delegations/src/interceptors/app-delegation.interceptor.ts","../../../../packages/masterteam/delegations/src/store/index.ts","../../../../packages/masterteam/delegations/src/public-api.ts","../../../../packages/masterteam/delegations/src/masterteam-delegations.ts"],"sourcesContent":["import { HttpContext, HttpContextToken } from '@angular/common/http';\nimport {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport type { ActiveDelegationSession } from '../store/session/delegation-session.model';\n\nexport interface DelegationPromptNamespace {\n userId: string;\n applicationKey: string;\n tenantKey?: string | null;\n}\n\nexport interface DelegationContextChange {\n previous: ActiveDelegationSession | null;\n current: ActiveDelegationSession | null;\n reason: string;\n}\n\nexport interface DelegationRuntimeConfig {\n resolveApplicationApiBaseUrl: () => string;\n resolvePromptNamespace: () => DelegationPromptNamespace;\n onContextChanged: (change: DelegationContextChange) => void | Promise<void>;\n}\n\nexport type DelegationRuntimeConfigFactory = () => DelegationRuntimeConfig;\n\nconst DEFAULT_CONFIG: DelegationRuntimeConfig = {\n resolveApplicationApiBaseUrl: () => '',\n resolvePromptNamespace: () => ({\n userId: 'anonymous',\n applicationKey: 'default',\n tenantKey: 'default',\n }),\n onContextChanged: () => undefined,\n};\n\nexport const DELEGATION_RUNTIME_CONFIG =\n new InjectionToken<DelegationRuntimeConfig>('DELEGATION_RUNTIME_CONFIG', {\n factory: () => DEFAULT_CONFIG,\n });\n\nexport function provideDelegationRuntime(\n config: DelegationRuntimeConfig | DelegationRuntimeConfigFactory,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: DELEGATION_RUNTIME_CONFIG,\n useFactory: () => (typeof config === 'function' ? config() : config),\n },\n ]);\n}\n\n/** Opt-in marker for a trusted first-party business-runtime request. */\nexport const DELEGATED_RUNTIME_REQUEST = new HttpContextToken<boolean>(\n () => false,\n);\n\nexport function withDelegatedRuntime(\n context: HttpContext = new HttpContext(),\n): HttpContext {\n return context.set(DELEGATED_RUNTIME_REQUEST, true);\n}\n","import { DOCUMENT } from '@angular/common';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { DelegationRow } from '../store/delegations/delegations.model';\r\nimport { DELEGATION_RUNTIME_CONFIG } from './delegation-runtime';\r\n\r\nconst STORAGE_KEY = 'mt.delegation.prompt-receipts.v1';\r\nconst MAX_RECEIPTS = 100;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationPromptReceiptService {\r\n private readonly document = inject(DOCUMENT);\r\n private readonly config = inject(DELEGATION_RUNTIME_CONFIG);\r\n private readonly claimed = new Set<string>();\r\n\r\n /** Atomically claims only candidates that have not already produced a prompt. */\r\n async claimUnseen(candidates: DelegationRow[]): Promise<DelegationRow[]> {\r\n const pairs = await Promise.all(\r\n candidates.map(async (candidate) => ({\r\n candidate,\r\n receipt: await this.receiptFor(candidate),\r\n })),\r\n );\r\n const stored = this.read();\r\n const unseen = pairs.filter(\r\n ({ receipt }) => !stored.includes(receipt) && !this.claimed.has(receipt),\r\n );\r\n if (!unseen.length) {\r\n return [];\r\n }\r\n\r\n unseen.forEach(({ receipt }) => this.claimed.add(receipt));\r\n this.write([...stored, ...unseen.map(({ receipt }) => receipt)]);\r\n return unseen.map(({ candidate }) => candidate);\r\n }\r\n\r\n private async receiptFor(candidate: DelegationRow): Promise<string> {\r\n const namespace = this.config.resolvePromptNamespace();\r\n const input = [\r\n namespace.userId,\r\n namespace.applicationKey,\r\n namespace.tenantKey ?? '',\r\n candidate.delegationId,\r\n candidate.rowVersion,\r\n ].join('|');\r\n const crypto = this.document.defaultView?.crypto ?? globalThis.crypto;\r\n if (crypto?.subtle) {\r\n const digest = await crypto.subtle.digest(\r\n 'SHA-256',\r\n new TextEncoder().encode(input),\r\n );\r\n return Array.from(new Uint8Array(digest), (value) =>\r\n value.toString(16).padStart(2, '0'),\r\n ).join('');\r\n }\r\n\r\n // Deterministic non-reversible fallback for test/non-secure browser contexts.\r\n let hash = 2166136261;\r\n for (const char of input) {\r\n hash ^= char.charCodeAt(0);\r\n hash = Math.imul(hash, 16777619);\r\n }\r\n return `f${(hash >>> 0).toString(16).padStart(8, '0')}`;\r\n }\r\n\r\n private read(): string[] {\r\n try {\r\n const raw = this.document.defaultView?.localStorage.getItem(STORAGE_KEY);\r\n const parsed: unknown = raw ? JSON.parse(raw) : [];\r\n return Array.isArray(parsed)\r\n ? parsed.filter((item): item is string => typeof item === 'string')\r\n : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n private write(receipts: string[]): void {\r\n try {\r\n const bounded = [...new Set(receipts)].slice(-MAX_RECEIPTS);\r\n this.document.defaultView?.localStorage.setItem(\r\n STORAGE_KEY,\r\n JSON.stringify(bounded),\r\n );\r\n } catch {\r\n // Storage can be unavailable; the in-memory claim still coalesces dialogs.\r\n }\r\n }\r\n}\r\n","import { DelegationRow } from '../delegations/delegations.model';\r\nimport { DelegationSessionInvalidationReason } from './delegation-session.model';\r\n\r\n/** Fetch the active delegations the current user may start (user/activedelegations). */\r\nexport class LoadDelegationCandidates {\r\n static readonly type = '[DelegationSession] Load Candidates';\r\n constructor(\r\n public page: number = 1,\r\n public pageSize: number = 25,\r\n public append: boolean = false,\r\n ) {}\r\n}\r\n\r\n/** Start a delegated session for the given assignment row. */\r\nexport class StartDelegationSession {\r\n static readonly type = '[DelegationSession] Start';\r\n constructor(public delegation: DelegationRow) {}\r\n}\r\n\r\n/** End the current delegated session. Client-local only (doc 05). */\r\nexport class EndDelegationSession {\r\n static readonly type = '[DelegationSession] End';\r\n constructor(public reason: DelegationSessionInvalidationReason = 'Manual') {}\r\n}\r\n\r\n/** Switch directly from the current session to another delegation. */\r\nexport class SwitchDelegationSession {\r\n static readonly type = '[DelegationSession] Switch';\r\n constructor(public delegation: DelegationRow) {}\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\nimport { DelegationRow } from '../delegations/delegations.model';\r\n\r\n/**\r\n * Active delegated session. Memory-only by design (doc 05):\r\n * the delegation token is never persisted to long-lived storage.\r\n *\r\n * `delegation.delegatedUser` is the executed-by (actual logged-in) user and\r\n * `delegation.delegator` is the on-behalf-of user — both already present on the\r\n * row from the active-delegations endpoint.\r\n */\r\nexport interface ActiveDelegationSession {\r\n delegation: DelegationRow;\r\n expiresAtUtc: string;\r\n delegationVersion: number;\r\n}\r\n\r\nexport interface DelegationSessionStartResponse {\r\n accessToken: string;\r\n expiresAtUtc: string;\r\n delegationId: number;\r\n delegationVersion: number;\r\n}\r\n\r\nexport type DelegationSessionInvalidationReason =\r\n | 'TokenInvalid'\r\n | 'SessionMismatch'\r\n | 'ScopeChanged'\r\n | 'VersionChanged'\r\n | 'ActorMismatch'\r\n | 'ApplicationMismatch'\r\n | 'TenantMismatch'\r\n | 'Expired'\r\n | 'Logout'\r\n | 'UserSwitch'\r\n | 'TenantSwitch'\r\n | 'AppSwitch'\r\n | 'Manual';\r\n\r\nexport enum DelegationSessionActionKey {\r\n LoadCandidates = 'loadCandidates',\r\n StartSession = 'startSession',\r\n}\r\n\r\nexport interface DelegationSessionStateModel extends LoadingStateShape<DelegationSessionActionKey> {\r\n active: ActiveDelegationSession | null;\r\n candidates: DelegationRow[];\r\n candidatesPage: number;\r\n candidatesPageSize: number;\r\n candidatesTotalCount: number;\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n/** Package-private: raw delegated credentials never enter NGXS or public models. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationTokenVault {\r\n private readonly value = signal<string | null>(null);\r\n\r\n readonly token = this.value.asReadonly();\r\n\r\n set(token: string): void {\r\n this.value.set(token);\r\n }\r\n\r\n clear(): void {\r\n this.value.set(null);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n Action,\r\n Actions,\r\n ofActionDispatched,\r\n ofActionSuccessful,\r\n Selector,\r\n State,\r\n StateContext,\r\n Store,\r\n} from '@ngxs/store';\r\nimport { handleApiRequest } from '@masterteam/components';\r\nimport { EMPTY, from, switchMap } from 'rxjs';\r\nimport { DELEGATION_RUNTIME_CONFIG } from '../../runtime/delegation-runtime';\r\nimport { DelegationTokenVault } from '../../runtime/delegation-token-vault';\r\nimport { Response } from '../delegations/api.model';\r\nimport {\r\n DelegationPage,\r\n DelegationRow,\r\n} from '../delegations/delegations.model';\r\nimport {\r\n EndDelegationSession,\r\n LoadDelegationCandidates,\r\n StartDelegationSession,\r\n SwitchDelegationSession,\r\n} from './delegation-session.actions';\r\nimport {\r\n ActiveDelegationSession,\r\n DelegationSessionActionKey,\r\n DelegationSessionStartResponse,\r\n DelegationSessionStateModel,\r\n} from './delegation-session.model';\r\n\r\nconst BASE = 'identity/delegations';\r\n\r\n// Action shells matching gateway-auth type strings - loose coupling, matched by\r\n// `type` only so this package does not depend on @masterteam/gateway-auth.\r\nclass GatewayLoginSuccessShell {\r\n static readonly type = '[Auth] Login Success';\r\n}\r\nclass GatewayLogoutShell {\r\n static readonly type = '[Auth] Logout';\r\n}\r\nclass GatewayLoginFailureShell {\r\n static readonly type = '[Auth] Login Failure';\r\n}\r\nclass GatewayLaunchApplicationShell {\r\n static readonly type = '[Auth] Launch Application';\r\n}\r\nclass GatewaySetAppSessionShell {\r\n static readonly type = '[Auth] Set App Session';\r\n}\r\nclass GatewayRestoreBrowserHandoffShell {\r\n static readonly type = '[Auth] Restore Browser Handoff';\r\n}\r\nclass GatewayClearAppSessionShell {\r\n static readonly type = '[Auth] Clear App Session';\r\n}\r\nclass GatewayClearAllAppSessionsShell {\r\n static readonly type = '[Auth] Clear All App Sessions';\r\n}\r\n\r\nconst CLEAR_CANDIDATE_REASONS = [\r\n 'Logout',\r\n 'UserSwitch',\r\n 'TenantSwitch',\r\n 'AppSwitch',\r\n] as const;\r\n\r\nfunction shouldClearCandidates(reason: string): boolean {\r\n return CLEAR_CANDIDATE_REASONS.some((candidate) => candidate === reason);\r\n}\r\n\r\nfunction canStart(row: DelegationRow): boolean {\r\n return (\r\n row.effectiveStatus === 'Active' &&\r\n row.allowedActions?.includes('StartSession')\r\n );\r\n}\r\n\r\n@State<DelegationSessionStateModel>({\r\n name: 'delegationSession',\r\n defaults: {\r\n active: null,\r\n candidates: [],\r\n candidatesPage: 1,\r\n candidatesPageSize: 25,\r\n candidatesTotalCount: 0,\r\n loadingActive: [],\r\n errors: {},\r\n },\r\n})\r\n@Injectable()\r\nexport class DelegationSessionState {\r\n private http = inject(HttpClient);\r\n private actions$ = inject(Actions);\r\n private store = inject(Store);\r\n private vault = inject(DelegationTokenVault);\r\n private runtime = inject(DELEGATION_RUNTIME_CONFIG);\r\n private expiryTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n this.actions$\r\n .pipe(ofActionSuccessful(GatewayLoginSuccessShell))\r\n .subscribe(() =>\r\n // Only (re)load candidates here. The prompt flag is NOT reset on login\r\n // because the host re-dispatches \"Login Success\" on every bootstrap /\r\n // refresh — resetting here would re-prompt on each refresh. The flag is\r\n // reset on explicit logout / user / app switch (see EndDelegationSession),\r\n // so the prompt fires once per real login.\r\n this.store.dispatch(new LoadDelegationCandidates()),\r\n );\r\n\r\n this.actions$\r\n .pipe(ofActionDispatched(GatewayLogoutShell, GatewayLoginFailureShell))\r\n .subscribe(() => this.store.dispatch(new EndDelegationSession('Logout')));\r\n\r\n this.actions$\r\n .pipe(\r\n ofActionDispatched(\r\n GatewayLaunchApplicationShell,\r\n GatewaySetAppSessionShell,\r\n GatewayRestoreBrowserHandoffShell,\r\n GatewayClearAppSessionShell,\r\n GatewayClearAllAppSessionsShell,\r\n ),\r\n )\r\n .subscribe(() =>\r\n this.store.dispatch(new EndDelegationSession('AppSwitch')),\r\n );\r\n\r\n this.actions$\r\n .pipe(\r\n ofActionSuccessful(\r\n GatewayLaunchApplicationShell,\r\n GatewaySetAppSessionShell,\r\n GatewayRestoreBrowserHandoffShell,\r\n ),\r\n )\r\n .subscribe(() => this.store.dispatch(new LoadDelegationCandidates()));\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Selectors\r\n // ---------------------------------------------------------------------------\r\n\r\n @Selector()\r\n static getActive(\r\n state: DelegationSessionStateModel,\r\n ): ActiveDelegationSession | null {\r\n return state.active;\r\n }\r\n\r\n @Selector()\r\n static getCandidates(state: DelegationSessionStateModel): DelegationRow[] {\r\n return state.candidates;\r\n }\r\n\r\n @Selector()\r\n static getCandidatesTotalCount(state: DelegationSessionStateModel): number {\r\n return state.candidatesTotalCount;\r\n }\r\n\r\n @Selector()\r\n static isDelegated(state: DelegationSessionStateModel): boolean {\r\n return !!state.active;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: DelegationSessionStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: DelegationSessionStateModel,\r\n ): Record<string, string | null | undefined> {\r\n return state.errors;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Actions\r\n // ---------------------------------------------------------------------------\r\n\r\n @Action(LoadDelegationCandidates)\r\n loadCandidates(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { page, pageSize, append }: LoadDelegationCandidates,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/user/activedelegations`,\r\n {\r\n params: new HttpParams().set('page', page).set('pageSize', pageSize),\r\n },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationSessionActionKey.LoadCandidates,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const next = (response.data?.items ?? []).filter(canStart);\r\n const current = append ? ctx.getState().candidates : [];\r\n const candidates = [...current, ...next].filter(\r\n (row, index, rows) =>\r\n rows.findIndex(\r\n (candidate) => candidate.delegationId === row.delegationId,\r\n ) === index,\r\n );\r\n const active = ctx.getState().active;\r\n if (\r\n active &&\r\n page === 1 &&\r\n !candidates.some(\r\n (row) => row.delegationId === active.delegation.delegationId,\r\n ) &&\r\n (response.data?.totalCount ?? 0) <= pageSize\r\n ) {\r\n queueMicrotask(() =>\r\n this.store.dispatch(new EndDelegationSession('ScopeChanged')),\r\n );\r\n }\r\n return {\r\n candidates,\r\n candidatesPage: response.data?.page ?? page,\r\n candidatesPageSize: response.data?.pageSize ?? pageSize,\r\n candidatesTotalCount: response.data?.totalCount ?? candidates.length,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(StartDelegationSession)\r\n start(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { delegation }: StartDelegationSession,\r\n ) {\r\n const previous = ctx.getState().active;\r\n return this.startSession(ctx, delegation, previous, 'StartSession');\r\n }\r\n\r\n private startSession(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n delegation: DelegationRow,\r\n previous: ActiveDelegationSession | null,\r\n reason: string,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationSessionStartResponse>>(\r\n `${BASE}/${delegation.delegationId}/session`,\r\n {},\r\n {\r\n headers: new HttpHeaders({ noMessage: 'true' }),\r\n },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationSessionActionKey.StartSession,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n this.vault.set(response.data.accessToken);\r\n const active: ActiveDelegationSession = {\r\n delegation,\r\n expiresAtUtc: response.data.expiresAtUtc,\r\n delegationVersion: response.data.delegationVersion,\r\n };\r\n this.scheduleExpiry(active);\r\n return { active };\r\n },\r\n }).pipe(\r\n switchMap(() =>\r\n from(\r\n Promise.resolve(\r\n this.runtime.onContextChanged({\r\n previous,\r\n current: ctx.getState().active,\r\n reason,\r\n }),\r\n ),\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n @Action(EndDelegationSession)\r\n end(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { reason }: EndDelegationSession,\r\n ) {\r\n // Client-local only — there is no server end-session endpoint (doc 05).\r\n const previous = ctx.getState().active;\r\n if (!previous && !this.vault.token()) {\r\n return EMPTY;\r\n }\r\n this.clearExpiry();\r\n this.vault.clear();\r\n ctx.patchState({\r\n active: null,\r\n ...(shouldClearCandidates(reason)\r\n ? { candidates: [], candidatesTotalCount: 0, candidatesPage: 1 }\r\n : {}),\r\n });\r\n return from(\r\n Promise.resolve(\r\n this.runtime.onContextChanged({ previous, current: null, reason }),\r\n ),\r\n ).pipe(\r\n switchMap(() =>\r\n shouldClearCandidates(reason)\r\n ? EMPTY\r\n : this.store.dispatch(new LoadDelegationCandidates()),\r\n ),\r\n );\r\n }\r\n\r\n @Action(SwitchDelegationSession)\r\n switch(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { delegation }: SwitchDelegationSession,\r\n ) {\r\n const previous = ctx.getState().active;\r\n return this.startSession(ctx, delegation, previous, 'SwitchSession');\r\n }\r\n\r\n private scheduleExpiry(active: ActiveDelegationSession): void {\r\n this.clearExpiry();\r\n const delay = Math.max(0, Date.parse(active.expiresAtUtc) - Date.now());\r\n this.expiryTimer = setTimeout(\r\n () => this.store.dispatch(new EndDelegationSession('Expired')),\r\n delay,\r\n );\r\n }\r\n\r\n private clearExpiry(): void {\r\n if (this.expiryTimer !== null) {\r\n clearTimeout(this.expiryTimer);\r\n this.expiryTimer = null;\r\n }\r\n }\r\n}\r\n","import { computed, inject, Injectable } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport { finalize, Observable, shareReplay } from 'rxjs';\r\nimport { DelegationPromptReceiptService } from '../../runtime/delegation-prompt-receipts';\r\nimport {\r\n EndDelegationSession,\r\n LoadDelegationCandidates,\r\n StartDelegationSession,\r\n SwitchDelegationSession,\r\n} from './delegation-session.actions';\r\nimport {\r\n DelegationSessionActionKey,\r\n DelegationSessionInvalidationReason,\r\n DelegationSessionStateModel,\r\n} from './delegation-session.model';\r\nimport { DelegationSessionState } from './delegation-session.state';\r\nimport { DelegationRow } from '../delegations/delegations.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationSessionFacade {\r\n private readonly store = inject(Store);\r\n private readonly promptReceipts = inject(DelegationPromptReceiptService);\r\n private endInFlight: Observable<unknown> | null = null;\r\n\r\n // ---------------------------------------------------------------------------\r\n // Data slices\r\n // ---------------------------------------------------------------------------\r\n readonly active = select(DelegationSessionState.getActive);\r\n readonly candidates = select(DelegationSessionState.getCandidates);\r\n readonly candidatesTotalCount = select(\r\n DelegationSessionState.getCandidatesTotalCount,\r\n );\r\n readonly isDelegated = select(DelegationSessionState.isDelegated);\r\n\r\n private readonly loadingActive = select(\r\n DelegationSessionState.getLoadingActive,\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Derived (interceptor + topbar)\r\n // ---------------------------------------------------------------------------\r\n /** On-behalf-of (delegator). */\r\n readonly onBehalfOf = computed(\r\n () => this.active()?.delegation.delegator ?? null,\r\n );\r\n /** Executed-by (actual logged-in / delegated user). */\r\n readonly executedBy = computed(\r\n () => this.active()?.delegation.delegatedUser ?? null,\r\n );\r\n readonly hasCandidates = computed(() => this.candidates().length > 0);\r\n readonly hasMoreCandidates = computed(\r\n () => this.candidates().length < this.candidatesTotalCount(),\r\n );\r\n\r\n readonly isStarting = computed(() =>\r\n this.loadingActive().includes(DelegationSessionActionKey.StartSession),\r\n );\r\n readonly isLoadingCandidates = computed(() =>\r\n this.loadingActive().includes(DelegationSessionActionKey.LoadCandidates),\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Dispatchers\r\n // ---------------------------------------------------------------------------\r\n loadCandidates(page = 1, pageSize = 25, append = false) {\r\n return this.store.dispatch(\r\n new LoadDelegationCandidates(page, pageSize, append),\r\n );\r\n }\r\n loadMoreCandidates() {\r\n const state = this.store.selectSnapshot<DelegationSessionStateModel>(\r\n (snapshot) => snapshot.delegationSession,\r\n );\r\n if (!state || state.candidates.length >= state.candidatesTotalCount) {\r\n return this.store.dispatch([]);\r\n }\r\n return this.loadCandidates(\r\n state.candidatesPage + 1,\r\n state.candidatesPageSize,\r\n true,\r\n );\r\n }\r\n claimPromptCandidates(candidates: DelegationRow[]) {\r\n return this.promptReceipts.claimUnseen(candidates);\r\n }\r\n startSession(delegation: DelegationRow) {\r\n return this.store.dispatch(new StartDelegationSession(delegation));\r\n }\r\n switchSession(delegation: DelegationRow) {\r\n return this.store.dispatch(new SwitchDelegationSession(delegation));\r\n }\r\n endSession(reason: DelegationSessionInvalidationReason = 'Manual') {\r\n if (this.endInFlight) {\r\n return this.endInFlight;\r\n }\r\n const operation = this.store\r\n .dispatch(new EndDelegationSession(reason))\r\n .pipe(\r\n finalize(() => (this.endInFlight = null)),\r\n shareReplay({ bufferSize: 1, refCount: false }),\r\n );\r\n this.endInFlight = operation;\r\n return operation;\r\n }\r\n}\r\n","import type {\r\n EntityData,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport type { DelegationParty } from '../../store/delegations/delegations.model';\r\n\r\nexport function toDelegationUserValue(\r\n party: DelegationParty | null | undefined,\r\n): EntityUserValue {\r\n const displayName = party?.displayName?.trim() || party?.email?.trim() || '';\r\n\r\n return {\r\n id: party?.userId,\r\n displayName,\r\n email: party?.email ?? undefined,\r\n };\r\n}\r\n\r\nexport function toDelegationUserEntity(\r\n party: DelegationParty | null | undefined,\r\n options: { showEmail?: boolean; label?: string } = {},\r\n): EntityData {\r\n return {\r\n name: options.label ?? '',\r\n viewType: 'User',\r\n value: toDelegationUserValue(party),\r\n configuration: {\r\n hideLabel: !options.label,\r\n showDisplayName: true,\r\n showEmail: options.showEmail ?? true,\r\n },\r\n };\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\n/**\r\n * Confirmation dialog before starting (or switching to) a delegated session.\r\n * Calls the facade, which POSTs to `delegationToken/{id}` and stores the raw\r\n * token in memory only.\r\n */\r\n@Component({\r\n selector: 'mt-start-session-dialog',\r\n imports: [CommonModule, Button, EntityPreview, TranslocoDirective],\r\n templateUrl: './start-session-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class StartSessionDialog {\r\n readonly delegation = input.required<DelegationRow>();\r\n readonly intent = input<'start' | 'switch'>('start');\r\n\r\n private readonly ref: ModalRef = inject(ModalRef);\r\n private readonly facade = inject(DelegationSessionFacade);\r\n private readonly toast = inject(ToastService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n protected readonly isBusy = this.facade.isStarting;\r\n\r\n protected readonly bodyKey = computed(() =>\r\n this.intent() === 'switch'\r\n ? 'delegations.session.switchConfirmBody'\r\n : 'delegations.session.startConfirmBody',\r\n );\r\n protected readonly confirmLabelKey = computed(() =>\r\n this.intent() === 'switch'\r\n ? 'delegations.action.switchSession'\r\n : 'delegations.action.startSession',\r\n );\r\n protected readonly successMessageKey = computed(() =>\r\n this.intent() === 'switch'\r\n ? 'delegations.session.switched'\r\n : 'delegations.session.started',\r\n );\r\n\r\n protected userEntity(party: DelegationRow['delegator']) {\r\n return toDelegationUserEntity(party, { showEmail: false });\r\n }\r\n\r\n confirm(): void {\r\n const row = this.delegation();\r\n const op$ =\r\n this.intent() === 'switch'\r\n ? this.facade.switchSession(row)\r\n : this.facade.startSession(row);\r\n op$.subscribe({\r\n next: () => {\r\n this.toast.success(this.transloco.translate(this.successMessageKey()));\r\n this.ref.close(true);\r\n },\r\n error: () => {\r\n /* error surfaced via shared toast pipeline; keep dialog open */\r\n },\r\n });\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col gap-4 p-2\">\r\n <div class=\"flex items-start gap-3\">\r\n <div class=\"flex flex-col min-w-0\">\r\n <mt-entity-preview\r\n [data]=\"userEntity(delegation().delegator)\"\r\n ></mt-entity-preview>\r\n </div>\r\n </div>\r\n\r\n <p class=\"text-sm text-surface-600 leading-relaxed\">\r\n {{ t(bodyKey()) }}\r\n </p>\r\n\r\n <div class=\"flex justify-end gap-2 pt-2 border-t border-surface-200\">\r\n <mt-button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n [label]=\"t('delegations.common.cancel')\"\r\n [disabled]=\"isBusy()\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n <mt-button\r\n color=\"primary\"\r\n icon=\"user.users-check\"\r\n [label]=\"t(confirmLabelKey())\"\r\n [loading]=\"isBusy()\"\r\n (click)=\"confirm()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\n/**\r\n * Post-login candidate prompt. It intentionally only lets the user choose a\r\n * delegation; the existing StartSessionDialog still performs explicit consent.\r\n */\r\n@Component({\r\n selector: 'mt-delegation-candidates-prompt-dialog',\r\n imports: [CommonModule, Button, EntityPreview, Icon, TranslocoDirective],\r\n templateUrl: './delegation-candidates-prompt-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationCandidatesPromptDialog {\r\n readonly candidates = input.required<DelegationRow[]>();\r\n\r\n private readonly ref: ModalRef = inject(ModalRef);\r\n\r\n protected userEntity(party: DelegationRow['delegator']) {\r\n return toDelegationUserEntity(party, { showEmail: false });\r\n }\r\n\r\n protected select(row: DelegationRow): void {\r\n this.ref.close(row);\r\n }\r\n\r\n protected close(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col gap-4 p-2\">\r\n <p class=\"text-sm leading-relaxed text-surface-600\">\r\n {{ t(\"delegations.session.promptBody\") }}\r\n </p>\r\n\r\n <div class=\"flex max-h-80 flex-col gap-2 overflow-y-auto pr-1\">\r\n @for (cand of candidates(); track cand.delegationId) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center justify-between gap-3 rounded-2xl border border-solid border-surface-200 bg-surface-0 px-3 py-3 text-start transition-colors hover:border-primary-300 hover:bg-primary-50/50 focus-visible:border-primary-400 focus-visible:outline-none\"\r\n [attr.aria-label]=\"\r\n t('delegations.session.promptStartAria', {\r\n delegatorName: cand.delegator.displayName,\r\n })\r\n \"\r\n (click)=\"select(cand)\"\r\n >\r\n <span class=\"flex min-w-0 items-center gap-3\">\r\n <mt-entity-preview\r\n [data]=\"userEntity(cand.delegator)\"\r\n ></mt-entity-preview>\r\n </span>\r\n <span\r\n class=\"inline-flex shrink-0 items-center gap-1.5 text-sm font-medium text-primary\"\r\n >\r\n <span class=\"hidden sm:inline\">\r\n {{ t(\"delegations.action.startSession\") }}\r\n </span>\r\n <mt-icon icon=\"arrow.arrow-right\" class=\"text-base\"></mt-icon>\r\n </span>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"flex justify-end border-t border-surface-200 pt-3\">\r\n <mt-button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n [label]=\"t('delegations.common.close')\"\r\n (click)=\"close()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Chip } from '@masterteam/components/chip';\r\nimport { DelegationEffectiveStatus } from '../../../store/delegations/delegations.model';\r\n\r\ninterface StatusVisual {\r\n i18nKey: string;\r\n styleClass: string;\r\n}\r\n\r\nconst STATUS_VISUAL: Record<\r\n DelegationEffectiveStatus | 'InactiveToday',\r\n StatusVisual\r\n> = {\r\n Active: {\r\n i18nKey: 'delegations.status.active',\r\n styleClass: 'mt-status-chip mt-status-chip--active',\r\n },\r\n Scheduled: {\r\n i18nKey: 'delegations.status.scheduled',\r\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\r\n },\r\n PendingApproval: {\r\n i18nKey: 'delegations.status.pendingApproval',\r\n styleClass: 'mt-status-chip mt-status-chip--pending',\r\n },\r\n InactiveToday: {\r\n i18nKey: 'delegations.status.inactiveToday',\r\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\r\n },\r\n Expired: {\r\n i18nKey: 'delegations.status.expired',\r\n styleClass: 'mt-status-chip mt-status-chip--expired',\r\n },\r\n Rejected: {\r\n i18nKey: 'delegations.status.rejected',\r\n styleClass: 'mt-status-chip mt-status-chip--rejected',\r\n },\r\n Cancelled: {\r\n i18nKey: 'delegations.status.cancelled',\r\n styleClass: 'mt-status-chip mt-status-chip--cancelled',\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'mt-delegation-status-chip',\r\n standalone: true,\r\n imports: [Chip, TranslocoDirective],\r\n template: `\r\n <ng-container *transloco=\"let t\">\r\n @let v = visual();\r\n <mt-chip [label]=\"t(v.i18nKey)\" [styleClass]=\"v.styleClass\"></mt-chip>\r\n </ng-container>\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: inline-flex;\r\n }\r\n :host ::ng-deep .mt-status-chip {\r\n font-weight: 500;\r\n font-size: 0.75rem;\r\n border-radius: 9999px;\r\n padding-inline: 0.625rem;\r\n padding-block: 0.125rem;\r\n }\r\n :host ::ng-deep .mt-status-chip--active {\r\n background-color: rgb(220 252 231);\r\n color: rgb(22 101 52);\r\n }\r\n :host ::ng-deep .mt-status-chip--scheduled {\r\n background-color: rgb(219 234 254);\r\n color: rgb(30 64 175);\r\n }\r\n :host ::ng-deep .mt-status-chip--pending {\r\n background-color: rgb(254 249 195);\r\n color: rgb(133 77 14);\r\n }\r\n :host ::ng-deep .mt-status-chip--expired {\r\n background-color: rgb(243 244 246);\r\n color: rgb(75 85 99);\r\n }\r\n :host ::ng-deep .mt-status-chip--rejected {\r\n background-color: rgb(254 226 226);\r\n color: rgb(153 27 27);\r\n }\r\n :host ::ng-deep .mt-status-chip--cancelled {\r\n background-color: rgb(229 231 235);\r\n color: rgb(55 65 81);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--active {\r\n background-color: rgba(34, 197, 94, 0.2);\r\n color: rgb(134 239 172);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--scheduled {\r\n background-color: rgba(59, 130, 246, 0.2);\r\n color: rgb(147 197 253);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--pending {\r\n background-color: rgba(234, 179, 8, 0.2);\r\n color: rgb(253 224 71);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--expired {\r\n background-color: rgba(148, 163, 184, 0.2);\r\n color: rgb(203 213 225);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--rejected {\r\n background-color: rgba(239, 68, 68, 0.2);\r\n color: rgb(252 165 165);\r\n }\r\n :host-context(.dark) ::ng-deep .mt-status-chip--cancelled {\r\n background-color: rgba(148, 163, 184, 0.15);\r\n color: rgb(203 213 225);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class DelegationStatusChip {\r\n readonly status = input.required<DelegationEffectiveStatus>();\r\n readonly reasonCode = input<string | null | undefined>(null);\r\n\r\n protected readonly visual = computed<StatusVisual>(\r\n () =>\r\n STATUS_VISUAL[\r\n this.status() === 'Scheduled' && this.reasonCode() === 'InactiveToday'\r\n ? 'InactiveToday'\r\n : this.status()\r\n ] ?? STATUS_VISUAL.Scheduled,\r\n );\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\r\n\r\n/**\r\n * Embeddable delegation menu content (doc 05, 09): renders the candidate /\r\n * active-session rows and the start / switch / end actions, with no trigger of\r\n * its own. Designed to be dropped inside a host menu (e.g. the user-avatar\r\n * dropdown) or the topbar popover. Reads the shared `DelegationSessionFacade`\r\n * signals; candidate loading + the post-login prompt stay in the always-mounted\r\n * `TopbarDelegationMenu` controller.\r\n *\r\n * Emits `closeRequested` after any action so the host overlay can dismiss.\r\n */\r\n@Component({\r\n selector: 'mt-delegation-menu-panel',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Avatar,\r\n Icon,\r\n RouterLink,\r\n TranslocoDirective,\r\n DelegationStatusChip,\r\n ],\r\n templateUrl: './delegation-menu-panel.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DelegationMenuPanel {\r\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\r\n readonly managePath = input<string>('/delegations');\r\n readonly showManageLink = input<boolean>(true);\r\n readonly closeRequested = output<void>();\r\n\r\n private readonly facade = inject(DelegationSessionFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n protected readonly active = this.facade.active;\r\n protected readonly candidates = this.facade.candidates;\r\n protected readonly hasCandidates = this.facade.hasCandidates;\r\n protected readonly hasMoreCandidates = this.facade.hasMoreCandidates;\r\n protected readonly isLoadingCandidates = this.facade.isLoadingCandidates;\r\n protected readonly onBehalfOf = this.facade.onBehalfOf;\r\n protected readonly executedBy = this.facade.executedBy;\r\n\r\n protected readonly mode = computed<'hidden' | 'candidates' | 'active'>(() => {\r\n if (this.active()) return 'active';\r\n if (this.hasCandidates()) return 'candidates';\r\n return 'hidden';\r\n });\r\n\r\n /** Two-letter initials for a delegator avatar (matches the user-menu pattern). */\r\n protected initials(\r\n party: DelegationRow['delegator'] | null | undefined,\r\n ): string {\r\n const name = party?.displayName?.trim() || party?.email?.trim() || '';\r\n const parts = name.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return '?';\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n }\r\n\r\n protected start(row: DelegationRow, event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closeRequested.emit();\r\n this.openConfirm(row, 'start');\r\n }\r\n\r\n protected switchTo(row: DelegationRow, event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closeRequested.emit();\r\n this.openConfirm(row, 'switch');\r\n }\r\n\r\n protected endSession(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.closeRequested.emit();\r\n this.facade.endSession('Manual').subscribe();\r\n }\r\n\r\n protected onManage(): void {\r\n this.closeRequested.emit();\r\n }\r\n\r\n protected loadMore(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.facade.loadMoreCandidates().subscribe();\r\n }\r\n\r\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch'): void {\r\n this.modal.openModal(StartSessionDialog, 'dialog', {\r\n header: this.transloco.translate(\r\n intent === 'switch'\r\n ? 'delegations.action.switchSession'\r\n : 'delegations.action.startSession',\r\n ),\r\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row, intent },\r\n });\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n @if (mode() !== \"hidden\") {\r\n <div class=\"flex w-full flex-col\">\r\n @if (mode() === \"active\" && active(); as session) {\r\n <!-- Active session -->\r\n <div class=\"flex items-center gap-3 border-b border-surface px-4 py-3\">\r\n <mt-avatar\r\n [label]=\"initials(onBehalfOf())\"\r\n shape=\"circle\"\r\n styleClass=\"!size-9 !text-sm !bg-primary-100 !text-primary-700\"\r\n ></mt-avatar>\r\n <div class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"text-[0.625rem] font-medium uppercase text-surface-500\"\r\n >\r\n {{ t(\"delegations.session.actingOnBehalfOf\") }}\r\n </span>\r\n <span class=\"truncate text-sm font-semibold text-surface-900\">\r\n {{ onBehalfOf()?.displayName }}\r\n </span>\r\n <span class=\"truncate text-xs text-surface-500\">\r\n {{\r\n t(\"delegations.session.executedBy\", {\r\n actualUserName: executedBy()?.displayName,\r\n })\r\n }}\r\n </span>\r\n </div>\r\n <mt-delegation-status-chip\r\n status=\"Active\"\r\n ></mt-delegation-status-chip>\r\n </div>\r\n\r\n <div class=\"flex flex-col p-1.5\">\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium text-surface-700 hover:bg-surface-100\"\r\n (click)=\"endSession($event)\"\r\n >\r\n <mt-icon icon=\"arrow.arrow-left\" styleClass=\"text-base\"></mt-icon>\r\n <span>{{ t(\"delegations.action.endSession\") }}</span>\r\n </button>\r\n </div>\r\n\r\n @if (candidates().length > 1) {\r\n <div class=\"border-t border-surface p-1.5\">\r\n <div\r\n class=\"px-2 pb-1 text-[0.625rem] font-medium uppercase text-surface-400\"\r\n >\r\n {{ t(\"delegations.session.switchToAnother\") }}\r\n </div>\r\n @for (cand of candidates(); track cand.delegationId) {\r\n @if (cand.delegationId !== session.delegation.delegationId) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-3 rounded-lg px-2 py-2 text-start hover:bg-surface-100\"\r\n [attr.aria-label]=\"\r\n t('delegations.action.switchSession') +\r\n ': ' +\r\n cand.delegator.displayName\r\n \"\r\n (click)=\"switchTo(cand, $event)\"\r\n >\r\n <mt-avatar\r\n [label]=\"initials(cand.delegator)\"\r\n shape=\"circle\"\r\n styleClass=\"!size-8 !text-xs !bg-surface-100 !text-surface-600\"\r\n ></mt-avatar>\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-sm font-medium text-surface-800\"\r\n >\r\n {{ cand.delegator.displayName }}\r\n </span>\r\n <mt-icon\r\n icon=\"arrow.switch-horizontal-01\"\r\n styleClass=\"text-base text-surface-400\"\r\n ></mt-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n } @else if (mode() === \"candidates\") {\r\n <!-- Candidates available -->\r\n <div class=\"border-b border-surface px-4 py-3\">\r\n <div class=\"text-sm font-semibold text-surface-900\">\r\n {{ t(\"delegations.session.youCanActAs\") }}\r\n </div>\r\n <div class=\"mt-0.5 text-xs text-surface-500\">\r\n {{ t(\"delegations.session.chooseDelegatorHint\") }}\r\n </div>\r\n </div>\r\n <div class=\"flex max-h-72 flex-col overflow-y-auto p-1.5\">\r\n @for (cand of candidates(); track cand.delegationId) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-3 rounded-lg px-2 py-2 text-start hover:bg-surface-100\"\r\n [attr.aria-label]=\"\r\n t('delegations.action.startSession') +\r\n ': ' +\r\n cand.delegator.displayName\r\n \"\r\n (click)=\"start(cand, $event)\"\r\n >\r\n <mt-avatar\r\n [label]=\"initials(cand.delegator)\"\r\n shape=\"circle\"\r\n styleClass=\"!size-8 !text-xs !bg-primary-100 !text-primary-700\"\r\n ></mt-avatar>\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-sm font-medium text-surface-800\">\r\n {{ cand.delegator.displayName }}\r\n </span>\r\n @if (cand.delegator.email) {\r\n <span class=\"truncate text-xs text-surface-500\">\r\n {{ cand.delegator.email }}\r\n </span>\r\n }\r\n </span>\r\n <mt-icon\r\n icon=\"arrow.arrow-right\"\r\n styleClass=\"text-base text-surface-400\"\r\n ></mt-icon>\r\n </button>\r\n }\r\n @if (hasMoreCandidates()) {\r\n <button\r\n type=\"button\"\r\n class=\"mx-2 my-1 rounded-lg px-3 py-2 text-sm font-medium text-primary hover:bg-primary-50 disabled:opacity-60\"\r\n [disabled]=\"isLoadingCandidates()\"\r\n (click)=\"loadMore($event)\"\r\n >\r\n {{ t(\"delegations.session.loadMore\") }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n @if (showManageLink()) {\r\n <div class=\"border-t border-surface p-1.5\">\r\n <a\r\n [routerLink]=\"managePath()\"\r\n (click)=\"onManage()\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-sm text-surface-700 hover:bg-surface-100\"\r\n >\r\n <mt-icon\r\n icon=\"general.settings-02\"\r\n styleClass=\"text-base\"\r\n ></mt-icon>\r\n <span>{{ t(\"delegations.session.manage\") }}</span>\r\n </a>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Popover } from 'primeng/popover';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\r\nimport DelegationCandidatesPromptDialog from '../delegation-candidates-prompt-dialog/delegation-candidates-prompt-dialog';\r\nimport { DelegationMenuPanel } from '../delegation-menu-panel/delegation-menu-panel';\r\n\r\n/**\r\n * Topbar surface + controller for the delegation runtime (doc 05, 09).\r\n *\r\n * Always-mounted controller: loads the delegation candidates and shows the\r\n * post-login prompt. Visible trigger states:\r\n * - hidden — no candidates, no active session;\r\n * - candidates — icon button (matches sibling topbar icons) + count badge;\r\n * - active — delegator avatar + \"Acting on behalf of {delegator}\".\r\n *\r\n * The popover content is the shared {@link DelegationMenuPanel}, which can also\r\n * be embedded directly in a host menu (e.g. the user-avatar dropdown). Set\r\n * `headless` to keep this controller mounted (loading + prompt) while rendering\r\n * the panel elsewhere.\r\n */\r\n@Component({\r\n selector: 'mt-topbar-delegation-menu',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Avatar,\r\n Icon,\r\n Popover,\r\n TranslocoDirective,\r\n DelegationMenuPanel,\r\n ],\r\n templateUrl: './topbar-delegation-menu.html',\r\n styleUrls: ['./topbar-delegation-menu.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TopbarDelegationMenu implements OnInit {\r\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\r\n readonly managePath = input<string>('/delegations');\r\n readonly compact = input<boolean>(false);\r\n readonly showManageLink = input<boolean>(true);\r\n readonly promptOnCandidates = input<boolean>(true);\r\n /**\r\n * Render no topbar UI at all (controller only) while keeping candidate\r\n * loading + the post-login prompt. Use when the menu is surfaced elsewhere —\r\n * e.g. embedded in the user-avatar dropdown via {@link DelegationMenuPanel}.\r\n */\r\n readonly headless = input<boolean>(false);\r\n\r\n private readonly facade = inject(DelegationSessionFacade);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n protected readonly popover = viewChild<Popover>('popover');\r\n\r\n protected readonly active = this.facade.active;\r\n protected readonly candidates = this.facade.candidates;\r\n protected readonly hasCandidates = this.facade.hasCandidates;\r\n protected readonly onBehalfOf = this.facade.onBehalfOf;\r\n protected readonly executedBy = this.facade.executedBy;\r\n protected readonly popoverOpen = signal(false);\r\n private promptPending = false;\r\n private promptRefreshQueued = false;\r\n private promptFlowOpen = false;\r\n\r\n protected readonly mode = computed<'hidden' | 'candidates' | 'active'>(() => {\r\n if (this.active()) return 'active';\r\n if (this.hasCandidates()) return 'candidates';\r\n return 'hidden';\r\n });\r\n\r\n constructor() {\r\n // The receipt service atomically persists opaque delegation/version hashes\r\n // before opening, so recreation, refresh, and concurrent loads cannot\r\n // reopen the same prompt.\r\n effect(() => {\r\n const candidates = this.candidates();\r\n if (!this.promptOnCandidates() || this.active() || !candidates.length) {\r\n return;\r\n }\r\n this.checkPromptCandidates(candidates);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.facade.loadCandidates();\r\n }\r\n\r\n /** Two-letter initials for a delegator avatar (matches the user-menu pattern). */\r\n protected initials(\r\n party: DelegationRow['delegator'] | null | undefined,\r\n ): string {\r\n const name = party?.displayName?.trim() || party?.email?.trim() || '';\r\n const parts = name.split(/\\s+/).filter(Boolean);\r\n if (!parts.length) return '?';\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n }\r\n\r\n togglePopover(event: Event): void {\r\n this.popover()?.toggle(event);\r\n }\r\n\r\n closePopover(): void {\r\n this.popover()?.hide();\r\n }\r\n\r\n private checkPromptCandidates(candidates: DelegationRow[]): void {\r\n if (this.promptPending || this.promptFlowOpen) {\r\n this.promptRefreshQueued = true;\r\n return;\r\n }\r\n\r\n this.promptPending = true;\r\n void this.facade\r\n .claimPromptCandidates(candidates)\r\n .then((unseen) => {\r\n if (unseen.length && !this.active()) {\r\n this.openCandidatesPrompt(unseen);\r\n }\r\n })\r\n .finally(() => {\r\n this.promptPending = false;\r\n if (this.promptRefreshQueued) {\r\n this.promptRefreshQueued = false;\r\n const latest = this.candidates();\r\n if (this.promptOnCandidates() && !this.active() && latest.length) {\r\n this.checkPromptCandidates(latest);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch') {\r\n return this.modal.openModal(StartSessionDialog, 'dialog', {\r\n header: this.transloco.translate(\r\n intent === 'switch'\r\n ? 'delegations.action.switchSession'\r\n : 'delegations.action.startSession',\r\n ),\r\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row, intent },\r\n });\r\n }\r\n\r\n private openCandidatesPrompt(candidates: DelegationRow[]): void {\r\n this.promptFlowOpen = true;\r\n const ref = this.modal.openModal(\r\n DelegationCandidatesPromptDialog,\r\n 'dialog',\r\n {\r\n header: this.transloco.translate('delegations.session.availableTitle'),\r\n styleClass: '!w-[min(96vw,34rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { candidates },\r\n },\r\n );\r\n\r\n ref.onClose.subscribe((row: DelegationRow | null | undefined) => {\r\n if (row) {\r\n this.openConfirm(row, 'start').onClose.subscribe(() =>\r\n this.finishPromptFlow(),\r\n );\r\n } else {\r\n this.finishPromptFlow();\r\n }\r\n });\r\n }\r\n\r\n private finishPromptFlow(): void {\r\n this.promptFlowOpen = false;\r\n if (!this.promptRefreshQueued) return;\r\n this.promptRefreshQueued = false;\r\n const latest = this.candidates();\r\n if (this.promptOnCandidates() && !this.active() && latest.length) {\r\n this.checkPromptCandidates(latest);\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <!-- Headless = controller only (no topbar UI); the menu is surfaced in the\r\n host user dropdown via <mt-delegation-menu-panel>. -->\r\n @if (!headless() && mode() !== \"hidden\") {\r\n @if (mode() === \"active\") {\r\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\">\r\n {{\r\n t(\"delegations.session.banner\", {\r\n delegatorName: onBehalfOf()?.displayName,\r\n })\r\n }}.\r\n {{\r\n t(\"delegations.session.executedBy\", {\r\n actualUserName: executedBy()?.displayName,\r\n })\r\n }}\r\n </span>\r\n }\r\n\r\n <div class=\"mt-delegation-trigger flex items-center\">\r\n @if (mode() === \"active\") {\r\n <!-- Active: show the delegator like a user identity, with a switcher caret -->\r\n <button\r\n type=\"button\"\r\n class=\"mt-delegation-trigger__button mt-delegation-trigger__button--active flex min-w-0 max-w-full cursor-pointer items-center gap-2 rounded-full p-1 pe-2 text-current\"\r\n [attr.aria-label]=\"\r\n t('delegations.session.banner', {\r\n delegatorName: onBehalfOf()?.displayName,\r\n }) +\r\n '. ' +\r\n t('delegations.session.executedBy', {\r\n actualUserName: executedBy()?.displayName,\r\n })\r\n \"\r\n [attr.aria-expanded]=\"popoverOpen()\"\r\n aria-haspopup=\"dialog\"\r\n (click)=\"togglePopover($event)\"\r\n >\r\n <span class=\"relative shrink-0\">\r\n <mt-avatar\r\n [label]=\"initials(onBehalfOf())\"\r\n shape=\"circle\"\r\n styleClass=\"!size-7 !text-[0.7rem] !bg-primary-100 !text-primary-700\"\r\n ></mt-avatar>\r\n <span\r\n class=\"absolute -bottom-0.5 -end-0.5 flex size-3.5 items-center justify-center rounded-full bg-emerald-500 ring-2 ring-white\"\r\n aria-hidden=\"true\"\r\n >\r\n <mt-icon\r\n icon=\"user.users-check\"\r\n styleClass=\"text-[0.55rem] text-white\"\r\n ></mt-icon>\r\n </span>\r\n </span>\r\n @if (!compact()) {\r\n <span\r\n class=\"mt-delegation-trigger__label hidden min-w-0 flex-col text-start leading-tight md:flex\"\r\n >\r\n <span class=\"text-[0.625rem] font-medium uppercase opacity-60\">\r\n {{ t(\"delegations.session.actingOnBehalfOf\") }}\r\n </span>\r\n <span class=\"truncate text-sm font-semibold\">\r\n {{ onBehalfOf()?.displayName }}\r\n </span>\r\n </span>\r\n }\r\n <mt-icon\r\n icon=\"arrow.chevron-down\"\r\n styleClass=\"text-sm opacity-70\"\r\n ></mt-icon>\r\n </button>\r\n } @else {\r\n <!-- Candidates: plain icon button matching the other topbar icons -->\r\n <button\r\n type=\"button\"\r\n class=\"mt-delegation-trigger__icon relative flex size-9 cursor-pointer items-center justify-center rounded-full text-current\"\r\n [attr.aria-label]=\"t('delegations.session.availableTitle')\"\r\n [attr.aria-expanded]=\"popoverOpen()\"\r\n aria-haspopup=\"dialog\"\r\n (click)=\"togglePopover($event)\"\r\n >\r\n <mt-icon icon=\"user.users-plus\" styleClass=\"text-xl\"></mt-icon>\r\n @if (candidates().length > 0) {\r\n <span\r\n class=\"absolute -top-0.5 -end-0.5 inline-flex min-w-[1.05rem] items-center justify-center rounded-full bg-primary px-1 text-[0.625rem] font-bold leading-4 text-white ring-2 ring-white\"\r\n >\r\n {{ candidates().length }}\r\n </span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <p-popover\r\n #popover\r\n [pt]=\"{ content: { class: 'p-0!' } }\"\r\n (onShow)=\"popoverOpen.set(true)\"\r\n (onHide)=\"popoverOpen.set(false)\"\r\n >\r\n <div class=\"w-72 max-w-[88vw]\">\r\n <mt-delegation-menu-panel\r\n [managePath]=\"managePath()\"\r\n [showManageLink]=\"showManageLink()\"\r\n (closeRequested)=\"closePopover()\"\r\n ></mt-delegation-menu-panel>\r\n </div>\r\n </p-popover>\r\n }\r\n</ng-container>\r\n","import {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n ApproveDelegationRequest,\r\n CreateDelegationLegacyRequest,\r\n CreateDelegationV2Request,\r\n DelegationListQuery,\r\n DelegationScopePreviewRequest,\r\n RejectDelegationRequest,\r\n UpdateDelegationLegacyRequest,\r\n UpdateDelegationV2Request,\r\n} from './delegations.model';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Lists / detail\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class GetMyDelegations {\r\n static readonly type = '[Delegations] Get My Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetAssignedDelegations {\r\n static readonly type = '[Delegations] Get Assigned Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetApprovalDelegations {\r\n static readonly type = '[Delegations] Get Approval Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetAdminDelegations {\r\n static readonly type = '[Delegations] Get Admin Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetActiveAssignedDelegations {\r\n static readonly type = '[Delegations] Get Active Assigned Delegations';\r\n constructor(public query: DelegationListQuery = {}) {}\r\n}\r\n\r\nexport class GetDelegationDetail {\r\n static readonly type = '[Delegations] Get Delegation Detail';\r\n constructor(\r\n public id: number,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class ClearDelegationDetail {\r\n static readonly type = '[Delegations] Clear Delegation Detail';\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Scope\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class GetScopeOptions {\r\n static readonly type = '[Delegations] Get Scope Options';\r\n constructor(\r\n public delegatorUserId?: string,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class PreviewScope {\r\n static readonly type = '[Delegations] Preview Scope';\r\n constructor(\r\n public request: DelegationScopePreviewRequest,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class ClearScopePreview {\r\n static readonly type = '[Delegations] Clear Scope Preview';\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Create / edit (legacy + v2)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class CreateDelegationLegacy {\r\n static readonly type = '[Delegations] Create Delegation (legacy)';\r\n constructor(public request: CreateDelegationLegacyRequest) {}\r\n}\r\n\r\nexport class CreateDelegationV2 {\r\n static readonly type = '[Delegations] Create Delegation (v2)';\r\n constructor(\r\n public request: CreateDelegationV2Request | AdminCreateDelegationV2Request,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\nexport class UpdateDelegationLegacy {\r\n static readonly type = '[Delegations] Update Delegation (legacy)';\r\n constructor(\r\n public id: number,\r\n public request: UpdateDelegationLegacyRequest,\r\n ) {}\r\n}\r\n\r\nexport class UpdateDelegationV2 {\r\n static readonly type = '[Delegations] Update Delegation (v2)';\r\n constructor(\r\n public id: number,\r\n public request: UpdateDelegationV2Request | AdminUpdateDelegationV2Request,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Decisions\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class ApproveDelegation {\r\n static readonly type = '[Delegations] Approve Delegation';\r\n constructor(\r\n public id: number,\r\n public request: ApproveDelegationRequest,\r\n ) {}\r\n}\r\n\r\nexport class RejectDelegation {\r\n static readonly type = '[Delegations] Reject Delegation';\r\n constructor(\r\n public id: number,\r\n public request: RejectDelegationRequest,\r\n ) {}\r\n}\r\n\r\nexport class CancelDelegation {\r\n static readonly type = '[Delegations] Cancel Delegation';\r\n constructor(\r\n public id: number,\r\n public rowVersion: string,\r\n public asAdmin: boolean = false,\r\n ) {}\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\n\n// ============================================================================\n// Status / approval / actions (doc 01, 16)\n// ============================================================================\n\nexport type DelegationEffectiveStatus =\n | 'PendingApproval'\n | 'Scheduled'\n | 'Active'\n | 'Expired'\n | 'Rejected'\n | 'Cancelled';\n\nexport type DelegationApprovalStatus =\n | 'NotRequired'\n | 'Pending'\n | 'Approved'\n | 'Rejected';\n\nexport type DelegationAllowedAction =\n | 'View'\n | 'Edit'\n | 'Approve'\n | 'Reject'\n | 'Cancel'\n | 'StartSession'\n | 'EndSession';\n\nexport type DelegationDayRuleMode = 'FullRange' | 'SpecificDays';\nexport type DelegationDisplayValue =\n | string\n | {\n ar?: string | null;\n en?: string | null;\n defaultAr?: string | null;\n defaultEn?: string | null;\n [locale: string]: unknown;\n }\n | null;\n\n// ============================================================================\n// Parties + row (doc 02)\n// ============================================================================\n\nexport interface DelegationParty {\n userId: string;\n displayName: string;\n email?: string | null;\n}\n\nexport interface DelegationApprovalInfo {\n requiresApproval: boolean;\n approvalStatus: DelegationApprovalStatus;\n}\n\nexport interface DelegationCancellationInfo {\n cancelledBy?: DelegationParty | null;\n cancelledAtUtc?: string | null;\n cancellationReason?: string | null;\n}\n\nexport interface DelegationRow {\n delegationId: number;\n delegator: DelegationParty;\n delegatedUser: DelegationParty;\n startsAtUtc: string;\n endsAtUtc: string;\n timeZoneId: string;\n dayRuleMode: DelegationDayRuleMode;\n specificDays: number[];\n effectiveStatus: DelegationEffectiveStatus;\n statusReasonCode: string;\n createdBy: DelegationParty;\n createdAtUtc: string;\n approval: DelegationApprovalInfo;\n cancellation: DelegationCancellationInfo;\n allowedActions: DelegationAllowedAction[];\n rowVersion: string;\n}\n\nexport interface DelegationPage<T> {\n items: T[];\n page: number;\n pageSize: number;\n totalCount: number;\n}\n\n// ============================================================================\n// Scope — grants based (doc 03, 04)\n// ============================================================================\n\nexport interface DelegationScopeTarget {\n applicationKey: string;\n targetType: string;\n targetKey: string;\n /** Backend-localized name (preferred display source in the new contract). */\n name?: DelegationDisplayValue;\n parentTargetType?: string | null;\n parentTargetKey?: string | null;\n parentDisplayName?: DelegationDisplayValue;\n parentLevelId?: number | null;\n legacyModuleId?: number | null;\n targetId?: number | null;\n levelId?: number | null;\n levelModuleId?: number | null;\n domainModuleId?: number | null;\n moduleKey?: string | null;\n permissionModuleType?: string | null;\n permissionTargetId?: number | null;\n isDelegable?: boolean;\n displayName?: DelegationDisplayValue;\n displayLabel?: DelegationDisplayValue;\n label?: DelegationDisplayValue;\n}\n\nexport interface DelegationScopeAction {\n applicationKey: string;\n operationKey: string;\n operationKind: string;\n /** Backend-localized name (preferred display source in the new contract). */\n name?: DelegationDisplayValue;\n displayName?: DelegationDisplayValue;\n displayLabel?: DelegationDisplayValue;\n operationDisplayName?: DelegationDisplayValue;\n operationLabel?: DelegationDisplayValue;\n label?: DelegationDisplayValue;\n permissionCommand?: string | null;\n businessActionCode?: string | null;\n isHighRisk?: boolean;\n isDelegable?: boolean;\n isDelegableSnapshot?: boolean;\n sortOrder?: number | null;\n}\n\nexport interface DelegationScopeFact {\n key?: string | null;\n code?: string | null;\n id?: string | number | null;\n displayName?: DelegationDisplayValue;\n displayLabel?: DelegationDisplayValue;\n label?: DelegationDisplayValue;\n [extra: string]: unknown;\n}\n\nexport interface DelegationGrant {\n /** Optional backend-provided stable grant identity; preferred for de-dup when present. */\n key?: string;\n applicationKey: string;\n target: DelegationScopeTarget;\n action: DelegationScopeAction;\n accessibilities: DelegationScopeFact[];\n dataFilters: DelegationScopeFact[];\n constraints: DelegationScopeFact[];\n}\n\nexport interface DelegationScopeSelection {\n grants: DelegationGrant[];\n metadata: Record<string, unknown>;\n}\n\nexport interface DelegationScopeCombinationRule {\n applicationKey?: string | null;\n targetType: string;\n targetKey: string;\n operationKey: string;\n accessibilityKeys?: string[] | null;\n dataFilterKeys?: string[] | null;\n constraintKeys?: string[] | null;\n [extra: string]: unknown;\n}\n\n/**\n * Legacy `scope/options` grouping kept only as a compatibility fallback. The\n * current FE selector contract is `permissions`.\n */\nexport interface DelegationScopeHierarchyTarget {\n target: DelegationScopeTarget;\n operations: DelegationScopeAction[];\n sortOrder?: number | null;\n}\n\nexport interface DelegationScopeHierarchyGroup {\n groupType: string;\n groupKey: string;\n displayName?: DelegationDisplayValue;\n levelId?: number | null;\n sortOrder?: number | null;\n targets: DelegationScopeHierarchyTarget[];\n}\n\n/**\n * New `scope/options` contract (doc 03): `permissions` is a Template -> Level ->\n * Module hierarchy where Level and Level Module are both selectable permission\n * surfaces, each carrying its own backend-filtered `operations`. `appAccessibility`\n * lists optional accessibility grants with backend-localized names.\n */\nexport interface DelegationScopeModuleNode {\n applicationKey: string;\n targetType: string; // 'LevelModule'\n targetKey: string;\n name?: DelegationDisplayValue;\n legacyModuleId?: number | null;\n levelId?: number | null;\n levelModuleId?: number | null;\n domainModuleId?: number | null;\n targetId?: number | null;\n moduleKey?: string | null;\n permissionModuleType?: string | null;\n permissionTargetId?: number | null;\n sortOrder?: number | null;\n operations?: DelegationScopeAction[] | null;\n}\n\nexport interface DelegationScopeLevelNode {\n applicationKey: string;\n targetType: string; // 'Level'\n targetKey: string;\n name?: DelegationDisplayValue;\n legacyModuleId?: number | null;\n levelId?: number | null;\n targetId?: number | null;\n permissionModuleType?: string | null;\n permissionTargetId?: number | null;\n sortOrder?: number | null;\n operations?: DelegationScopeAction[] | null;\n modules?: DelegationScopeModuleNode[] | null;\n}\n\nexport interface DelegationScopePermissionGroup {\n groupType: string; // 'Template'\n groupKey: string;\n name?: DelegationDisplayValue;\n templateId?: number | null;\n sortOrder?: number | null;\n levels?: DelegationScopeLevelNode[] | null;\n}\n\nexport interface DelegationScopeViewOperation extends DelegationScopeAction {\n selected?: boolean;\n isAvailable?: boolean;\n accessibilities?: DelegationScopeFact[] | null;\n dataFilters?: DelegationScopeFact[] | null;\n constraints?: DelegationScopeFact[] | null;\n}\n\nexport interface DelegationScopeViewModule extends Omit<\n DelegationScopeModuleNode,\n 'operations'\n> {\n isAvailable?: boolean;\n operations?: DelegationScopeViewOperation[] | null;\n}\n\nexport interface DelegationScopeViewLevel extends Omit<\n DelegationScopeLevelNode,\n 'modules' | 'operations'\n> {\n isAvailable?: boolean;\n operations?: DelegationScopeViewOperation[] | null;\n modules?: DelegationScopeViewModule[] | null;\n}\n\nexport interface DelegationScopeViewTemplate extends Omit<\n DelegationScopePermissionGroup,\n 'levels'\n> {\n isAvailable?: boolean;\n levels?: DelegationScopeViewLevel[] | null;\n}\n\nexport interface DelegationScopeView {\n templates?: DelegationScopeViewTemplate[] | null;\n}\n\nexport interface DelegationAppAccessibility {\n accessibilityGroupId?: number | null;\n applicationKey: string;\n accessibilityKey: string;\n name?: DelegationDisplayValue;\n labelKey?: string | null;\n}\n\nexport interface DelegationScopeOptions {\n permissions?: DelegationScopePermissionGroup[] | null;\n appAccessibility?: DelegationAppAccessibility[] | null;\n hierarchy?: DelegationScopeHierarchyGroup[] | null;\n grants?: DelegationGrant[] | null;\n metadata?: Record<string, unknown>;\n targets?: DelegationScopeTarget[] | null;\n operations?: DelegationScopeAction[] | null;\n accessibilities?: DelegationScopeFact[] | null;\n presets?: Record<string, unknown>[] | null;\n combinationRules?: DelegationScopeCombinationRule[] | null;\n nonDelegableOperations?: (string | DelegationScopeFact)[] | null;\n dataFilters?: DelegationScopeFact[] | null;\n constraints?: DelegationScopeFact[] | null;\n}\n\nexport interface DelegationScopeWarning {\n code?: string;\n message: string;\n}\n\nexport interface DelegationScopeDeniedItem {\n applicationKey: string;\n targetType: string;\n targetKey: string;\n operationKey: string;\n permissionCommand?: string;\n reasonCode: string;\n}\n\nexport interface DelegationScopePreview {\n isValid: boolean;\n normalizedScope: DelegationScopeSelection;\n scopeHash: string;\n summary: DelegationDisplayValue;\n warnings: DelegationScopeWarning[];\n deniedItems: DelegationScopeDeniedItem[];\n}\n\n// ============================================================================\n// Detail (doc 02)\n// ============================================================================\n\nexport interface DelegationStatusInfo {\n effectiveStatus: DelegationEffectiveStatus;\n reasonCode: string;\n calculatedAtUtc: string;\n}\n\nexport interface DelegationDetail {\n row: DelegationRow;\n description?: string | null;\n scope: DelegationScopeSelection;\n scopeView?: DelegationScopeView | null;\n status: DelegationStatusInfo;\n}\n\n// ============================================================================\n// Legacy create/edit DTO returned by create/edit (doc 02)\n// ============================================================================\n\nexport interface DelegationDto {\n id: number;\n fromUserId: string;\n toUserId: string;\n description?: string;\n isActive?: boolean;\n delegationDaysType: DelegationDayRuleMode;\n specificDays: number[];\n applicationId?: number;\n requiresApproval?: boolean;\n effectiveStatus: DelegationEffectiveStatus;\n statusReasonCode: string;\n allowedActions: DelegationAllowedAction[];\n rowVersion: string;\n [extra: string]: unknown;\n}\n\n// ============================================================================\n// List query (doc 02)\n// ============================================================================\n\nexport type DelegationSortDirection =\n | 'asc'\n | 'ascending'\n | 'desc'\n | 'descending';\n\nexport interface DelegationListQuery {\n activeOnly?: boolean;\n status?: DelegationEffectiveStatus;\n search?: string;\n fromUtc?: string;\n toUtc?: string;\n sortBy?: string;\n sortDirection?: DelegationSortDirection;\n page?: number;\n pageSize?: number;\n // admin only\n delegatorUserId?: string;\n delegatedUserId?: string;\n}\n\n// ============================================================================\n// Create / edit / decision requests (doc 04)\n// ============================================================================\n\nexport interface CreateDelegationLegacyRequest {\n delegateFrom?: string | null;\n delegateTo: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n accessibilityIds?: number[];\n moduleIds?: number[];\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n isActive?: boolean;\n requiresApproval?: boolean;\n}\n\nexport interface CreateDelegationV2Request {\n delegateFrom?: string | null;\n delegateTo: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n requiresApproval: boolean;\n scope: DelegationScopeSelection;\n}\n\nexport interface AdminCreateDelegationV2Request {\n delegatorUserId: string;\n delegatedUserId: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n requiresApproval: boolean;\n scope: DelegationScopeSelection;\n}\n\nexport type UpdateDelegationLegacyRequest = CreateDelegationLegacyRequest & {\n rowVersion: string;\n};\n\nexport type UpdateDelegationV2Request = CreateDelegationV2Request & {\n rowVersion: string;\n};\n\nexport type AdminUpdateDelegationV2Request = AdminCreateDelegationV2Request & {\n rowVersion: string;\n};\n\nexport interface DelegationScopePreviewRequest {\n scope: DelegationScopeSelection;\n delegatorUserId?: string | null;\n}\n\nexport interface ApproveDelegationRequest {\n rowVersion: string;\n reason?: string;\n}\n\nexport interface RejectDelegationRequest {\n rowVersion: string;\n reason: string;\n}\n\n// ============================================================================\n// NGXS state shape + action keys\n// ============================================================================\n\nexport enum DelegationsActionKey {\n GetMy = 'getMy',\n GetAssigned = 'getAssigned',\n GetApprovals = 'getApprovals',\n GetAdmin = 'getAdmin',\n GetActive = 'getActive',\n GetDetail = 'getDetail',\n GetScopeOptions = 'getScopeOptions',\n PreviewScope = 'previewScope',\n Create = 'create',\n Update = 'update',\n Approve = 'approve',\n Reject = 'reject',\n Cancel = 'cancel',\n}\n\nexport interface DelegationsStateModel extends LoadingStateShape<DelegationsActionKey> {\n my: DelegationPage<DelegationRow> | null;\n assigned: DelegationPage<DelegationRow> | null;\n approvals: DelegationPage<DelegationRow> | null;\n admin: DelegationPage<DelegationRow> | null;\n active: DelegationPage<DelegationRow> | null;\n detail: DelegationDetail | null;\n detailRequestedId: number | null;\n scopeOptions: DelegationScopeOptions | null;\n scopePreview: DelegationScopePreview | null;\n scopePreviewFingerprint: string | null;\n}\n","import { DelegationScopeSelection } from './delegations.model';\r\n\r\n/** Stable request identity used to reject stale scope-preview responses. */\r\nexport function delegationScopeFingerprint(\r\n scope: DelegationScopeSelection,\r\n): string {\r\n const grants = (scope.grants ?? [])\r\n .map((grant) => ({\r\n applicationKey: grant.applicationKey,\r\n targetType: grant.target?.targetType,\r\n targetKey: grant.target?.targetKey,\r\n operationKey: grant.action?.operationKey,\r\n accessibilities: (grant.accessibilities ?? [])\r\n .map((item) => item.key ?? item.code ?? item.id ?? '')\r\n .sort(),\r\n dataFilters: (grant.dataFilters ?? [])\r\n .map((item) => item.key ?? item.code ?? item.id ?? '')\r\n .sort(),\r\n constraints: (grant.constraints ?? [])\r\n .map((item) => item.key ?? item.code ?? item.id ?? '')\r\n .sort(),\r\n }))\r\n .sort((left, right) =>\r\n JSON.stringify(left).localeCompare(JSON.stringify(right)),\r\n );\r\n return JSON.stringify(grants);\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport {\r\n Action,\r\n Actions,\r\n ofActionSuccessful,\r\n Selector,\r\n State,\r\n StateContext,\r\n Store,\r\n} from '@ngxs/store';\r\nimport { handleApiRequest } from '@masterteam/components';\r\nimport { Response } from './api.model';\r\nimport {\r\n ApproveDelegation,\r\n CancelDelegation,\r\n ClearDelegationDetail,\r\n ClearScopePreview,\r\n CreateDelegationLegacy,\r\n CreateDelegationV2,\r\n GetActiveAssignedDelegations,\r\n GetAdminDelegations,\r\n GetApprovalDelegations,\r\n GetAssignedDelegations,\r\n GetDelegationDetail,\r\n GetMyDelegations,\r\n GetScopeOptions,\r\n PreviewScope,\r\n RejectDelegation,\r\n UpdateDelegationLegacy,\r\n UpdateDelegationV2,\r\n} from './delegations.actions';\r\nimport {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n DelegationDetail,\r\n DelegationDto,\r\n DelegationListQuery,\r\n DelegationPage,\r\n DelegationRow,\r\n DelegationScopeOptions,\r\n DelegationScopePreviewRequest,\r\n DelegationScopePreview,\r\n DelegationsActionKey,\r\n DelegationsStateModel,\r\n} from './delegations.model';\r\nimport { delegationScopeFingerprint } from './scope-fingerprint';\r\nimport {\r\n EndDelegationSession,\r\n LoadDelegationCandidates,\r\n} from '../session/delegation-session.actions';\r\nimport type { ActiveDelegationSession } from '../session/delegation-session.model';\r\n\r\nconst BASE = 'identity/delegations';\r\n\r\nfunction buildListParams(query: DelegationListQuery): HttpParams {\r\n let params = new HttpParams();\r\n if (query.activeOnly != null)\r\n params = params.set('activeOnly', query.activeOnly);\r\n if (query.status) params = params.set('status', query.status);\r\n if (query.search) params = params.set('search', query.search);\r\n if (query.fromUtc) params = params.set('fromUtc', query.fromUtc);\r\n if (query.toUtc) params = params.set('toUtc', query.toUtc);\r\n if (query.sortBy) params = params.set('sortBy', query.sortBy);\r\n if (query.sortDirection)\r\n params = params.set('sortDirection', query.sortDirection);\r\n params = params.set('page', query.page ?? 1);\r\n params = params.set('pageSize', query.pageSize ?? 25);\r\n if (query.delegatorUserId)\r\n params = params.set('delegatorUserId', query.delegatorUserId);\r\n if (query.delegatedUserId)\r\n params = params.set('delegatedUserId', query.delegatedUserId);\r\n return params;\r\n}\r\n\r\n@State<DelegationsStateModel>({\r\n name: 'delegations',\r\n defaults: {\r\n my: null,\r\n assigned: null,\r\n approvals: null,\r\n admin: null,\r\n active: null,\r\n detail: null,\r\n detailRequestedId: null,\r\n scopeOptions: null,\r\n scopePreview: null,\r\n scopePreviewFingerprint: null,\r\n loadingActive: [],\r\n errors: {},\r\n },\r\n})\r\n@Injectable()\r\nexport class DelegationsState {\r\n private http = inject(HttpClient);\r\n private actions$ = inject(Actions);\r\n private store = inject(Store);\r\n\r\n constructor() {\r\n this.actions$\r\n .pipe(\r\n ofActionSuccessful(\r\n CreateDelegationLegacy,\r\n CreateDelegationV2,\r\n UpdateDelegationLegacy,\r\n UpdateDelegationV2,\r\n ApproveDelegation,\r\n RejectDelegation,\r\n CancelDelegation,\r\n ),\r\n )\r\n .subscribe((action) => {\r\n const active = (\r\n this.store.snapshot() as {\r\n delegationSession?: { active?: ActiveDelegationSession | null };\r\n }\r\n ).delegationSession?.active;\r\n if (\r\n action instanceof CancelDelegation &&\r\n active?.delegation.delegationId === action.id\r\n ) {\r\n this.store.dispatch(new EndDelegationSession('ScopeChanged'));\r\n return;\r\n }\r\n this.store.dispatch(new LoadDelegationCandidates());\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Selectors\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getMy(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.my;\r\n }\r\n\r\n @Selector()\r\n static getAssigned(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.assigned;\r\n }\r\n\r\n @Selector()\r\n static getApprovals(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.approvals;\r\n }\r\n\r\n @Selector()\r\n static getAdmin(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.admin;\r\n }\r\n\r\n @Selector()\r\n static getActive(\r\n state: DelegationsStateModel,\r\n ): DelegationPage<DelegationRow> | null {\r\n return state.active;\r\n }\r\n\r\n @Selector()\r\n static getDetail(state: DelegationsStateModel): DelegationDetail | null {\r\n return state.detail;\r\n }\r\n\r\n @Selector()\r\n static getScopePreviewFingerprint(\r\n state: DelegationsStateModel,\r\n ): string | null {\r\n return state.scopePreviewFingerprint;\r\n }\r\n\r\n @Selector()\r\n static getScopeOptions(\r\n state: DelegationsStateModel,\r\n ): DelegationScopeOptions | null {\r\n return state.scopeOptions;\r\n }\r\n\r\n @Selector()\r\n static getScopePreview(\r\n state: DelegationsStateModel,\r\n ): DelegationScopePreview | null {\r\n return state.scopePreview;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: DelegationsStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: DelegationsStateModel,\r\n ): Record<string, string | null | undefined> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // Lists\r\n // ============================================================================\r\n\r\n @Action(GetMyDelegations)\r\n getMy(ctx: StateContext<DelegationsStateModel>, { query }: GetMyDelegations) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(BASE, {\r\n params: buildListParams(query),\r\n });\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetMy,\r\n request$: req$,\r\n onSuccess: (response) => ({ my: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetAssignedDelegations)\r\n getAssigned(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetAssignedDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/assigned`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetAssigned,\r\n request$: req$,\r\n onSuccess: (response) => ({ assigned: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetApprovalDelegations)\r\n getApprovals(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetApprovalDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/assigned`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetApprovals,\r\n request$: req$,\r\n onSuccess: (response) => ({ approvals: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetAdminDelegations)\r\n getAdmin(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetAdminDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/All`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetAdmin,\r\n request$: req$,\r\n onSuccess: (response) => ({ admin: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetActiveAssignedDelegations)\r\n getActive(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { query }: GetActiveAssignedDelegations,\r\n ) {\r\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\r\n `${BASE}/user/activedelegations`,\r\n { params: buildListParams(query) },\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetActive,\r\n request$: req$,\r\n onSuccess: (response) => ({ active: response.data }),\r\n });\r\n }\r\n\r\n @Action(GetDelegationDetail, { cancelUncompleted: true })\r\n getDetail(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, asAdmin }: GetDelegationDetail,\r\n ) {\r\n ctx.patchState({ detail: null, detailRequestedId: id });\r\n const path = asAdmin ? `${BASE}/Admin/${id}` : `${BASE}/${id}`;\r\n const req$ = this.http.get<Response<DelegationDetail>>(path);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetDetail,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n detail:\r\n ctx.getState().detailRequestedId === id\r\n ? (response.data ?? null)\r\n : null,\r\n }),\r\n });\r\n }\r\n\r\n @Action(ClearDelegationDetail)\r\n clearDetail(ctx: StateContext<DelegationsStateModel>) {\r\n ctx.patchState({ detail: null, detailRequestedId: null });\r\n }\r\n\r\n // ============================================================================\r\n // Scope\r\n // ============================================================================\r\n\r\n @Action(GetScopeOptions)\r\n getScopeOptions(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { delegatorUserId, asAdmin }: GetScopeOptions,\r\n ) {\r\n ctx.patchState({\r\n scopeOptions: null,\r\n scopePreview: null,\r\n scopePreviewFingerprint: null,\r\n });\r\n\r\n let params = new HttpParams();\r\n if (delegatorUserId)\r\n params = params.set('delegatorUserId', delegatorUserId);\r\n const path = asAdmin\r\n ? `${BASE}/Admin/scope/options`\r\n : `${BASE}/scope/options`;\r\n const req$ = this.http.get<Response<DelegationScopeOptions>>(path, {\r\n params,\r\n });\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.GetScopeOptions,\r\n request$: req$,\r\n onSuccess: (response) => ({ scopeOptions: response.data ?? null }),\r\n });\r\n }\r\n\r\n @Action(PreviewScope, { cancelUncompleted: true })\r\n previewScope(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { request, asAdmin }: PreviewScope,\r\n ) {\r\n const fingerprint = delegationScopeFingerprint(request.scope);\r\n ctx.patchState({ scopePreview: null, scopePreviewFingerprint: null });\r\n const path = asAdmin\r\n ? `${BASE}/Admin/scope/preview`\r\n : `${BASE}/scope/preview`;\r\n const req$ = this.http.post<Response<DelegationScopePreview>>(\r\n path,\r\n this.buildScopePreviewRequest(request, asAdmin),\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.PreviewScope,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n scopePreview: response.data ?? null,\r\n scopePreviewFingerprint: fingerprint,\r\n }),\r\n });\r\n }\r\n\r\n @Action(ClearScopePreview)\r\n clearScopePreview(ctx: StateContext<DelegationsStateModel>) {\r\n ctx.patchState({ scopePreview: null, scopePreviewFingerprint: null });\r\n }\r\n\r\n // ============================================================================\r\n // Create / edit (response is legacy DelegationDto — clients reload list/detail)\r\n // ============================================================================\r\n\r\n @Action(CreateDelegationLegacy)\r\n createLegacy(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { request }: CreateDelegationLegacy,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationDto>>(BASE, request);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Create,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(CreateDelegationV2)\r\n createV2(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { request, asAdmin }: CreateDelegationV2,\r\n ) {\r\n const path = asAdmin ? `${BASE}/Admin/v2` : `${BASE}/v2`;\r\n const body = asAdmin\r\n ? this.buildAdminSaveRequest(request as AdminCreateDelegationV2Request)\r\n : request;\r\n const req$ = this.http.post<Response<DelegationDto>>(path, body);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Create,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(UpdateDelegationLegacy)\r\n updateLegacy(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request }: UpdateDelegationLegacy,\r\n ) {\r\n const req$ = this.http.put<Response<DelegationDto>>(\r\n `${BASE}/${id}`,\r\n request,\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Update,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(UpdateDelegationV2)\r\n updateV2(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request, asAdmin }: UpdateDelegationV2,\r\n ) {\r\n const path = asAdmin ? `${BASE}/Admin/v2/${id}` : `${BASE}/v2/${id}`;\r\n const body = asAdmin\r\n ? this.buildAdminSaveRequest(request as AdminUpdateDelegationV2Request)\r\n : request;\r\n const req$ = this.http.put<Response<DelegationDto>>(path, body);\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Update,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Decisions\r\n // ============================================================================\r\n\r\n @Action(ApproveDelegation)\r\n approve(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request }: ApproveDelegation,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationDto>>(\r\n `${BASE}/${id}/approve`,\r\n request,\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Approve,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(RejectDelegation)\r\n reject(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, request }: RejectDelegation,\r\n ) {\r\n const req$ = this.http.post<Response<DelegationDto>>(\r\n `${BASE}/${id}/reject`,\r\n request,\r\n );\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Reject,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n @Action(CancelDelegation)\r\n cancel(\r\n ctx: StateContext<DelegationsStateModel>,\r\n { id, rowVersion, asAdmin }: CancelDelegation,\r\n ) {\r\n const path = asAdmin ? `${BASE}/Admin/${id}` : `${BASE}/${id}`;\r\n const req$ = this.http.delete<Response<boolean>>(path, {\r\n params: new HttpParams().set('rowVersion', rowVersion),\r\n });\r\n return handleApiRequest({\r\n ctx,\r\n key: DelegationsActionKey.Cancel,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n });\r\n }\r\n\r\n private buildScopePreviewRequest(\r\n request: DelegationScopePreviewRequest,\r\n asAdmin: boolean,\r\n ): DelegationScopePreviewRequest {\r\n if (!asAdmin) {\r\n return { scope: request.scope };\r\n }\r\n\r\n return {\r\n delegatorUserId: request.delegatorUserId ?? null,\r\n scope: request.scope,\r\n };\r\n }\r\n\r\n private buildAdminSaveRequest(\r\n request: AdminCreateDelegationV2Request | AdminUpdateDelegationV2Request,\r\n ): AdminCreateDelegationV2Request | AdminUpdateDelegationV2Request {\r\n return {\r\n ...request,\r\n specificDays: request.specificDays ?? [],\r\n };\r\n }\r\n}\r\n","import { computed, inject, Injectable } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport {\r\n ApproveDelegation,\r\n CancelDelegation,\r\n ClearDelegationDetail,\r\n ClearScopePreview,\r\n CreateDelegationLegacy,\r\n CreateDelegationV2,\r\n GetActiveAssignedDelegations,\r\n GetAdminDelegations,\r\n GetApprovalDelegations,\r\n GetAssignedDelegations,\r\n GetDelegationDetail,\r\n GetMyDelegations,\r\n GetScopeOptions,\r\n PreviewScope,\r\n RejectDelegation,\r\n UpdateDelegationLegacy,\r\n UpdateDelegationV2,\r\n} from './delegations.actions';\r\nimport {\r\n AdminCreateDelegationV2Request,\r\n AdminUpdateDelegationV2Request,\r\n ApproveDelegationRequest,\r\n CreateDelegationLegacyRequest,\r\n CreateDelegationV2Request,\r\n DelegationListQuery,\r\n DelegationScopePreviewRequest,\r\n DelegationScopeSelection,\r\n DelegationsActionKey,\r\n RejectDelegationRequest,\r\n UpdateDelegationLegacyRequest,\r\n UpdateDelegationV2Request,\r\n} from './delegations.model';\r\nimport { DelegationsState } from './delegations.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DelegationsFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Data slices\r\n // ---------------------------------------------------------------------------\r\n readonly myPage = select(DelegationsState.getMy);\r\n readonly assignedPage = select(DelegationsState.getAssigned);\r\n readonly approvalsPage = select(DelegationsState.getApprovals);\r\n readonly adminPage = select(DelegationsState.getAdmin);\r\n readonly activePage = select(DelegationsState.getActive);\r\n readonly detail = select(DelegationsState.getDetail);\r\n readonly scopeOptions = select(DelegationsState.getScopeOptions);\r\n readonly scopePreview = select(DelegationsState.getScopePreview);\r\n readonly scopePreviewFingerprint = select(\r\n DelegationsState.getScopePreviewFingerprint,\r\n );\r\n\r\n private readonly loadingActive = select(DelegationsState.getLoadingActive);\r\n private readonly errors = select(DelegationsState.getErrors);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Derived\r\n // ---------------------------------------------------------------------------\r\n readonly myItems = computed(() => this.myPage()?.items ?? []);\r\n readonly assignedItems = computed(() => this.assignedPage()?.items ?? []);\r\n readonly approvalItems = computed(() => this.approvalsPage()?.items ?? []);\r\n readonly adminItems = computed(() => this.adminPage()?.items ?? []);\r\n readonly activeItems = computed(() => this.activePage()?.items ?? []);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Loading\r\n // ---------------------------------------------------------------------------\r\n readonly isLoadingMy = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetMy),\r\n );\r\n readonly isLoadingAssigned = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetAssigned),\r\n );\r\n readonly isLoadingApprovals = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetApprovals),\r\n );\r\n readonly isLoadingAdmin = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetAdmin),\r\n );\r\n readonly isLoadingActive = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetActive),\r\n );\r\n readonly isLoadingDetail = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetDetail),\r\n );\r\n readonly isLoadingScopeOptions = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.GetScopeOptions),\r\n );\r\n readonly isPreviewingScope = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.PreviewScope),\r\n );\r\n readonly isSaving = computed(\r\n () =>\r\n this.loadingActive().includes(DelegationsActionKey.Create) ||\r\n this.loadingActive().includes(DelegationsActionKey.Update),\r\n );\r\n readonly isApproving = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.Approve),\r\n );\r\n readonly isRejecting = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.Reject),\r\n );\r\n readonly isCancelling = computed(() =>\r\n this.loadingActive().includes(DelegationsActionKey.Cancel),\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Errors\r\n // ---------------------------------------------------------------------------\r\n readonly errorMy = computed(\r\n () => this.errors()[DelegationsActionKey.GetMy] ?? null,\r\n );\r\n readonly errorAssigned = computed(\r\n () => this.errors()[DelegationsActionKey.GetAssigned] ?? null,\r\n );\r\n readonly errorApprovals = computed(\r\n () => this.errors()[DelegationsActionKey.GetApprovals] ?? null,\r\n );\r\n readonly errorAdmin = computed(\r\n () => this.errors()[DelegationsActionKey.GetAdmin] ?? null,\r\n );\r\n readonly errorDetail = computed(\r\n () => this.errors()[DelegationsActionKey.GetDetail] ?? null,\r\n );\r\n readonly errorScopeOptions = computed(\r\n () => this.errors()[DelegationsActionKey.GetScopeOptions] ?? null,\r\n );\r\n readonly errorSave = computed(\r\n () =>\r\n this.errors()[DelegationsActionKey.Create] ??\r\n this.errors()[DelegationsActionKey.Update] ??\r\n null,\r\n );\r\n\r\n // ---------------------------------------------------------------------------\r\n // Dispatchers\r\n // ---------------------------------------------------------------------------\r\n getMy(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetMyDelegations(query));\r\n }\r\n getAssigned(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetAssignedDelegations(query));\r\n }\r\n getApprovals(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetApprovalDelegations(query));\r\n }\r\n getAdmin(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetAdminDelegations(query));\r\n }\r\n getActive(query: DelegationListQuery = {}) {\r\n return this.store.dispatch(new GetActiveAssignedDelegations(query));\r\n }\r\n getDetail(id: number, asAdmin = false) {\r\n return this.store.dispatch(new GetDelegationDetail(id, asAdmin));\r\n }\r\n clearDetail() {\r\n return this.store.dispatch(new ClearDelegationDetail());\r\n }\r\n loadScopeOptions(delegatorUserId?: string, asAdmin = false) {\r\n return this.store.dispatch(new GetScopeOptions(delegatorUserId, asAdmin));\r\n }\r\n previewScope(\r\n scope: DelegationScopeSelection,\r\n options?: {\r\n delegatorUserId?: string;\r\n asAdmin?: boolean;\r\n },\r\n ) {\r\n const request: DelegationScopePreviewRequest = {\r\n delegatorUserId: options?.delegatorUserId,\r\n scope,\r\n };\r\n return this.store.dispatch(\r\n new PreviewScope(request, options?.asAdmin ?? false),\r\n );\r\n }\r\n clearScopePreview() {\r\n return this.store.dispatch(new ClearScopePreview());\r\n }\r\n createLegacy(request: CreateDelegationLegacyRequest) {\r\n return this.store.dispatch(new CreateDelegationLegacy(request));\r\n }\r\n createV2(\r\n request: CreateDelegationV2Request | AdminCreateDelegationV2Request,\r\n asAdmin = false,\r\n ) {\r\n return this.store.dispatch(new CreateDelegationV2(request, asAdmin));\r\n }\r\n updateLegacy(id: number, request: UpdateDelegationLegacyRequest) {\r\n return this.store.dispatch(new UpdateDelegationLegacy(id, request));\r\n }\r\n updateV2(\r\n id: number,\r\n request: UpdateDelegationV2Request | AdminUpdateDelegationV2Request,\r\n asAdmin = false,\r\n ) {\r\n return this.store.dispatch(new UpdateDelegationV2(id, request, asAdmin));\r\n }\r\n approve(id: number, request: ApproveDelegationRequest) {\r\n return this.store.dispatch(new ApproveDelegation(id, request));\r\n }\r\n reject(id: number, request: RejectDelegationRequest) {\r\n return this.store.dispatch(new RejectDelegation(id, request));\r\n }\r\n cancel(id: number, rowVersion: string, asAdmin = false) {\r\n return this.store.dispatch(new CancelDelegation(id, rowVersion, asAdmin));\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\r\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\n/**\r\n * Collects a required rejection reason before calling\r\n * POST identity/delegations/{id}/reject (doc 04 — reject requires a non-empty\r\n * reason for audit/governance). Closes with `true` on success so the caller\r\n * can reload the row.\r\n */\r\n@Component({\r\n selector: 'mt-reject-delegation-dialog',\r\n imports: [CommonModule, Button, EntityPreview, TranslocoDirective],\r\n templateUrl: './reject-delegation-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class RejectDelegationDialog {\r\n readonly delegation = input.required<DelegationRow>();\r\n\r\n private readonly ref: ModalRef = inject(ModalRef);\r\n private readonly facade = inject(DelegationsFacade);\r\n\r\n protected readonly reason = signal('');\r\n protected readonly submitted = signal(false);\r\n protected readonly isBusy = this.facade.isRejecting;\r\n\r\n protected readonly isValid = computed(() => this.reason().trim().length > 0);\r\n\r\n protected onReasonInput(event: Event): void {\r\n this.reason.set((event.target as HTMLTextAreaElement).value);\r\n }\r\n\r\n protected userEntity(party: DelegationRow['delegator']) {\r\n return toDelegationUserEntity(party, { showEmail: false });\r\n }\r\n\r\n confirm(): void {\r\n this.submitted.set(true);\r\n if (!this.isValid()) return;\r\n const row = this.delegation();\r\n this.facade\r\n .reject(row.delegationId, {\r\n rowVersion: row.rowVersion,\r\n reason: this.reason().trim(),\r\n })\r\n .subscribe({\r\n next: () => this.ref.close(true),\r\n error: () => {\r\n /* error surfaced via shared toast pipeline; keep dialog open */\r\n },\r\n });\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col gap-4 p-2\">\r\n <div class=\"flex flex-col gap-1\">\r\n <div class=\"text-sm text-surface-700\">\r\n {{ t(\"delegations.confirm.reject\") }}\r\n </div>\r\n <mt-entity-preview\r\n [data]=\"userEntity(delegation().delegator)\"\r\n ></mt-entity-preview>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-1\">\r\n <label\r\n class=\"text-sm font-medium text-surface-800\"\r\n for=\"mt-reject-reason\"\r\n >\r\n {{ t(\"delegations.form.rejectionReason\") }}\r\n <span class=\"text-red-600\">*</span>\r\n </label>\r\n <textarea\r\n id=\"mt-reject-reason\"\r\n rows=\"3\"\r\n class=\"w-full rounded-md border border-surface-300 px-3 py-2 text-sm focus:border-primary focus:outline-none\"\r\n [class.border-red-400]=\"submitted() && !isValid()\"\r\n [value]=\"reason()\"\r\n (input)=\"onReasonInput($event)\"\r\n [attr.aria-invalid]=\"submitted() && !isValid()\"\r\n [placeholder]=\"t('delegations.form.rejectionReason')\"\r\n ></textarea>\r\n @if (submitted() && !isValid()) {\r\n <span class=\"text-xs text-red-600\">\r\n {{ t(\"delegations.form.rejectReasonRequired\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div class=\"flex justify-end gap-2 pt-2 border-t border-surface-200\">\r\n <mt-button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n [label]=\"t('delegations.common.cancel')\"\r\n [disabled]=\"isBusy()\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n <mt-button\r\n color=\"danger\"\r\n icon=\"general.x-close\"\r\n [label]=\"t('delegations.action.reject')\"\r\n [loading]=\"isBusy()\"\r\n [disabled]=\"!isValid()\"\r\n (click)=\"confirm()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ActivatedRoute,\r\n NavigationEnd,\r\n Router,\r\n RouterOutlet,\r\n} from '@angular/router';\r\nimport { filter } from 'rxjs';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { PageHeaderTab } from '@masterteam/components/page-header';\r\n\r\ninterface DelegationRouteTab {\r\n label: string;\r\n path: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-delegations',\r\n imports: [Page, RouterOutlet, TranslocoDirective],\r\n templateUrl: './delegations.html',\r\n styleUrl: './delegations.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class Delegations implements OnInit {\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly tabs = signal<PageHeaderTab[]>([]);\r\n protected readonly activeTab = signal<string>('');\r\n\r\n constructor() {\r\n this.router.events\r\n .pipe(\r\n filter(\r\n (event): event is NavigationEnd => event instanceof NavigationEnd,\r\n ),\r\n takeUntilDestroyed(),\r\n )\r\n .subscribe(() => this.syncSelectedTabFromRoute());\r\n }\r\n\r\n ngOnInit(): void {\r\n this.tabs.set(\r\n this.getRouteTabs().map((tab) => ({\r\n label: tab.label,\r\n value: tab.path,\r\n })),\r\n );\r\n this.syncSelectedTabFromRoute();\r\n }\r\n\r\n goBack() {\r\n void this.router.navigate(['control-panel/product-settings']);\r\n }\r\n\r\n protected onTabChange(value: string | number): void {\r\n if (typeof value !== 'string') {\r\n return;\r\n }\r\n\r\n const tab = this.getRouteTabs().find((item) => item.path === value);\r\n if (!tab) {\r\n return;\r\n }\r\n\r\n void this.router.navigate([tab.path], { relativeTo: this.route });\r\n }\r\n\r\n private syncSelectedTabFromRoute(): void {\r\n const currentPath = this.route.snapshot.firstChild?.routeConfig?.path;\r\n this.activeTab.set(currentPath || this.tabs()[0]?.value?.toString() || '');\r\n }\r\n\r\n private getRouteTabs(): DelegationRouteTab[] {\r\n return (this.route.routeConfig?.children ?? []).flatMap((childRoute) => {\r\n const path = childRoute.path?.trim();\r\n const label = childRoute.data?.['tabLabel'];\r\n\r\n if (!path || typeof label !== 'string') {\r\n return [];\r\n }\r\n\r\n return [{ path, label: this.transloco.translate(label) }];\r\n });\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <mt-page\r\n [title]=\"t('delegations.title')\"\r\n [avatarIcon]=\"'custom.hierarchy-structure'\"\r\n [tabs]=\"tabs()\"\r\n [activeTab]=\"activeTab()\"\r\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-indigo-50)',\r\n '--p-avatar-color': 'var(--p-indigo-700)',\r\n }\"\r\n (tabChange)=\"onTabChange($event)\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <router-outlet />\r\n </mt-page>\r\n</ng-container>\r\n","import type {\r\n DelegationDisplayValue,\r\n DelegationScopeAction,\r\n DelegationScopeTarget,\r\n} from '../../store/delegations/delegations.model';\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n}\r\n\r\nfunction readLocalizedValue(\r\n source: Record<string, unknown>,\r\n preferredLanguage: string,\r\n): string | null {\r\n const normalizedLanguage = preferredLanguage.toLowerCase();\r\n const baseLanguage = normalizedLanguage.split('-')[0];\r\n const preferredKeys = normalizedLanguage.startsWith('ar')\r\n ? ['defaultAr', 'ar', normalizedLanguage, baseLanguage, 'defaultEn', 'en']\r\n : ['defaultEn', 'en', normalizedLanguage, baseLanguage, 'defaultAr', 'ar'];\r\n\r\n for (const key of preferredKeys) {\r\n const value = source[key];\r\n if (typeof value === 'string' && value.trim()) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n for (const key of ['en', 'ar', 'defaultEn', 'defaultAr']) {\r\n const value = source[key];\r\n if (typeof value === 'string' && value.trim()) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction parseJsonRecord(value: string): Record<string, unknown> | null {\r\n const trimmed = value.trim();\r\n\r\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n return isRecord(parsed) ? parsed : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction resolveDisplayValue(\r\n value: unknown,\r\n preferredLanguage: string,\r\n): string | null {\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (!trimmed) {\r\n return null;\r\n }\r\n\r\n const parsed = parseJsonRecord(trimmed);\r\n if (parsed) {\r\n return (\r\n readLocalizedValue(parsed, preferredLanguage) ??\r\n readDisplayValue(\r\n parsed,\r\n ['displayName', 'displayLabel', 'label'],\r\n preferredLanguage,\r\n ) ??\r\n trimmed\r\n );\r\n }\r\n\r\n return trimmed;\r\n }\r\n\r\n if (!isRecord(value)) {\r\n return null;\r\n }\r\n\r\n return (\r\n readLocalizedValue(value, preferredLanguage) ??\r\n readDisplayValue(\r\n value,\r\n [\r\n 'displayName',\r\n 'displayLabel',\r\n 'operationDisplayName',\r\n 'operationLabel',\r\n 'label',\r\n 'name',\r\n 'value',\r\n ],\r\n preferredLanguage,\r\n )\r\n );\r\n}\r\n\r\nfunction readDisplayValue(\r\n source: Record<string, unknown>,\r\n keys: string[],\r\n preferredLanguage: string,\r\n): string | null {\r\n for (const key of keys) {\r\n const value = resolveDisplayValue(source[key], preferredLanguage);\r\n if (value) {\r\n return value;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction resolveDisplayOrHumanizedKey(\r\n source: Record<string, unknown>,\r\n displayKeys: string[],\r\n fallbackKey?: string | null,\r\n preferredLanguage = 'en',\r\n): string {\r\n const displayValue = readDisplayValue(source, displayKeys, preferredLanguage);\r\n if (displayValue) {\r\n return displayValue;\r\n }\r\n\r\n return humanizeDelegationKey(fallbackKey);\r\n}\r\n\r\nexport function humanizeDelegationKey(value?: string | null): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const normalized = value\r\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\r\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\r\n .replace(/[._-]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n\r\n if (!normalized) {\r\n return '';\r\n }\r\n\r\n return normalized.replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nexport function formatDelegationDisplayValue(\r\n value: DelegationDisplayValue | undefined,\r\n preferredLanguage = 'en',\r\n): string {\r\n return resolveDisplayValue(value, preferredLanguage) ?? '';\r\n}\r\n\r\nexport function formatDelegationTargetLabel(\r\n target: DelegationScopeTarget,\r\n preferredLanguage = 'en',\r\n): string {\r\n return resolveDisplayOrHumanizedKey(\r\n target as unknown as Record<string, unknown>,\r\n ['name', 'displayName', 'displayLabel', 'label'],\r\n target.targetKey,\r\n preferredLanguage,\r\n );\r\n}\r\n\r\nexport function formatDelegationActionLabel(\r\n action: DelegationScopeAction,\r\n preferredLanguage = 'en',\r\n): string {\r\n return resolveDisplayOrHumanizedKey(\r\n action as unknown as Record<string, unknown>,\r\n [\r\n 'name',\r\n 'displayName',\r\n 'displayLabel',\r\n 'operationDisplayName',\r\n 'operationLabel',\r\n 'label',\r\n ],\r\n action.operationKey,\r\n preferredLanguage,\r\n );\r\n}\r\n\r\nexport function formatDelegationScopeSummary(\r\n value: DelegationDisplayValue | undefined,\r\n preferredLanguage = 'en',\r\n): string {\r\n return formatDelegationDisplayValue(value, preferredLanguage);\r\n}\r\n","import type {\r\n DelegationDisplayValue,\r\n DelegationGrant,\r\n DelegationScopeAction,\r\n DelegationScopeCombinationRule,\r\n DelegationScopeFact,\r\n DelegationScopeHierarchyGroup,\r\n DelegationScopeHierarchyTarget,\r\n DelegationScopeLevelNode,\r\n DelegationScopeModuleNode,\r\n DelegationScopeOptions,\r\n DelegationScopePermissionGroup,\r\n DelegationScopeTarget,\r\n} from '../../store/delegations/delegations.model';\r\n\r\nconst DEFAULT_SORT_ORDER = Number.MAX_SAFE_INTEGER;\r\n\r\nexport interface DelegationGrantableTargetGroup {\r\n key: string;\r\n target: DelegationScopeTarget;\r\n grants: DelegationGrant[];\r\n sortOrder: number;\r\n}\r\n\r\nexport interface DelegationGrantableHierarchyGroup {\r\n key: string;\r\n groupType: string;\r\n displayName?: DelegationDisplayValue;\r\n sortOrder: number;\r\n targets: DelegationGrantableTargetGroup[];\r\n}\r\n\r\nfunction toArray<T>(value?: T[] | null): T[] {\r\n return Array.isArray(value) ? value : [];\r\n}\r\n\r\nfunction normalizeGrant(grant: DelegationGrant): DelegationGrant {\r\n return {\r\n ...grant,\r\n action: normalizeAction(grant.action),\r\n accessibilities: toArray(grant.accessibilities),\r\n dataFilters: toArray(grant.dataFilters),\r\n constraints: toArray(grant.constraints),\r\n };\r\n}\r\n\r\nfunction normalizeAction(action: DelegationScopeAction): DelegationScopeAction {\r\n return {\r\n ...action,\r\n isDelegableSnapshot:\r\n action.isDelegableSnapshot ?? action.isDelegable ?? undefined,\r\n };\r\n}\r\n\r\nfunction normalizeKey(value: unknown): string | null {\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n return trimmed || null;\r\n }\r\n\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return String(value);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeSortOrder(value: unknown): number {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n const numericValue = Number(value);\r\n return Number.isFinite(numericValue) ? numericValue : DEFAULT_SORT_ORDER;\r\n}\r\n\r\nfunction compareBySortThenKey(\r\n left: number,\r\n right: number,\r\n leftKey: string,\r\n rightKey: string,\r\n): number {\r\n if (left !== right) {\r\n return left - right;\r\n }\r\n\r\n return leftKey.localeCompare(rightKey);\r\n}\r\n\r\nfunction targetIdentity(target: DelegationScopeTarget): string {\r\n return `${target.applicationKey}::${target.targetType}::${target.targetKey}`;\r\n}\r\n\r\nfunction groupIdentity(\r\n groupType: string,\r\n groupKey: string,\r\n fallbackTargetKey?: string,\r\n): string {\r\n return `${groupType}::${groupKey || fallbackTargetKey || 'group'}`;\r\n}\r\n\r\nfunction buildHierarchyGrant(\r\n target: DelegationScopeTarget,\r\n action: DelegationScopeAction,\r\n): DelegationGrant {\r\n return normalizeGrant({\r\n applicationKey:\r\n normalizeKey(target.applicationKey) ??\r\n normalizeKey(action.applicationKey) ??\r\n '',\r\n target,\r\n action: normalizeAction(action),\r\n accessibilities: [],\r\n dataFilters: [],\r\n constraints: [],\r\n });\r\n}\r\n\r\nfunction factLookupKeys(fact: DelegationScopeFact): string[] {\r\n const candidates = [\r\n fact.key,\r\n fact.code,\r\n fact.id,\r\n fact['accessibilityKey'],\r\n fact['dataFilterKey'],\r\n fact['constraintKey'],\r\n fact['permissionKey'],\r\n fact['pageKey'],\r\n fact['value'],\r\n ];\r\n\r\n return candidates\r\n .map(normalizeKey)\r\n .filter((value): value is string => !!value);\r\n}\r\n\r\nfunction buildFactIndex(\r\n facts: DelegationScopeFact[],\r\n): Map<string, DelegationScopeFact> {\r\n const index = new Map<string, DelegationScopeFact>();\r\n\r\n for (const fact of facts) {\r\n for (const key of factLookupKeys(fact)) {\r\n if (!index.has(key)) {\r\n index.set(key, fact);\r\n }\r\n }\r\n }\r\n\r\n return index;\r\n}\r\n\r\nfunction lookupFacts(\r\n keys: string[] | null | undefined,\r\n index: Map<string, DelegationScopeFact>,\r\n): DelegationScopeFact[] {\r\n if (!Array.isArray(keys) || keys.length === 0) {\r\n return [];\r\n }\r\n\r\n const resolved: DelegationScopeFact[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const rawKey of keys) {\r\n const key = normalizeKey(rawKey);\r\n if (!key || seen.has(key)) {\r\n continue;\r\n }\r\n\r\n const match = index.get(key);\r\n if (!match) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n resolved.push(match);\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\nfunction ruleKeys(\r\n rule: DelegationScopeCombinationRule,\r\n preferredKeys: string[],\r\n): string[] | null {\r\n for (const preferredKey of preferredKeys) {\r\n const value = rule[preferredKey];\r\n if (Array.isArray(value)) {\r\n return value.map((item) => String(item));\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction matchesTarget(\r\n target: DelegationScopeTarget,\r\n rule: DelegationScopeCombinationRule,\r\n): boolean {\r\n return (\r\n target.targetType === rule.targetType &&\r\n target.targetKey === rule.targetKey &&\r\n (!rule.applicationKey ||\r\n !target.applicationKey ||\r\n target.applicationKey === rule.applicationKey)\r\n );\r\n}\r\n\r\nfunction matchesAction(\r\n action: DelegationScopeAction,\r\n rule: DelegationScopeCombinationRule,\r\n applicationKey?: string,\r\n): boolean {\r\n return (\r\n action.operationKey === rule.operationKey &&\r\n (!rule.applicationKey ||\r\n !action.applicationKey ||\r\n action.applicationKey === rule.applicationKey) &&\r\n (!applicationKey ||\r\n !action.applicationKey ||\r\n action.applicationKey === applicationKey)\r\n );\r\n}\r\n\r\nfunction grantIdentity(grant: DelegationGrant): string {\r\n return JSON.stringify({\r\n app: grant.applicationKey,\r\n target: [\r\n grant.target.applicationKey,\r\n grant.target.targetType,\r\n grant.target.targetKey,\r\n grant.target.moduleKey ?? null,\r\n grant.target.permissionModuleType ?? null,\r\n grant.target.permissionTargetId ?? null,\r\n ],\r\n action: [\r\n grant.action.applicationKey,\r\n grant.action.operationKey,\r\n grant.action.operationKind,\r\n grant.action.permissionCommand ?? null,\r\n grant.action.businessActionCode ?? null,\r\n ],\r\n accessibilities: grant.accessibilities.map(factLookupKeys),\r\n dataFilters: grant.dataFilters.map(factLookupKeys),\r\n constraints: grant.constraints.map(factLookupKeys),\r\n });\r\n}\r\n\r\nfunction buildGroupsFromHierarchy(\r\n hierarchy: DelegationScopeHierarchyGroup[],\r\n): DelegationGrantableHierarchyGroup[] {\r\n return hierarchy\r\n .map((group) => {\r\n const targets = toArray(group.targets)\r\n .map((targetNode: DelegationScopeHierarchyTarget) => {\r\n const grants = toArray(targetNode.operations)\r\n .map((operation) =>\r\n buildHierarchyGrant(targetNode.target, operation),\r\n )\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n normalizeSortOrder(left.action.sortOrder),\r\n normalizeSortOrder(right.action.sortOrder),\r\n left.action.operationKey,\r\n right.action.operationKey,\r\n ),\r\n );\r\n\r\n return {\r\n key: targetIdentity(targetNode.target),\r\n target: targetNode.target,\r\n grants,\r\n sortOrder: normalizeSortOrder(\r\n targetNode.sortOrder ?? targetNode.target.levelModuleId,\r\n ),\r\n };\r\n })\r\n .filter((targetNode) => targetNode.grants.length > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n );\r\n\r\n return {\r\n key: groupIdentity(group.groupType, group.groupKey),\r\n groupType: group.groupType,\r\n displayName: group.displayName,\r\n sortOrder: normalizeSortOrder(group.sortOrder ?? group.levelId),\r\n targets,\r\n };\r\n })\r\n .filter((group) => group.targets.length > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n );\r\n}\r\n\r\nfunction getLegacyGrantableGrants(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationGrant[] {\r\n if (!options) {\r\n return [];\r\n }\r\n\r\n const legacyGrants = toArray(options.grants).map(normalizeGrant);\r\n if (legacyGrants.length > 0) {\r\n return legacyGrants;\r\n }\r\n\r\n const targets = toArray(options.targets);\r\n const operations = toArray(options.operations);\r\n const combinationRules = toArray(options.combinationRules);\r\n\r\n if (\r\n targets.length === 0 ||\r\n operations.length === 0 ||\r\n combinationRules.length === 0\r\n ) {\r\n return [];\r\n }\r\n\r\n const accessibilityIndex = buildFactIndex(toArray(options.accessibilities));\r\n const dataFilterIndex = buildFactIndex(toArray(options.dataFilters));\r\n const constraintIndex = buildFactIndex(toArray(options.constraints));\r\n const grants: DelegationGrant[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const rule of combinationRules) {\r\n const target = targets.find((item) => matchesTarget(item, rule));\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n const applicationKey =\r\n normalizeKey(rule.applicationKey) ??\r\n normalizeKey(target.applicationKey) ??\r\n null;\r\n\r\n const action = operations.find((item) =>\r\n matchesAction(item, rule, applicationKey ?? undefined),\r\n );\r\n if (!action) {\r\n continue;\r\n }\r\n\r\n const grant: DelegationGrant = normalizeGrant({\r\n applicationKey:\r\n applicationKey ??\r\n normalizeKey(action.applicationKey) ??\r\n normalizeKey(target.applicationKey) ??\r\n '',\r\n target,\r\n action: normalizeAction(action),\r\n accessibilities: lookupFacts(\r\n ruleKeys(rule, ['accessibilityKeys', 'accessibilities']),\r\n accessibilityIndex,\r\n ),\r\n dataFilters: lookupFacts(\r\n ruleKeys(rule, ['dataFilterKeys', 'dataFilters', 'filterKeys']),\r\n dataFilterIndex,\r\n ),\r\n constraints: lookupFacts(\r\n ruleKeys(rule, ['constraintKeys', 'constraints']),\r\n constraintIndex,\r\n ),\r\n });\r\n\r\n const identity = grantIdentity(grant);\r\n if (seen.has(identity)) {\r\n continue;\r\n }\r\n\r\n seen.add(identity);\r\n grants.push(grant);\r\n }\r\n\r\n return grants;\r\n}\r\n\r\nfunction buildGroupsFromGrants(\r\n grants: DelegationGrant[],\r\n): DelegationGrantableHierarchyGroup[] {\r\n const groups = new Map<\r\n string,\r\n {\r\n groupType: string;\r\n displayName?: DelegationDisplayValue;\r\n sortOrder: number;\r\n targets: Map<string, DelegationGrantableTargetGroup>;\r\n }\r\n >();\r\n\r\n for (const grant of grants) {\r\n const parentGroupKey =\r\n normalizeKey(grant.target.parentTargetKey) ?? grant.target.targetKey;\r\n const parentGroupType =\r\n grant.target.parentTargetType ?? grant.target.targetType;\r\n const groupKey = groupIdentity(\r\n parentGroupType,\r\n parentGroupKey,\r\n grant.target.targetKey,\r\n );\r\n\r\n let group = groups.get(groupKey);\r\n if (!group) {\r\n group = {\r\n groupType: parentGroupType,\r\n displayName:\r\n grant.target.parentDisplayName ?? grant.target.displayName ?? null,\r\n sortOrder: normalizeSortOrder(\r\n grant.target.parentLevelId ?? grant.target.levelId,\r\n ),\r\n targets: new Map<string, DelegationGrantableTargetGroup>(),\r\n };\r\n groups.set(groupKey, group);\r\n }\r\n\r\n const targetKey = targetIdentity(grant.target);\r\n const existingTarget = group.targets.get(targetKey);\r\n\r\n if (existingTarget) {\r\n existingTarget.grants.push(grant);\r\n continue;\r\n }\r\n\r\n group.targets.set(targetKey, {\r\n key: targetKey,\r\n target: grant.target,\r\n grants: [grant],\r\n sortOrder: normalizeSortOrder(\r\n grant.target.levelModuleId ?? grant.target.targetId,\r\n ),\r\n });\r\n }\r\n\r\n return Array.from(groups.entries())\r\n .map(([key, value]) => ({\r\n key,\r\n groupType: value.groupType,\r\n displayName: value.displayName,\r\n sortOrder: value.sortOrder,\r\n targets: Array.from(value.targets.values())\r\n .map((targetGroup) => ({\r\n ...targetGroup,\r\n grants: [...targetGroup.grants].sort((left, right) =>\r\n compareBySortThenKey(\r\n normalizeSortOrder(left.action.sortOrder),\r\n normalizeSortOrder(right.action.sortOrder),\r\n left.action.operationKey,\r\n right.action.operationKey,\r\n ),\r\n ),\r\n }))\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n ),\r\n }))\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n );\r\n}\r\n\r\nexport function getDelegationGrantableGroups(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationGrantableHierarchyGroup[] {\r\n const hierarchyGroups = buildGroupsFromHierarchy(toArray(options?.hierarchy));\r\n if (hierarchyGroups.length > 0) {\r\n return hierarchyGroups;\r\n }\r\n\r\n return buildGroupsFromGrants(getLegacyGrantableGrants(options));\r\n}\r\n\r\nexport function getDelegationGrantableGrants(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationGrant[] {\r\n return getDelegationGrantableGroups(options).flatMap((group) =>\r\n group.targets.flatMap((targetGroup) => targetGroup.grants),\r\n );\r\n}\r\n\r\nexport function hasDelegationGrantableScope(\r\n options: DelegationScopeOptions | null | undefined,\r\n): boolean {\r\n return (\r\n getDelegationPermissionTree(options).length > 0 ||\r\n getDelegationGrantableGroups(options).length > 0\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// New `scope/options` contract (doc 03): permissions tree\r\n// Template -> Level (own operations + modules) -> Module (operations).\r\n// Both Level and LevelModule are selectable permission surfaces; each operation\r\n// leaf maps to one explicit DelegationGrant.\r\n// ============================================================================\r\n\r\nexport type DelegationScopeNodeKind =\r\n | 'template'\r\n | 'level'\r\n | 'module'\r\n | 'operation';\r\n\r\nexport interface DelegationScopeTreeNode {\r\n key: string;\r\n kind: DelegationScopeNodeKind;\r\n displayName?: DelegationDisplayValue;\r\n fallbackKey?: string | null;\r\n isHighRisk?: boolean;\r\n /** Present only on operation leaves: the explicit grant to persist/preview. */\r\n grant?: DelegationGrant;\r\n children?: DelegationScopeTreeNode[];\r\n}\r\n\r\n/** Stable selection key for an operation leaf, independent of accessibilities. */\r\nexport function delegationOperationNodeKey(grant: DelegationGrant): string {\r\n return `op:${targetIdentity(grant.target)}::${grant.action.operationKey}`;\r\n}\r\n\r\nfunction buildScopeTarget(\r\n node: DelegationScopeLevelNode | DelegationScopeModuleNode,\r\n): DelegationScopeTarget {\r\n const moduleNode = node as DelegationScopeModuleNode;\r\n return {\r\n applicationKey: node.applicationKey,\r\n targetType: node.targetType,\r\n targetKey: node.targetKey,\r\n name: node.name ?? null,\r\n displayName: node.name ?? null,\r\n legacyModuleId: node.legacyModuleId ?? null,\r\n targetId: node.targetId ?? null,\r\n levelId: node.levelId ?? null,\r\n levelModuleId: moduleNode.levelModuleId ?? null,\r\n domainModuleId: moduleNode.domainModuleId ?? null,\r\n moduleKey: moduleNode.moduleKey ?? null,\r\n permissionModuleType: node.permissionModuleType ?? null,\r\n permissionTargetId: node.permissionTargetId ?? null,\r\n };\r\n}\r\n\r\nfunction buildOperationGrant(\r\n target: DelegationScopeTarget,\r\n operation: DelegationScopeAction,\r\n): DelegationGrant {\r\n const action: DelegationScopeAction = {\r\n applicationKey: operation.applicationKey ?? target.applicationKey,\r\n operationKey: operation.operationKey,\r\n operationKind: operation.operationKind,\r\n name: operation.name ?? null,\r\n displayName: operation.name ?? operation.displayName ?? null,\r\n permissionCommand: operation.permissionCommand ?? null,\r\n businessActionCode: operation.businessActionCode ?? null,\r\n isHighRisk: operation.isHighRisk ?? false,\r\n isDelegableSnapshot: operation.isDelegableSnapshot ?? true,\r\n sortOrder: operation.sortOrder ?? null,\r\n };\r\n\r\n return {\r\n applicationKey: target.applicationKey,\r\n target,\r\n action,\r\n accessibilities: [],\r\n dataFilters: [],\r\n constraints: [],\r\n };\r\n}\r\n\r\nfunction buildOperationNodes(\r\n target: DelegationScopeTarget,\r\n operations: DelegationScopeAction[] | null | undefined,\r\n): DelegationScopeTreeNode[] {\r\n return toArray(operations)\r\n .map((operation) => {\r\n const grant = buildOperationGrant(target, operation);\r\n return {\r\n key: delegationOperationNodeKey(grant),\r\n kind: 'operation' as const,\r\n displayName: operation.name ?? operation.displayName ?? null,\r\n fallbackKey: operation.operationKey,\r\n isHighRisk: operation.isHighRisk ?? false,\r\n grant,\r\n sortOrder: normalizeSortOrder(operation.sortOrder),\r\n };\r\n })\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n}\r\n\r\nfunction buildModuleNode(\r\n module: DelegationScopeModuleNode,\r\n): DelegationScopeTreeNode & { sortOrder: number } {\r\n const target = buildScopeTarget(module);\r\n return {\r\n key: `mod:${targetIdentity(target)}`,\r\n kind: 'module',\r\n displayName: module.name ?? null,\r\n fallbackKey: module.targetKey,\r\n children: buildOperationNodes(target, module.operations),\r\n sortOrder: normalizeSortOrder(module.sortOrder ?? module.levelModuleId),\r\n };\r\n}\r\n\r\nfunction buildLevelNode(\r\n level: DelegationScopeLevelNode,\r\n): DelegationScopeTreeNode & { sortOrder: number } {\r\n const target = buildScopeTarget(level);\r\n const operationNodes = buildOperationNodes(target, level.operations);\r\n const moduleNodes = toArray(level.modules)\r\n .map(buildModuleNode)\r\n .filter((node) => (node.children?.length ?? 0) > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n\r\n return {\r\n key: `lvl:${targetIdentity(target)}`,\r\n kind: 'level',\r\n displayName: level.name ?? null,\r\n fallbackKey: level.targetKey,\r\n children: [...operationNodes, ...moduleNodes],\r\n sortOrder: normalizeSortOrder(level.sortOrder ?? level.levelId),\r\n };\r\n}\r\n\r\nfunction buildTemplateNode(\r\n group: DelegationScopePermissionGroup,\r\n): DelegationScopeTreeNode & { sortOrder: number } {\r\n const levelNodes = toArray(group.levels)\r\n .map(buildLevelNode)\r\n .filter((node) => (node.children?.length ?? 0) > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n\r\n return {\r\n key: `tpl:${group.groupKey}`,\r\n kind: 'template',\r\n displayName: group.name ?? null,\r\n fallbackKey: group.groupKey,\r\n children: levelNodes,\r\n sortOrder: normalizeSortOrder(group.sortOrder ?? group.templateId),\r\n };\r\n}\r\n\r\nexport function getDelegationPermissionTree(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationScopeTreeNode[] {\r\n return toArray(options?.permissions)\r\n .map(buildTemplateNode)\r\n .filter((node) => (node.children?.length ?? 0) > 0)\r\n .sort((left, right) =>\r\n compareBySortThenKey(\r\n left.sortOrder,\r\n right.sortOrder,\r\n left.key,\r\n right.key,\r\n ),\r\n )\r\n .map(({ sortOrder: _drop, ...node }) => node);\r\n}\r\n\r\n/** Back-compat: project the legacy group/target/grant shape onto the tree model. */\r\nfunction legacyGroupsToTree(\r\n groups: DelegationGrantableHierarchyGroup[],\r\n): DelegationScopeTreeNode[] {\r\n return groups.map((group) => ({\r\n key: `grp:${group.key}`,\r\n kind: 'template' as const,\r\n displayName: group.displayName ?? null,\r\n fallbackKey: group.groupType,\r\n children: group.targets.map((targetGroup) => ({\r\n key: `tgt:${targetGroup.key}`,\r\n kind: 'module' as const,\r\n displayName:\r\n targetGroup.target.name ?? targetGroup.target.displayName ?? null,\r\n fallbackKey: targetGroup.target.targetKey,\r\n children: targetGroup.grants.map((grant) => ({\r\n key: delegationOperationNodeKey(grant),\r\n kind: 'operation' as const,\r\n displayName: grant.action.name ?? grant.action.displayName ?? null,\r\n fallbackKey: grant.action.operationKey,\r\n isHighRisk: grant.action.isHighRisk ?? false,\r\n grant,\r\n })),\r\n })),\r\n }));\r\n}\r\n\r\n/**\r\n * Unified scope tree for the picker. Prefers the new `permissions` contract;\r\n * falls back to the legacy hierarchy/grants projection for older environments.\r\n */\r\nexport function getDelegationScopeTree(\r\n options: DelegationScopeOptions | null | undefined,\r\n): DelegationScopeTreeNode[] {\r\n const fromPermissions = getDelegationPermissionTree(options);\r\n if (fromPermissions.length > 0) {\r\n return fromPermissions;\r\n }\r\n return legacyGroupsToTree(getDelegationGrantableGroups(options));\r\n}\r\n\r\n/** All operation-leaf grants in the tree, keyed by their stable node key. */\r\nexport function indexDelegationTreeGrants(\r\n nodes: DelegationScopeTreeNode[],\r\n): Map<string, DelegationGrant> {\r\n const index = new Map<string, DelegationGrant>();\r\n const walk = (list: DelegationScopeTreeNode[]): void => {\r\n for (const node of list) {\r\n if (node.kind === 'operation' && node.grant) {\r\n index.set(node.key, node.grant);\r\n }\r\n if (node.children?.length) {\r\n walk(node.children);\r\n }\r\n }\r\n };\r\n walk(nodes);\r\n return index;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { DelegationsFacade } from '../../../../store/delegations/delegations.facade';\r\nimport {\r\n DelegationAppAccessibility,\r\n DelegationDisplayValue,\r\n DelegationGrant,\r\n DelegationScopeFact,\r\n DelegationScopeSelection,\r\n} from '../../../../store/delegations/delegations.model';\r\nimport {\r\n formatDelegationDisplayValue,\r\n formatDelegationScopeSummary,\r\n humanizeDelegationKey,\r\n} from '../../delegation-scope-display';\r\nimport {\r\n DelegationScopeTreeNode,\r\n delegationOperationNodeKey,\r\n getDelegationScopeTree,\r\n indexDelegationTreeGrants,\r\n} from '../../delegation-scope-options';\r\n\r\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\r\n\r\ntype NodeCheckState = 'checked' | 'indeterminate' | 'unchecked';\r\n\r\n/**\r\n * Hierarchy-based scope picker (doc 03). Driven entirely by `scope/options`:\r\n * - renders the backend-owned Template -> Level -> Module -> operation tree as a\r\n * clean, accessible checkbox tree (parents propagate to descendant operations),\r\n * - offers optional app-accessibility grants,\r\n * - calls `scope/preview` (debounced) and surfaces summary / warnings / denied.\r\n *\r\n * `[(scope)]` two-way binds a `DelegationScopeSelection`. Scope grants are the\r\n * single source of truth for selection; the component never invents permission\r\n * metadata — it only echoes targets/actions/accessibilities returned by options.\r\n */\r\n@Component({\r\n selector: 'mt-scope-picker',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ScrollingModule,\r\n Button,\r\n Card,\r\n Icon,\r\n Tabs,\r\n TextField,\r\n SkeletonModule,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './scope-picker.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ScopePicker {\r\n readonly scope = model<DelegationScopeSelection>(EMPTY_SCOPE);\r\n readonly readonly = input<boolean>(false);\r\n readonly adminMode = input<boolean>(false);\r\n /**\r\n * Delegator whose grantable scope is loaded. Undefined = current user\r\n * (self-service). In admin mode the host rebinds this as the selected\r\n * delegator changes, and options reload reactively.\r\n */\r\n readonly delegatorUserId = input<string | undefined>(undefined);\r\n\r\n private readonly facade = inject(DelegationsFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n protected readonly options = this.facade.scopeOptions;\r\n protected readonly preview = this.facade.scopePreview;\r\n protected readonly isLoadingOptions = this.facade.isLoadingScopeOptions;\r\n protected readonly isPreviewing = this.facade.isPreviewingScope;\r\n protected readonly errorOptions = this.facade.errorScopeOptions;\r\n\r\n protected readonly activeLang = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n\r\n // --- Permission tree ------------------------------------------------------\r\n protected readonly treeModel = computed<DelegationScopeTreeNode[]>(() =>\r\n getDelegationScopeTree(this.options()),\r\n );\r\n protected readonly hasOptions = computed(() => this.treeModel().length > 0);\r\n protected readonly grantIndex = computed(() =>\r\n indexDelegationTreeGrants(this.treeModel()),\r\n );\r\n\r\n /** nodeKey -> all descendant operation-leaf keys (self for operation nodes). */\r\n protected readonly opKeyMap = computed(() => {\r\n const map = new Map<string, string[]>();\r\n const collect = (node: DelegationScopeTreeNode): string[] => {\r\n if (node.kind === 'operation') {\r\n map.set(node.key, [node.key]);\r\n return [node.key];\r\n }\r\n const keys = (node.children ?? []).flatMap(collect);\r\n map.set(node.key, keys);\r\n return keys;\r\n };\r\n this.treeModel().forEach(collect);\r\n return map;\r\n });\r\n\r\n /** Stable operation-node keys for the current scope grants. */\r\n protected readonly selectedKeys = computed(\r\n () => new Set(this.scope().grants.map(delegationOperationNodeKey)),\r\n );\r\n protected readonly selectedCount = computed(() => this.selectedKeys().size);\r\n\r\n /** Every selectable operation key (for the \"select all\" master toggle). */\r\n protected readonly allLeafKeys = computed(() =>\r\n Array.from(this.grantIndex().keys()),\r\n );\r\n protected readonly selectAllState = computed<NodeCheckState>(() => {\r\n const all = this.allLeafKeys();\r\n if (!all.length) return 'unchecked';\r\n const selected = this.selectedKeys();\r\n let count = 0;\r\n for (const key of all) {\r\n if (selected.has(key)) count++;\r\n }\r\n if (count === 0) return 'unchecked';\r\n return count === all.length ? 'checked' : 'indeterminate';\r\n });\r\n\r\n protected readonly searchTerm = signal('');\r\n protected readonly expandedKeys = signal<Set<string>>(new Set());\r\n\r\n protected readonly filteredTree = computed<DelegationScopeTreeNode[]>(() => {\r\n const term = this.searchTerm().trim().toLowerCase();\r\n if (!term) {\r\n return this.treeModel();\r\n }\r\n const prune = (\r\n node: DelegationScopeTreeNode,\r\n ): DelegationScopeTreeNode | null => {\r\n const selfMatch = this.nodeLabel(node).toLowerCase().includes(term);\r\n const children = (node.children ?? [])\r\n .map(prune)\r\n .filter((child): child is DelegationScopeTreeNode => !!child);\r\n if (children.length) {\r\n return { ...node, children };\r\n }\r\n if (selfMatch) {\r\n return node;\r\n }\r\n return null;\r\n };\r\n return this.treeModel()\r\n .map(prune)\r\n .filter((node): node is DelegationScopeTreeNode => !!node);\r\n });\r\n\r\n /**\r\n * Flattened list of currently-visible rows (respecting expand state + search)\r\n * for CDK virtual scrolling — only the on-screen rows render, so large\r\n * permission catalogs stay fast. Recomputes on tree/expand/search changes,\r\n * NOT on selection toggles.\r\n */\r\n protected readonly visibleNodes = computed<\r\n { node: DelegationScopeTreeNode; depth: number }[]\r\n >(() => {\r\n const out: { node: DelegationScopeTreeNode; depth: number }[] = [];\r\n const searching = !!this.searchTerm().trim();\r\n const expanded = this.expandedKeys();\r\n const walk = (nodes: DelegationScopeTreeNode[], depth: number): void => {\r\n for (const node of nodes) {\r\n out.push({ node, depth });\r\n const open = searching || expanded.has(node.key);\r\n if (open && node.children?.length) {\r\n walk(node.children, depth + 1);\r\n }\r\n }\r\n };\r\n walk(this.filteredTree(), 0);\r\n return out;\r\n });\r\n\r\n // --- App accessibility ----------------------------------------------------\r\n protected readonly appAccessibilities = computed<\r\n DelegationAppAccessibility[]\r\n >(() => this.options()?.appAccessibility ?? []);\r\n protected readonly selectedAccessibilityKeys = signal<Set<string>>(new Set());\r\n protected readonly selectedAccessibilityCount = computed(\r\n () => this.selectedAccessibilityKeys().size,\r\n );\r\n protected readonly hasAccessibility = computed(\r\n () => this.appAccessibilities().length > 0,\r\n );\r\n\r\n /** Inner view switch: permission tree vs app-accessibility grants. */\r\n protected readonly activeScopeTab = signal<'permissions' | 'accessibility'>(\r\n 'permissions',\r\n );\r\n\r\n constructor() {\r\n // Load (and reload) grantable options whenever the delegator changes.\r\n let initialized = false;\r\n let lastDelegatorUserId: string | undefined;\r\n effect(() => {\r\n const delegator = this.delegatorUserId();\r\n const asAdmin = this.adminMode();\r\n untracked(() => this.facade.loadScopeOptions(delegator, asAdmin));\r\n\r\n if (!initialized) {\r\n initialized = true;\r\n lastDelegatorUserId = delegator;\r\n return;\r\n }\r\n\r\n if (lastDelegatorUserId !== delegator) {\r\n // Only reset when the user actually switches between two real\r\n // delegators. The initial population (undefined -> id, e.g. edit\r\n // prefill or self-service current user arriving) must NOT wipe the\r\n // freshly-bound scope.\r\n const switchedDelegator = !!lastDelegatorUserId && !!delegator;\r\n lastDelegatorUserId = delegator;\r\n if (switchedDelegator) {\r\n untracked(() => {\r\n this.scope.set(EMPTY_SCOPE);\r\n this.selectedAccessibilityKeys.set(new Set());\r\n this.searchTerm.set('');\r\n this.activeScopeTab.set('permissions');\r\n this.facade.clearScopePreview();\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Expansion on options (re)load: Template nodes expand by default (levels\r\n // collapse so large catalogs open compact); additionally expand the path to\r\n // any already-selected grant so an edit's saved selection is visible.\r\n effect(() => {\r\n const model = this.treeModel();\r\n untracked(() =>\r\n this.expandedKeys.set(\r\n this.collectExpansion(model, this.selectedKeys(), new Set()),\r\n ),\r\n );\r\n });\r\n\r\n // One-time: when an initial (edit) scope arrives AFTER options, expand the\r\n // path to its selected grants so the user sees what's re-selected.\r\n let prefillExpanded = false;\r\n effect(() => {\r\n const grants = this.scope().grants;\r\n const model = this.treeModel();\r\n if (prefillExpanded || !grants.length || !model.length) {\r\n return;\r\n }\r\n prefillExpanded = true;\r\n untracked(() =>\r\n this.expandedKeys.update((prev) =>\r\n this.collectExpansion(model, this.selectedKeys(), prev),\r\n ),\r\n );\r\n });\r\n\r\n // Debounced scope preview.\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n this.destroyRef.onDestroy(() => {\r\n if (timer) clearTimeout(timer);\r\n });\r\n effect(() => {\r\n const s = this.scope();\r\n const delegator = this.delegatorUserId();\r\n const asAdmin = this.adminMode();\r\n untracked(() => {\r\n if (!s.grants.length) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n this.facade.clearScopePreview();\r\n return;\r\n }\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(() => {\r\n timer = null;\r\n return this.facade.previewScope(s, {\r\n delegatorUserId: delegator,\r\n asAdmin,\r\n });\r\n }, 300);\r\n });\r\n });\r\n\r\n // Initialize selected accessibilities once from the bound scope (edit).\r\n let accessibilityInitialized = false;\r\n effect(() => {\r\n const grants = this.scope().grants;\r\n if (accessibilityInitialized || !grants.length) {\r\n return;\r\n }\r\n accessibilityInitialized = true;\r\n const keys = new Set<string>();\r\n for (const grant of grants) {\r\n for (const fact of grant.accessibilities ?? []) {\r\n const key =\r\n typeof fact['accessibilityKey'] === 'string'\r\n ? (fact['accessibilityKey'] as string)\r\n : typeof fact.key === 'string'\r\n ? fact.key\r\n : null;\r\n if (key) keys.add(key);\r\n }\r\n }\r\n if (keys.size) {\r\n untracked(() => this.selectedAccessibilityKeys.set(keys));\r\n }\r\n });\r\n }\r\n\r\n // --- Expansion ------------------------------------------------------------\r\n protected isExpanded(node: DelegationScopeTreeNode): boolean {\r\n return this.searchTerm().trim() ? true : this.expandedKeys().has(node.key);\r\n }\r\n\r\n protected toggleExpand(node: DelegationScopeTreeNode): void {\r\n if (!node.children?.length) {\r\n return;\r\n }\r\n this.expandedKeys.update((set) => {\r\n const next = new Set(set);\r\n if (next.has(node.key)) {\r\n next.delete(node.key);\r\n } else {\r\n next.add(node.key);\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n protected hasChildren(node: DelegationScopeTreeNode): boolean {\r\n return !!node.children?.length;\r\n }\r\n\r\n // --- Selection ------------------------------------------------------------\r\n protected nodeState(node: DelegationScopeTreeNode): NodeCheckState {\r\n const opKeys = this.opKeyMap().get(node.key) ?? [];\r\n if (!opKeys.length) {\r\n return 'unchecked';\r\n }\r\n const selected = this.selectedKeys();\r\n let count = 0;\r\n for (const key of opKeys) {\r\n if (selected.has(key)) count++;\r\n }\r\n if (count === 0) return 'unchecked';\r\n return count === opKeys.length ? 'checked' : 'indeterminate';\r\n }\r\n\r\n protected onRowClick(node: DelegationScopeTreeNode): void {\r\n if (this.hasChildren(node)) {\r\n this.toggleExpand(node);\r\n } else {\r\n this.toggle(node);\r\n }\r\n }\r\n\r\n protected toggle(node: DelegationScopeTreeNode): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n const opKeys = this.opKeyMap().get(node.key) ?? [];\r\n if (!opKeys.length) {\r\n return;\r\n }\r\n const next = new Set(this.selectedKeys());\r\n const allSelected = opKeys.every((key) => next.has(key));\r\n for (const key of opKeys) {\r\n if (allSelected) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n }\r\n this.applySelection(next);\r\n }\r\n\r\n private applySelection(selected: Set<string>): void {\r\n const index = this.grantIndex();\r\n const facts = this.accessibilityFacts();\r\n const grants = Array.from(selected)\r\n .map((key) => index.get(key))\r\n .filter((grant): grant is DelegationGrant => !!grant)\r\n .map((grant) =>\r\n facts.length ? { ...grant, accessibilities: facts } : grant,\r\n );\r\n this.scope.update((scope) => ({ ...scope, grants }));\r\n }\r\n\r\n protected clearSelection(): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n this.scope.update((scope) => ({ ...scope, grants: [] }));\r\n }\r\n\r\n /** Master \"select all\" toggle in the tree header. */\r\n protected toggleAll(): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n if (this.selectAllState() === 'checked') {\r\n this.clearSelection();\r\n } else {\r\n this.applySelection(new Set(this.allLeafKeys()));\r\n }\r\n }\r\n\r\n protected trackVisible(\r\n _index: number,\r\n item: { node: DelegationScopeTreeNode },\r\n ): string {\r\n return item.node.key;\r\n }\r\n\r\n /**\r\n * Template keys (open by default) plus the ancestor keys of every selected\r\n * operation, so an edit's saved selection is expanded into view. Only valid\r\n * grants (those matching an option node) contribute — invalid saved grants\r\n * have no node and are simply ignored.\r\n */\r\n private collectExpansion(\r\n model: DelegationScopeTreeNode[],\r\n selected: Set<string>,\r\n base: Set<string>,\r\n ): Set<string> {\r\n const keys = new Set(base);\r\n const walk = (\r\n nodes: DelegationScopeTreeNode[],\r\n ancestors: string[],\r\n ): void => {\r\n for (const node of nodes) {\r\n if (node.kind === 'template') {\r\n keys.add(node.key);\r\n }\r\n if (node.kind === 'operation' && selected.has(node.key)) {\r\n for (const ancestor of ancestors) {\r\n keys.add(ancestor);\r\n }\r\n }\r\n if (node.children?.length) {\r\n walk(node.children, [...ancestors, node.key]);\r\n }\r\n }\r\n };\r\n model.forEach((node) => walk([node], []));\r\n return keys;\r\n }\r\n\r\n // --- App accessibility ----------------------------------------------------\r\n protected toggleAccessibility(key: string): void {\r\n if (this.readonly()) {\r\n return;\r\n }\r\n this.selectedAccessibilityKeys.update((set) => {\r\n const next = new Set(set);\r\n if (next.has(key)) {\r\n next.delete(key);\r\n } else {\r\n next.add(key);\r\n }\r\n return next;\r\n });\r\n // Re-apply current selection so grants carry the new accessibility facts.\r\n this.applySelection(new Set(this.selectedKeys()));\r\n }\r\n\r\n protected isAccessibilitySelected(key: string): boolean {\r\n return this.selectedAccessibilityKeys().has(key);\r\n }\r\n\r\n private accessibilityFacts(): DelegationScopeFact[] {\r\n const selected = this.selectedAccessibilityKeys();\r\n if (!selected.size) {\r\n return [];\r\n }\r\n return this.appAccessibilities()\r\n .filter((item) => selected.has(item.accessibilityKey))\r\n .map((item) => ({\r\n key: item.accessibilityKey,\r\n accessibilityKey: item.accessibilityKey,\r\n name: item.name ?? null,\r\n displayName: item.name ?? null,\r\n }));\r\n }\r\n\r\n // --- Labels / preview -----------------------------------------------------\r\n protected nodeLabel(node: DelegationScopeTreeNode): string {\r\n return (\r\n formatDelegationDisplayValue(\r\n node.displayName ?? undefined,\r\n this.currentLanguage(),\r\n ) || humanizeDelegationKey(node.fallbackKey)\r\n );\r\n }\r\n\r\n protected accessibilityLabel(item: DelegationAppAccessibility): string {\r\n return (\r\n formatDelegationDisplayValue(\r\n item.name ?? undefined,\r\n this.currentLanguage(),\r\n ) || humanizeDelegationKey(item.accessibilityKey)\r\n );\r\n }\r\n\r\n protected getPreviewSummary(\r\n summary: DelegationDisplayValue | undefined,\r\n ): string {\r\n return formatDelegationScopeSummary(summary, this.currentLanguage());\r\n }\r\n\r\n protected formatDeniedOperation(value?: string | null): string {\r\n return humanizeDelegationKey(value);\r\n }\r\n\r\n protected formatDeniedTarget(value?: string | null): string {\r\n return humanizeDelegationKey(value);\r\n }\r\n\r\n protected trackNode(_index: number, node: DelegationScopeTreeNode): string {\r\n return node.key;\r\n }\r\n\r\n private currentLanguage(): string {\r\n return this.activeLang() ?? this.transloco.getActiveLang();\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <!-- Reusable tri-state checkbox box -->\r\n <ng-template #checkbox let-state=\"state\">\r\n <span\r\n class=\"flex size-[18px] shrink-0 items-center justify-center rounded-[5px] border transition-colors\"\r\n [class.border-primary-500]=\"state !== 'unchecked'\"\r\n [class.bg-primary-500]=\"state !== 'unchecked'\"\r\n [class.text-white]=\"state !== 'unchecked'\"\r\n [class.border-surface-300]=\"state === 'unchecked'\"\r\n [class.bg-surface-0]=\"state === 'unchecked'\"\r\n >\r\n @if (state === \"checked\") {\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n class=\"size-3\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n } @else if (state === \"indeterminate\") {\r\n <span class=\"h-[2px] w-2.5 rounded-full bg-white\"></span>\r\n }\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n @if (isLoadingOptions()) {\r\n <mt-card [paddingless]=\"true\">\r\n <div class=\"flex flex-col gap-3 p-4\">\r\n <p-skeleton height=\"2.5rem\"></p-skeleton>\r\n @for (item of [0, 1, 2, 3, 4, 5]; track $index) {\r\n <p-skeleton height=\"2rem\"></p-skeleton>\r\n }\r\n </div>\r\n </mt-card>\r\n } @else {\r\n @if (errorOptions(); as errorMessage) {\r\n <div\r\n class=\"rounded-2xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n }\r\n\r\n @if (!hasOptions() && !errorOptions()) {\r\n <mt-card [paddingless]=\"true\">\r\n <div\r\n class=\"flex min-h-72 flex-col items-center justify-center gap-4 px-6 py-8 text-center\"\r\n >\r\n <div\r\n class=\"flex size-16 items-center justify-center rounded-3xl bg-surface-50 text-primary\"\r\n >\r\n <svg\r\n viewBox=\"0 0 64 64\"\r\n class=\"size-9\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect\r\n x=\"10\"\r\n y=\"12\"\r\n width=\"44\"\r\n height=\"38\"\r\n rx=\"12\"\r\n class=\"fill-primary/10 stroke-primary/35\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M21 27H43\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M21 35H37\"\r\n class=\"stroke-primary/70\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"space-y-1\">\r\n <p class=\"text-base font-medium text-surface-900\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </p>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ t(\"delegations.scope.noGrantableOptions\") }}\r\n </p>\r\n </div>\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n @if (hasOptions()) {\r\n <mt-card [paddingless]=\"true\" class=\"overflow-hidden\">\r\n <!-- Inner view switch: Permissions / Pages & accessibility -->\r\n @if (hasAccessibility()) {\r\n <div class=\"border-b border-surface px-3 pt-2.5 pb-0\">\r\n <mt-tabs\r\n mode=\"underline\"\r\n [(active)]=\"activeScopeTab\"\r\n [options]=\"[\r\n {\r\n value: 'permissions',\r\n label: t('delegations.scope.permissionsTab'),\r\n badge: selectedCount() || null,\r\n },\r\n {\r\n value: 'accessibility',\r\n label: t('delegations.scope.accessibilityTitle'),\r\n badge: selectedAccessibilityCount() || null,\r\n },\r\n ]\"\r\n fluid\r\n ></mt-tabs>\r\n </div>\r\n }\r\n\r\n @if (activeScopeTab() === \"permissions\" || !hasAccessibility()) {\r\n <!-- Toolbar: table-style search + clear -->\r\n <div\r\n class=\"flex items-center gap-2 border-b border-surface px-3 py-2\"\r\n >\r\n <div class=\"min-w-0 flex-1\">\r\n <mt-text-field\r\n [ngModel]=\"searchTerm()\"\r\n (ngModelChange)=\"searchTerm.set($event)\"\r\n icon=\"general.search-lg\"\r\n [placeholder]=\"t('delegations.scope.searchPlaceholder')\"\r\n ></mt-text-field>\r\n </div>\r\n @if (selectedCount() > 0) {\r\n <span class=\"shrink-0 text-xs font-medium text-surface-500\">\r\n {{ selectedCount() }} {{ t(\"delegations.scope.selected\") }}\r\n </span>\r\n <mt-button\r\n variant=\"text\"\r\n size=\"small\"\r\n [label]=\"t('delegations.scope.clear')\"\r\n [disabled]=\"readonly()\"\r\n (click)=\"clearSelection()\"\r\n ></mt-button>\r\n }\r\n </div>\r\n\r\n <!-- Select-all header -->\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-center gap-2 border-b border-surface px-3 py-2 text-start hover:bg-surface-50\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"\r\n selectAllState() === 'indeterminate'\r\n ? 'mixed'\r\n : selectAllState() === 'checked'\r\n \"\r\n [disabled]=\"readonly()\"\r\n (click)=\"toggleAll()\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n checkbox;\r\n context: { state: selectAllState() }\r\n \"\r\n ></ng-container>\r\n <span\r\n class=\"text-xs font-semibold uppercase tracking-wide text-surface-500\"\r\n >\r\n {{ t(\"delegations.scope.selectAll\") }}\r\n </span>\r\n </button>\r\n\r\n <!-- Virtualized permission tree -->\r\n @if (visibleNodes().length > 0) {\r\n <cdk-virtual-scroll-viewport\r\n itemSize=\"40\"\r\n class=\"block h-[20rem]\"\r\n >\r\n <div\r\n *cdkVirtualFor=\"\r\n let item of visibleNodes();\r\n trackBy: trackVisible\r\n \"\r\n class=\"group flex h-10 items-center gap-2 pe-2 transition-colors hover:bg-surface-50\"\r\n [style.padding-inline-start.rem]=\"0.5 + item.depth * 1.25\"\r\n >\r\n @if (hasChildren(item.node)) {\r\n <button\r\n type=\"button\"\r\n class=\"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md text-surface-400 hover:bg-surface-100 hover:text-surface-600\"\r\n [attr.aria-expanded]=\"isExpanded(item.node)\"\r\n [attr.aria-label]=\"nodeLabel(item.node)\"\r\n (click)=\"\r\n toggleExpand(item.node); $event.stopPropagation()\r\n \"\r\n >\r\n <mt-icon\r\n [icon]=\"\r\n isExpanded(item.node)\r\n ? 'arrow.chevron-down'\r\n : 'arrow.chevron-right'\r\n \"\r\n styleClass=\"text-base\"\r\n ></mt-icon>\r\n </button>\r\n } @else {\r\n <span class=\"size-6 shrink-0\"></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"\r\n nodeState(item.node) === 'indeterminate'\r\n ? 'mixed'\r\n : nodeState(item.node) === 'checked'\r\n \"\r\n [attr.aria-label]=\"nodeLabel(item.node)\"\r\n class=\"shrink-0\"\r\n [class.cursor-pointer]=\"!readonly()\"\r\n [disabled]=\"readonly()\"\r\n (click)=\"toggle(item.node); $event.stopPropagation()\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n checkbox;\r\n context: { state: nodeState(item.node) }\r\n \"\r\n ></ng-container>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex min-w-0 flex-1 cursor-pointer items-center gap-2 text-start\"\r\n (click)=\"onRowClick(item.node)\"\r\n >\r\n <span\r\n class=\"truncate text-sm\"\r\n [class.font-semibold]=\"item.node.kind === 'template'\"\r\n [class.text-surface-900]=\"item.node.kind === 'template'\"\r\n [class.font-medium]=\"\r\n item.node.kind === 'level' ||\r\n item.node.kind === 'module'\r\n \"\r\n [class.text-surface-800]=\"\r\n item.node.kind === 'level' ||\r\n item.node.kind === 'module'\r\n \"\r\n [class.text-surface-600]=\"item.node.kind === 'operation'\"\r\n >\r\n {{ nodeLabel(item.node) }}\r\n </span>\r\n @if (\r\n item.node.kind === \"operation\" && item.node.isHighRisk\r\n ) {\r\n <span\r\n class=\"shrink-0 rounded-full bg-amber-100 px-2 py-0.5 text-[0.625rem] font-medium text-amber-700\"\r\n >\r\n {{ t(\"delegations.scope.highRisk\") }}\r\n </span>\r\n }\r\n </button>\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n } @else {\r\n <p class=\"px-3 py-8 text-center text-sm text-surface-500\">\r\n {{ t(\"components.table.no-data-found\") }}\r\n </p>\r\n }\r\n } @else {\r\n <!-- App accessibility -->\r\n <div class=\"flex flex-col gap-3 p-4\">\r\n <p class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.scope.accessibilityHint\") }}\r\n </p>\r\n <div class=\"flex flex-wrap gap-2\">\r\n @for (\r\n item of appAccessibilities();\r\n track item.accessibilityKey\r\n ) {\r\n @let selected =\r\n isAccessibilitySelected(item.accessibilityKey);\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex cursor-pointer items-center gap-1.5 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors\"\r\n [class.border-primary-400]=\"selected\"\r\n [class.bg-primary-50]=\"selected\"\r\n [class.text-primary-700]=\"selected\"\r\n [class.border-surface-200]=\"!selected\"\r\n [class.text-surface-600]=\"!selected\"\r\n [class.hover:border-primary-300]=\"!readonly()\"\r\n [disabled]=\"readonly()\"\r\n [attr.aria-pressed]=\"selected\"\r\n (click)=\"toggleAccessibility(item.accessibilityKey)\"\r\n >\r\n <span\r\n class=\"inline-flex size-1.5 rounded-full\"\r\n [class.bg-primary-500]=\"selected\"\r\n [class.bg-surface-300]=\"!selected\"\r\n ></span>\r\n {{ accessibilityLabel(item) }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </mt-card>\r\n }\r\n\r\n <!-- Compact live scope preview -->\r\n <div\r\n class=\"flex flex-col gap-1.5 rounded-lg border border-surface bg-surface-50 px-3 py-2\"\r\n >\r\n <div class=\"flex items-center gap-2 text-xs\">\r\n <span class=\"shrink-0 font-semibold text-surface-700\">\r\n {{ t(\"delegations.scope.previewTitle\") }}:\r\n </span>\r\n @if (isPreviewing()) {\r\n <p-skeleton width=\"8rem\" height=\"0.7rem\"></p-skeleton>\r\n } @else if (preview(); as p) {\r\n @if (p.isValid) {\r\n <span class=\"min-w-0 flex-1 truncate text-surface-900\">\r\n {{\r\n getPreviewSummary(p.summary) ||\r\n t(\"delegations.column.scopeSummary\")\r\n }}\r\n </span>\r\n } @else {\r\n <span class=\"font-medium text-red-700\">\r\n {{ t(\"delegations.scope.previewInvalid\") }}\r\n </span>\r\n }\r\n } @else {\r\n <span class=\"text-surface-500\">\r\n {{ t(\"delegations.scope.noSelection\") }}\r\n </span>\r\n }\r\n </div>\r\n @if (preview(); as p) {\r\n @if (p.warnings.length > 0) {\r\n <ul\r\n class=\"list-inside list-disc space-y-0.5 text-xs text-amber-700\"\r\n >\r\n @for (w of p.warnings; track $index) {\r\n <li>{{ w.message }}</li>\r\n }\r\n </ul>\r\n }\r\n @if (p.deniedItems.length > 0) {\r\n <ul class=\"list-inside list-disc space-y-0.5 text-xs text-red-700\">\r\n @for (d of p.deniedItems; track $index) {\r\n <li>\r\n {{ formatDeniedTarget(d.targetKey) }} /\r\n {{ formatDeniedOperation(d.operationKey) }} -\r\n {{ d.reasonCode }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { HttpContext } from '@angular/common/http';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport {\n DateFieldConfig,\n DynamicFormConfig,\n MultiSelectFieldConfig,\n RadioButtonFieldConfig,\n REQUEST_CONTEXT,\n TextareaFieldConfig,\n ToggleFieldConfig,\n UserSearchFieldConfig,\n ValidatorConfig,\n} from '@masterteam/components';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { ScopePicker } from './scope-picker/scope-picker';\nimport {\n AdminCreateDelegationV2Request,\n AdminUpdateDelegationV2Request,\n CreateDelegationV2Request,\n DelegationRow,\n DelegationScopeSelection,\n UpdateDelegationV2Request,\n} from '../../../store/delegations/delegations.model';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { delegationScopeFingerprint } from '../../../store/delegations/scope-fingerprint';\n\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\n\ninterface DelegationFormUserValue {\n id: string;\n userId: string;\n displayName: string;\n userName: string;\n email?: string | null;\n photo?: string | null;\n isExternal: boolean;\n}\n\nfunction getCurrentDelegatorFromLocalStorage(): DelegationFormUserValue | null {\n if (typeof localStorage === 'undefined') {\n return null;\n }\n\n try {\n const raw = localStorage.getItem('auth');\n if (!raw) return null;\n\n const parsed = JSON.parse(raw) as Record<string, unknown> | null;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const state =\n ((parsed['state'] as Record<string, unknown> | undefined) ?? parsed) ||\n null;\n const userWrapper = state?.['user'] as Record<string, unknown> | undefined;\n const user =\n (userWrapper?.['user'] as Record<string, unknown> | undefined) ??\n userWrapper;\n\n if (!user || typeof user !== 'object') return null;\n\n const id =\n (user['id'] as string | undefined) ??\n (user['userId'] as string | undefined);\n if (!id) return null;\n\n const photo = user['photo'];\n const photoPath =\n typeof photo === 'string'\n ? photo\n : ((photo as { fileName?: string } | undefined)?.fileName ?? null);\n\n return {\n id,\n userId: id,\n displayName:\n (user['displayName'] as string | undefined) ??\n (user['name'] as string | undefined) ??\n (user['userName'] as string | undefined) ??\n '',\n userName: (user['userName'] as string | undefined) ?? '',\n email: (user['email'] as string | undefined) ?? null,\n photo: photoPath,\n isExternal: !!user['isExternal'],\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Backend requires ISO 8601 **UTC** timestamps ending with `Z`\n * (Masterteam.Shared `ISO8601DateTimeConverter`). The date field can emit a\n * `Date` or an offset string like `2026-06-01T13:47:00+00:00`; normalize both\n * to the same instant rendered with `Z` (otherwise the command fails to bind →\n * \"command field is required\").\n */\nfunction toUtcIso(value: unknown): string | undefined {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? undefined : value.toISOString();\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? value : parsed.toISOString();\n }\n return undefined;\n}\n\nfunction extractUserId(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value.trim() || undefined;\n }\n\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n for (const key of ['userId', 'id']) {\n const candidate = record[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return undefined;\n}\n\n/**\n * Delegation create/edit form (doc 04). Uses the v2 explicit-scope endpoints so\n * the persisted `DelegationScopeSelection` matches what scope/preview validated.\n *\n * - Delegator is server-derived; only the delegated user is collected.\n * - On edit, scope grants + rowVersion come from the loaded detail.\n * - Times are sent as UTC instants; Identity resolves the trusted user timezone.\n */\n@Component({\n selector: 'mt-delegation-form',\n standalone: true,\n imports: [\n CommonModule,\n Button,\n DynamicForm,\n ReactiveFormsModule,\n ScopePicker,\n TranslocoDirective,\n ],\n templateUrl: './delegation-form.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationForm implements OnInit {\n readonly delegationForEdit = input<DelegationRow | null>(null);\n readonly readonly = input<boolean>(false);\n /**\n * Admin-managed mode: also collect the Delegator / From user, so an admin can\n * create a delegation between two selected users (Ahmed → Sara). Self-service\n * leaves this false; the delegator defaults to the current user server-side.\n */\n readonly adminMode = input<boolean>(false);\n\n private readonly halfWidth = 'flex flex-col gap-1 lg:col-span-6';\n private readonly fullWidth = 'flex flex-col gap-1 lg:col-span-12';\n\n modal = inject(ModalService);\n ref: ModalRef = inject(ModalRef);\n private readonly transloco = inject(TranslocoService);\n private readonly facade = inject(DelegationsFacade);\n\n delegationFormControl = new FormControl();\n formValue = toSignal(this.delegationFormControl.valueChanges);\n\n detail = this.facade.detail;\n isDetailLoading = this.facade.isLoadingDetail;\n scopePreview = this.facade.scopePreview;\n isPreviewingScope = this.facade.isPreviewingScope;\n isSaving = this.facade.isSaving;\n\n context = new HttpContext().set(REQUEST_CONTEXT, { useBaseUrl: false });\n\n protected readonly scope = signal<DelegationScopeSelection>(EMPTY_SCOPE);\n protected readonly currentDelegator = signal<DelegationFormUserValue | null>(\n getCurrentDelegatorFromLocalStorage(),\n );\n\n /** Floor for both date pickers — captured once so it doesn't drift on recompute. */\n protected readonly now = signal(new Date());\n\n /** Currently-chosen start date, used to floor the end-date picker. */\n protected readonly selectedStartDate = computed<Date | undefined>(() => {\n const value = this.formValue()?.delegateFromDateTime;\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? undefined : value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n return undefined;\n });\n\n /** Selected delegator id drives scope/options loading and the admin payload. */\n protected readonly selectedDelegatorId = computed<string | undefined>(() => {\n if (this.adminMode()) {\n return extractUserId(this.formValue()?.delegateFrom);\n }\n return this.currentDelegator()?.id;\n });\n\n /** Admin mode waits for a chosen delegator; self-service always has one. */\n protected readonly showScopePicker = computed(\n () => !this.adminMode() || !!this.selectedDelegatorId(),\n );\n\n protected readonly specificDaysOptions = signal([\n { label: this.transloco.translate('delegations.days.sunday'), value: 0 },\n { label: this.transloco.translate('delegations.days.monday'), value: 1 },\n { label: this.transloco.translate('delegations.days.tuesday'), value: 2 },\n { label: this.transloco.translate('delegations.days.wednesday'), value: 3 },\n { label: this.transloco.translate('delegations.days.thursday'), value: 4 },\n { label: this.transloco.translate('delegations.days.friday'), value: 5 },\n { label: this.transloco.translate('delegations.days.saturday'), value: 6 },\n ]);\n\n protected readonly formConfig = computed<DynamicFormConfig>(() => ({\n sections: [\n {\n key: 'delegationForm',\n type: 'header',\n bodyClass: 'grid grid-cols-1 gap-4 items-start lg:grid-cols-12',\n order: 1,\n fields: [\n new UserSearchFieldConfig({\n key: 'delegateFrom',\n label: this.transloco.translate('delegations.column.delegatorName'),\n apiUrl: 'Identity/users',\n context: this.context,\n validators: [ValidatorConfig.required()],\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 0,\n disabled:\n this.readonly() ||\n !this.adminMode() ||\n !!this.delegationForEdit(),\n }),\n new UserSearchFieldConfig({\n key: 'delegateTo',\n label: this.transloco.translate('delegations.column.delegatedTo'),\n apiUrl: this.adminMode()\n ? `Identity/delegations/Admin/delegate-candidates?delegatorUserId=${encodeURIComponent(this.selectedDelegatorId() ?? '')}`\n : 'Identity/delegations/delegate-candidates',\n dataKey: 'data.items',\n paramName: 'search',\n minLength: 2,\n context: this.context,\n validators: [ValidatorConfig.required()],\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 1,\n disabled: this.readonly(),\n } as ConstructorParameters<typeof UserSearchFieldConfig>[0]),\n new TextareaFieldConfig({\n key: 'description',\n label: this.transloco.translate('delegations.form.description'),\n placeholder: this.transloco.translate(\n 'delegations.form.description',\n ),\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 2,\n disabled: this.readonly(),\n }),\n new DateFieldConfig({\n key: 'delegateFromDateTime',\n label: this.transloco.translate('delegations.column.startDate'),\n placeholder: this.transloco.translate(\n 'delegations.column.startDate',\n ),\n validators: [ValidatorConfig.required()],\n showTime: true,\n minDate: this.now(),\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 3,\n disabled: this.readonly(),\n }),\n new DateFieldConfig({\n key: 'delegateToDateTime',\n label: this.transloco.translate('delegations.column.endDate'),\n placeholder: this.transloco.translate('delegations.column.endDate'),\n validators: [ValidatorConfig.required()],\n showTime: true,\n // End can't precede the chosen start; fall back to now until a start\n // is picked. Both floors keep past dates non-selectable.\n minDate: this.selectedStartDate() ?? this.now(),\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 4,\n disabled: this.readonly(),\n }),\n new RadioButtonFieldConfig({\n key: 'delegationDaysType',\n label: this.transloco.translate('delegations.form.daysApply'),\n options: [\n {\n label: this.transloco.translate('delegations.form.fullRange'),\n value: 'FullRange',\n },\n {\n label: this.transloco.translate(\n 'delegations.form.specificDays',\n ),\n value: 'SpecificDays',\n },\n ],\n optionLabel: 'label',\n optionValue: 'value',\n validators: [ValidatorConfig.required()],\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 5,\n disabled: this.readonly(),\n }),\n new MultiSelectFieldConfig({\n key: 'specificDays',\n label: this.transloco.translate('delegations.form.specificDays'),\n options: this.specificDaysOptions(),\n optionLabel: 'label',\n optionValue: 'value',\n maxSelectedLabels: 7,\n relations: [\n {\n key: 'delegationDaysType',\n value: 'SpecificDays',\n action: 'show',\n },\n ],\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 6,\n disabled: this.readonly(),\n }),\n new ToggleFieldConfig({\n key: 'requiresApproval',\n label: this.transloco.translate(\n 'delegations.form.requiresApproval',\n ),\n cssClass: `${this.fullWidth} mt-2`,\n order: 7,\n disabled: this.readonly(),\n }),\n ],\n },\n ],\n }));\n\n // Prefill (edit) and default-init (create) must each happen exactly once, so\n // later signal changes (detail re-emits, field edits) never wipe the user's\n // in-progress scope selection or field values.\n private editPrefilled = false;\n private createInitialized = false;\n\n constructor() {\n effect(() => {\n const editing = this.delegationForEdit();\n const d = this.detail();\n untracked(() => {\n if (editing && d && d.row.delegationId === editing.delegationId) {\n if (this.editPrefilled) return;\n this.editPrefilled = true;\n this.delegationFormControl.patchValue({\n delegateFrom: this.mapPartyToUserValue(d.row.delegator),\n delegateTo: d.row.delegatedUser,\n description: d.description ?? '',\n delegateFromDateTime: d.row.startsAtUtc,\n delegateToDateTime: d.row.endsAtUtc,\n delegationDaysType: d.row.dayRuleMode,\n specificDays: d.row.specificDays ?? [],\n requiresApproval: d.row.approval?.requiresApproval ?? false,\n });\n this.scope.set({\n grants: d.scope?.grants ?? [],\n metadata: d.scope?.metadata ?? {},\n });\n } else if (!editing) {\n if (this.createInitialized) return;\n this.createInitialized = true;\n this.delegationFormControl.reset({\n delegateFrom: null,\n delegationDaysType: 'FullRange',\n specificDays: [],\n requiresApproval: true,\n });\n this.scope.set(EMPTY_SCOPE);\n }\n });\n });\n\n effect(() => {\n const currentDelegator = this.currentDelegator();\n if (this.adminMode() || this.delegationForEdit() || !currentDelegator) {\n return;\n }\n\n const existingDelegator = extractUserId(\n this.delegationFormControl.getRawValue()?.delegateFrom,\n );\n if (existingDelegator === currentDelegator.id) {\n return;\n }\n\n this.delegationFormControl.patchValue({\n delegateFrom: currentDelegator,\n });\n });\n }\n\n ngOnInit(): void {\n const editing = this.delegationForEdit();\n if (editing) {\n this.facade.getDetail(editing.delegationId, this.adminMode());\n }\n }\n\n protected readonly canSubmit = computed(() => {\n const value = this.formValue();\n const start = Date.parse(toUtcIso(value?.delegateFromDateTime) ?? '');\n const end = Date.parse(toUtcIso(value?.delegateToDateTime) ?? '');\n const specificDaysValid =\n value?.delegationDaysType !== 'SpecificDays' ||\n (Array.isArray(value?.specificDays) && value.specificDays.length > 0);\n const usersDiffer =\n extractUserId(value?.delegateFrom) !== extractUserId(value?.delegateTo);\n const currentScope = this.scope();\n return (\n !this.readonly() &&\n Number.isFinite(start) &&\n Number.isFinite(end) &&\n start < end &&\n end > Date.now() &&\n specificDaysValid &&\n usersDiffer &&\n currentScope.grants.length > 0 &&\n !!this.scopePreview()?.isValid &&\n this.facade.scopePreviewFingerprint() ===\n delegationScopeFingerprint(currentScope) &&\n !this.isPreviewingScope()\n );\n });\n\n onSubmit(): void {\n if (this.readonly() || !this.delegationFormControl.valid) return;\n if (!this.canSubmit()) return;\n\n const value = this.delegationFormControl.getRawValue();\n const scope = this.scope();\n const delegationDaysType = (value?.delegationDaysType ?? 'FullRange') as\n | 'FullRange'\n | 'SpecificDays';\n const specificDays =\n delegationDaysType === 'SpecificDays' ? (value?.specificDays ?? []) : [];\n const description = value?.description;\n const delegateFromDateTime = toUtcIso(value?.delegateFromDateTime) ?? '';\n const delegateToDateTime = toUtcIso(value?.delegateToDateTime) ?? '';\n const requiresApproval = !!value?.requiresApproval;\n const delegatedUserId = extractUserId(value?.delegateTo) ?? '';\n const selectedDelegatorId = this.selectedDelegatorId();\n\n const editing = this.delegationForEdit();\n if (this.adminMode()) {\n if (!selectedDelegatorId || !delegatedUserId) {\n return;\n }\n\n const base: AdminCreateDelegationV2Request = {\n delegatorUserId: selectedDelegatorId,\n delegatedUserId,\n description,\n delegateFromDateTime,\n delegateToDateTime,\n delegationDaysType,\n specificDays,\n requiresApproval,\n scope,\n };\n\n if (editing) {\n const latestRowVersion =\n this.detail()?.row?.rowVersion ?? editing.rowVersion;\n const req: AdminUpdateDelegationV2Request = {\n ...base,\n rowVersion: latestRowVersion,\n };\n this.facade.updateV2(editing.delegationId, req, true).subscribe({\n next: () => this.ref.close(true),\n });\n return;\n }\n\n this.facade.createV2(base, true).subscribe({\n next: () => this.ref.close(true),\n });\n return;\n }\n\n const base: CreateDelegationV2Request = {\n delegateFrom: null,\n delegateTo: delegatedUserId,\n description,\n delegateFromDateTime,\n delegateToDateTime,\n delegationDaysType,\n specificDays,\n requiresApproval,\n scope,\n };\n\n if (editing) {\n // Prefer the freshest rowVersion from the loaded detail (the form loads\n // detail on open); fall back to the list row only if detail is absent.\n const latestRowVersion =\n this.detail()?.row?.rowVersion ?? editing.rowVersion;\n const req: UpdateDelegationV2Request = {\n ...base,\n rowVersion: latestRowVersion,\n };\n this.facade.updateV2(editing.delegationId, req).subscribe({\n next: () => this.ref.close(true),\n });\n } else {\n const req: CreateDelegationV2Request = base;\n this.facade.createV2(req).subscribe({\n next: () => this.ref.close(true),\n });\n }\n }\n\n private mapPartyToUserValue(\n party: DelegationRow['delegator'],\n ): DelegationFormUserValue {\n return {\n id: party.userId,\n userId: party.userId,\n displayName: party.displayName,\n userName: party.email || party.displayName,\n email: party.email ?? null,\n photo: null,\n isExternal: false,\n };\n }\n}\n","<ng-container *transloco=\"let t\">\r\n <div\r\n [class]=\"\r\n 'flex h-full min-h-0 min-w-0 flex-col overflow-hidden ' +\r\n modal.contentClass\r\n \"\r\n >\r\n <div\r\n class=\"grid min-h-0 flex-1 gap-4 overflow-y-auto p-4 max-[640px]:p-3 lg:grid-cols-2 lg:items-start\"\r\n >\r\n <section\r\n class=\"flex flex-col gap-4 rounded-3xl border border-surface-200 bg-surface-0 p-4 shadow-xs lg:sticky lg:top-0\"\r\n >\r\n <mt-dynamic-form\r\n [formConfig]=\"formConfig()\"\r\n [formControl]=\"delegationFormControl\"\r\n />\r\n </section>\r\n\r\n <section class=\"flex min-h-0 flex-col gap-3\">\r\n <div class=\"flex flex-col gap-1\">\r\n <h3 class=\"text-xl font-semibold text-surface-900\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </h3>\r\n <p class=\"text-sm text-surface-500\">\r\n {{\r\n adminMode() && !showScopePicker()\r\n ? t(\"delegations.form.selectDelegatorFirst\")\r\n : t(\"delegations.scope.permissionsSubtitle\")\r\n }}\r\n </p>\r\n </div>\r\n\r\n @if (showScopePicker()) {\r\n <mt-scope-picker\r\n [(scope)]=\"scope\"\r\n [readonly]=\"readonly()\"\r\n [adminMode]=\"adminMode()\"\r\n [delegatorUserId]=\"selectedDelegatorId()\"\r\n ></mt-scope-picker>\r\n } @else {\r\n <div\r\n class=\"flex min-h-72 flex-col items-center justify-center gap-4 rounded-3xl border border-dashed border-surface-300 bg-surface-50 px-6 py-8 text-center\"\r\n >\r\n <div\r\n class=\"flex size-18 items-center justify-center rounded-3xl bg-surface-0 text-primary shadow-sm\"\r\n >\r\n <svg\r\n viewBox=\"0 0 64 64\"\r\n class=\"size-10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect\r\n x=\"10\"\r\n y=\"12\"\r\n width=\"44\"\r\n height=\"40\"\r\n rx=\"12\"\r\n class=\"fill-primary/10 stroke-primary/35\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M22 28H42\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M22 36H34\"\r\n class=\"stroke-primary/70\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <circle\r\n cx=\"45\"\r\n cy=\"20\"\r\n r=\"7\"\r\n class=\"fill-surface-0 stroke-primary\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M45 17V23\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M42 20H48\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"space-y-1\">\r\n <p class=\"text-base font-medium text-surface-900\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </p>\r\n <p class=\"text-sm text-surface-500\">\r\n {{ t(\"delegations.form.selectDelegatorFirst\") }}\r\n </p>\r\n </div>\r\n </div>\r\n }\r\n </section>\r\n </div>\r\n </div>\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('delegations.common.cancel')\"\r\n variant=\"outlined\"\r\n (click)=\"ref.close()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n />\r\n @if (!readonly()) {\r\n <mt-button\r\n [label]=\"\r\n delegationForEdit()\r\n ? t('delegations.common.update')\r\n : t('delegations.common.create')\r\n \"\r\n [loading]=\"isSaving()\"\r\n [disabled]=\"!delegationFormControl.valid || !canSubmit()\"\r\n (click)=\"onSubmit()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n />\r\n }\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EntityPreview } from '@masterteam/components/entities';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\r\nimport type {\r\n DelegationDisplayValue,\r\n DelegationParty,\r\n DelegationScopeViewLevel,\r\n DelegationScopeViewModule,\r\n DelegationScopeViewOperation,\r\n DelegationScopeViewTemplate,\r\n} from '../../../store/delegations/delegations.model';\r\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\r\nimport {\r\n formatDelegationDisplayValue,\r\n humanizeDelegationKey,\r\n} from '../delegation-scope-display';\r\nimport { toDelegationUserEntity } from '../delegation-user-entity';\r\n\r\ntype DetailTab = 'overview' | 'scope';\r\ntype ScopeViewNode =\r\n | {\r\n kind: 'template';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n depth: number;\r\n children: ScopeViewNode[];\r\n }\r\n | {\r\n kind: 'level';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n depth: number;\r\n children: ScopeViewNode[];\r\n }\r\n | {\r\n kind: 'module';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n depth: number;\r\n children: ScopeViewNode[];\r\n }\r\n | {\r\n kind: 'operation';\r\n key: string;\r\n label: string;\r\n fallbackKey?: string | null;\r\n isAvailable: boolean;\r\n isHighRisk: boolean;\r\n depth: number;\r\n };\r\n\r\n/**\r\n * Read-only drawer that shows `DelegationDetail` row/status plus saved scope\r\n * from `scopeView`. The persisted `scope.grants` shape is not parsed for\r\n * display; it remains a backend validation/persistence shape.\r\n */\r\n@Component({\r\n selector: 'mt-delegation-detail-drawer',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Button,\r\n EntityPreview,\r\n SkeletonModule,\r\n Tabs,\r\n TranslocoDirective,\r\n DelegationStatusChip,\r\n ],\r\n templateUrl: './delegation-detail-drawer.html',\r\n styleUrls: ['./delegation-detail-drawer.css'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationDetailDrawer implements OnInit {\r\n readonly delegationId = input.required<number>();\r\n readonly adminMode = input<boolean>(false);\r\n\r\n private readonly facade = inject(DelegationsFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly ref: ModalRef = inject(ModalRef);\r\n\r\n protected readonly activeTab = signal<DetailTab>('overview');\r\n protected readonly tabOptions = computed(() => [\r\n {\r\n value: 'overview' as DetailTab,\r\n label: this.transloco.translate('delegations.tabs.overview'),\r\n },\r\n {\r\n value: 'scope' as DetailTab,\r\n label: this.transloco.translate('delegations.column.scopeSummary'),\r\n },\r\n ]);\r\n\r\n private readonly weekdayKeys = [\r\n 'sunday',\r\n 'monday',\r\n 'tuesday',\r\n 'wednesday',\r\n 'thursday',\r\n 'friday',\r\n 'saturday',\r\n ] as const;\r\n\r\n protected readonly isLoading = this.facade.isLoadingDetail;\r\n protected readonly detail = this.facade.detail;\r\n protected readonly row = computed(() => this.detail()?.row ?? null);\r\n protected readonly scopeNodes = computed(() =>\r\n this.buildScopeViewTree(this.detail()?.scopeView?.templates),\r\n );\r\n protected readonly scopeVisibleNodes = computed(() =>\r\n this.flattenScopeNodes(this.scopeNodes()),\r\n );\r\n protected readonly selectedOperationCount = computed(\r\n () =>\r\n this.scopeVisibleNodes().filter((node) => node.kind === 'operation')\r\n .length,\r\n );\r\n\r\n ngOnInit(): void {\r\n this.facade.getDetail(this.delegationId(), this.adminMode());\r\n }\r\n\r\n protected formatSpecificDays(\r\n days: readonly number[] | null | undefined,\r\n ): string {\r\n if (!days?.length) {\r\n return this.transloco.translate('delegations.form.fullRange');\r\n }\r\n return days\r\n .filter((d) => d >= 0 && d < this.weekdayKeys.length)\r\n .map((d) =>\r\n this.transloco.translate(`delegations.days.${this.weekdayKeys[d]}`),\r\n )\r\n .join(', ');\r\n }\r\n\r\n protected approvalLabel(): string {\r\n const s = this.row()?.approval?.approvalStatus ?? 'NotRequired';\r\n return this.transloco.translate(`delegations.approvalStatus.${s}`);\r\n }\r\n\r\n protected userEntity(party: DelegationParty, label?: string) {\r\n return toDelegationUserEntity(party, { label });\r\n }\r\n\r\n protected hasChildren(node: ScopeViewNode): boolean {\r\n return 'children' in node && node.children.length > 0;\r\n }\r\n\r\n protected trackScopeNode(_index: number, node: ScopeViewNode): string {\r\n return node.key;\r\n }\r\n\r\n private buildScopeViewTree(\r\n templates: DelegationScopeViewTemplate[] | null | undefined,\r\n ): ScopeViewNode[] {\r\n return this.toArray(templates)\r\n .map((template) => this.toTemplateNode(template))\r\n .filter((node) => this.hasScopeChildren(node));\r\n }\r\n\r\n private flattenScopeNodes(nodes: ScopeViewNode[]): ScopeViewNode[] {\r\n const out: ScopeViewNode[] = [];\r\n const walk = (items: ScopeViewNode[]): void => {\r\n for (const node of items) {\r\n out.push(node);\r\n if ('children' in node) {\r\n walk(node.children);\r\n }\r\n }\r\n };\r\n walk(nodes);\r\n return out;\r\n }\r\n\r\n private toTemplateNode(template: DelegationScopeViewTemplate): ScopeViewNode {\r\n const key = `tpl:${template.groupKey}`;\r\n return {\r\n kind: 'template',\r\n key,\r\n label: this.displayLabel(template.name, template.groupKey),\r\n fallbackKey: template.groupKey,\r\n isAvailable: template.isAvailable !== false,\r\n depth: 0,\r\n children: this.toArray(template.levels).flatMap((level) =>\r\n this.toLevelNodes(level),\r\n ),\r\n };\r\n }\r\n\r\n private toLevelNodes(level: DelegationScopeViewLevel): ScopeViewNode[] {\r\n const operationNodes = this.toArray(level.operations)\r\n .filter((operation) => operation.selected !== false)\r\n .map((operation) => this.toOperationNode(operation, level.targetKey, 2));\r\n const moduleNodes = this.toArray(level.modules)\r\n .map((module) => this.toModuleNode(module))\r\n .filter((node) => this.hasScopeChildren(node));\r\n const children = [...operationNodes, ...moduleNodes];\r\n\r\n if (children.length === 0) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n kind: 'level',\r\n key: `lvl:${level.applicationKey}:${level.targetKey}`,\r\n label: this.displayLabel(level.name, level.targetKey),\r\n fallbackKey: level.targetKey,\r\n isAvailable: level.isAvailable !== false,\r\n depth: 1,\r\n children,\r\n },\r\n ];\r\n }\r\n\r\n private toModuleNode(module: DelegationScopeViewModule): ScopeViewNode {\r\n return {\r\n kind: 'module',\r\n key: `mod:${module.applicationKey}:${module.targetKey}`,\r\n label: this.displayLabel(module.name, module.targetKey),\r\n fallbackKey: module.targetKey,\r\n isAvailable: module.isAvailable !== false,\r\n depth: 2,\r\n children: this.toArray(module.operations)\r\n .filter((operation) => operation.selected !== false)\r\n .map((operation) =>\r\n this.toOperationNode(operation, module.targetKey, 3),\r\n ),\r\n };\r\n }\r\n\r\n private toOperationNode(\r\n operation: DelegationScopeViewOperation,\r\n parentKey: string,\r\n depth: number,\r\n ): ScopeViewNode {\r\n return {\r\n kind: 'operation',\r\n key: `op:${parentKey}:${operation.operationKey}`,\r\n label: this.displayLabel(\r\n operation.name ?? operation.displayName,\r\n operation.operationKey,\r\n ),\r\n fallbackKey: operation.operationKey,\r\n isAvailable: operation.isAvailable !== false,\r\n isHighRisk: operation.isHighRisk ?? false,\r\n depth,\r\n };\r\n }\r\n\r\n private displayLabel(\r\n value: DelegationDisplayValue | undefined,\r\n fallbackKey?: string | null,\r\n ): string {\r\n return (\r\n formatDelegationDisplayValue(value, this.transloco.getActiveLang()) ||\r\n humanizeDelegationKey(fallbackKey)\r\n );\r\n }\r\n\r\n private toArray<T>(value: T[] | null | undefined): T[] {\r\n return Array.isArray(value) ? value : [];\r\n }\r\n\r\n private hasScopeChildren(\r\n node: ScopeViewNode,\r\n ): node is Extract<ScopeViewNode, { children: ScopeViewNode[] }> {\r\n return 'children' in node && node.children.length > 0;\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <div class=\"flex flex-col h-full\">\r\n <!-- Tabs -->\r\n <div class=\"border-b border-surface-200 px-4 pt-2\">\r\n <mt-tabs\r\n mode=\"underline\"\r\n [(active)]=\"activeTab\"\r\n [options]=\"tabOptions()\"\r\n fluid\r\n ></mt-tabs>\r\n </div>\r\n\r\n <!-- Body -->\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (isLoading() && !detail()) {\r\n <p-skeleton height=\"2rem\" class=\"mb-3\"></p-skeleton>\r\n <p-skeleton height=\"6rem\" class=\"mb-3\"></p-skeleton>\r\n <p-skeleton height=\"6rem\"></p-skeleton>\r\n } @else if (detail(); as d) {\r\n @if (activeTab() === \"overview\") {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex items-center justify-between gap-3\">\r\n <div class=\"flex items-center gap-3 min-w-0\">\r\n <mt-entity-preview\r\n [data]=\"\r\n userEntity(\r\n d.row.delegator,\r\n t('delegations.column.delegatorName')\r\n )\r\n \"\r\n ></mt-entity-preview>\r\n </div>\r\n <mt-delegation-status-chip\r\n [status]=\"d.status.effectiveStatus\"\r\n [reasonCode]=\"d.status.reasonCode\"\r\n ></mt-delegation-status-chip>\r\n </div>\r\n\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col\">\r\n <mt-entity-preview\r\n [data]=\"\r\n userEntity(\r\n d.row.delegatedUser,\r\n t('delegations.column.delegatedTo')\r\n )\r\n \"\r\n ></mt-entity-preview>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.approval\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">{{\r\n approvalLabel()\r\n }}</span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.startDate\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">\r\n {{ d.row.startsAtUtc | date: \"medium\" }}\r\n </span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.endDate\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">\r\n {{ d.row.endsAtUtc | date: \"medium\" }}\r\n </span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.form.timeZone\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">{{\r\n d.row.timeZoneId\r\n }}</span>\r\n </div>\r\n <div class=\"flex flex-col\">\r\n <span class=\"text-xs text-surface-500\">\r\n {{ t(\"delegations.column.days\") }}\r\n </span>\r\n <span class=\"text-sm text-surface-900\">\r\n @if (d.row.dayRuleMode === \"FullRange\") {\r\n {{ t(\"delegations.form.fullRange\") }}\r\n } @else {\r\n {{ formatSpecificDays(d.row.specificDays) }}\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n @if (d.row.cancellation?.cancellationReason) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3 text-sm text-surface-800\"\r\n >\r\n <div class=\"font-medium\">\r\n {{ t(\"delegations.form.cancellationReason\") }}\r\n </div>\r\n <div>{{ d.row.cancellation.cancellationReason }}</div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Scope tab -->\r\n <div\r\n class=\"flex flex-col overflow-hidden rounded-lg border border-surface\"\r\n >\r\n <div\r\n class=\"flex items-center justify-between gap-2 border-b border-surface bg-surface-50 px-3 py-2\"\r\n >\r\n <span class=\"text-xs font-semibold uppercase text-surface-500\">\r\n {{ t(\"delegations.scope.permissionsTitle\") }}\r\n </span>\r\n @if (selectedOperationCount() > 0) {\r\n <span class=\"text-xs font-medium text-surface-500\">\r\n {{ selectedOperationCount() }}\r\n {{ t(\"delegations.scope.selected\") }}\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (scopeVisibleNodes().length > 0) {\r\n <div class=\"flex max-h-[34rem] flex-col overflow-y-auto\">\r\n @for (\r\n node of scopeVisibleNodes();\r\n track trackScopeNode($index, node)\r\n ) {\r\n <div\r\n class=\"group flex min-h-10 items-center gap-2 pe-3 transition-colors hover:bg-surface-50\"\r\n [style.padding-inline-start.rem]=\"0.75 + node.depth * 1.25\"\r\n >\r\n @if (hasChildren(node)) {\r\n <span\r\n class=\"flex size-6 shrink-0 items-center justify-center rounded-md text-surface-400\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg\r\n viewBox=\"0 0 20 20\"\r\n class=\"size-4\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M5 7L10 12L15 7\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </span>\r\n } @else {\r\n <span class=\"size-6 shrink-0\"></span>\r\n }\r\n\r\n <span\r\n class=\"flex size-[18px] shrink-0 items-center justify-center rounded-[5px] border border-primary-500 bg-primary-500 text-white\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n class=\"size-3\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </span>\r\n\r\n <span\r\n class=\"min-w-0 flex-1 truncate text-sm\"\r\n [class.font-semibold]=\"node.kind === 'template'\"\r\n [class.text-surface-900]=\"node.kind === 'template'\"\r\n [class.font-medium]=\"\r\n node.kind === 'level' || node.kind === 'module'\r\n \"\r\n [class.text-surface-800]=\"\r\n node.kind === 'level' || node.kind === 'module'\r\n \"\r\n [class.text-surface-600]=\"node.kind === 'operation'\"\r\n >\r\n {{ node.label }}\r\n </span>\r\n\r\n @if (node.kind === \"operation\" && node.isHighRisk) {\r\n <span\r\n class=\"shrink-0 rounded-full bg-amber-100 px-2 py-0.5 text-[0.625rem] font-medium text-amber-700\"\r\n >\r\n {{ t(\"delegations.scope.highRisk\") }}\r\n </span>\r\n }\r\n\r\n @if (!node.isAvailable) {\r\n <span\r\n class=\"shrink-0 rounded-full bg-surface-100 px-2 py-0.5 text-[0.625rem] font-medium text-surface-500\"\r\n >\r\n {{ t(\"delegations.scope.unavailable\") }}\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <p class=\"px-3 py-8 text-center text-sm text-surface-500\">\r\n {{ t(\"delegations.scope.noSelection\") }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"border-t border-surface-200 px-4 py-3 flex items-center justify-end\"\r\n >\r\n <mt-button\r\n [label]=\"t('delegations.common.cancel')\"\r\n variant=\"outlined\"\r\n (click)=\"ref.close()\"\r\n ></mt-button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule, Location } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n numberAttribute,\r\n OnInit,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Table } from '@masterteam/components/table';\r\nimport type {\r\n ColumnDef,\r\n TableAction,\r\n TableStatusMapValue,\r\n} from '@masterteam/components/table';\r\nimport { finalize } from 'rxjs';\r\nimport {\r\n DelegationAllowedAction,\r\n DelegationEffectiveStatus,\r\n DelegationListQuery,\r\n DelegationRow,\r\n} from '../../../store/delegations/delegations.model';\r\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\r\nimport DelegationForm from '../delegation-form/delegation-form';\r\nimport DelegationDetailDrawer from '../delegation-detail-drawer/delegation-detail-drawer';\r\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\r\nimport RejectDelegationDialog from '../reject-delegation-dialog/reject-delegation-dialog';\r\nimport { toDelegationUserValue } from '../delegation-user-entity';\r\n\r\ntype DelegationTab = 'my' | 'assigned' | 'approvals';\r\n\r\ntype DelegationTableRow = DelegationRow & {\r\n displayStatus: DelegationEffectiveStatus | 'InactiveToday';\r\n listedUser: ReturnType<typeof toDelegationUserValue>;\r\n delegatorUser: ReturnType<typeof toDelegationUserValue>;\r\n delegatedToUser: ReturnType<typeof toDelegationUserValue>;\r\n createdByUser: ReturnType<typeof toDelegationUserValue>;\r\n daysText: string;\r\n};\r\n\r\nfunction defaultTrueBooleanAttribute(value: unknown): boolean {\r\n return value === undefined || value === null ? true : booleanAttribute(value);\r\n}\r\n\r\nfunction defaultRouteInput<T>(fallback: T): (value: unknown) => T {\r\n return (value) =>\r\n value === undefined || value === null ? fallback : (value as T);\r\n}\r\n\r\nconst DELEGATION_TABS: readonly DelegationTab[] = [\r\n 'my',\r\n 'assigned',\r\n 'approvals',\r\n];\r\n\r\n/** Route param → a valid tab, or null when absent/unknown (host redirects to default). */\r\nfunction normalizeTab(value: unknown): DelegationTab | null {\r\n return DELEGATION_TABS.includes(value as DelegationTab)\r\n ? (value as DelegationTab)\r\n : null;\r\n}\r\n\r\n/** Query param (string) → number, or null when absent/non-numeric. */\r\nfunction toNullableNumber(value: unknown): number | null {\r\n if (value === undefined || value === null || value === '') return null;\r\n const n = numberAttribute(value, NaN);\r\n return Number.isNaN(n) ? null : n;\r\n}\r\n\r\n/**\r\n * Delegations portal page (doc 02, 09): two lists — My Delegations (current user\r\n * is delegator) and Delegated To Me (current user is delegate). Rows render only\r\n * the BE-returned `allowedActions`; status comes from `effectiveStatus`.\r\n */\r\n@Component({\r\n selector: 'mt-delegations-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n Breadcrumb,\r\n Card,\r\n Page,\r\n Table,\r\n Tabs,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './delegations-list.html',\r\n styleUrl: './delegations-list.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class DelegationsList implements OnInit {\r\n /**\r\n * Admin/control-panel breadcrumb. Hidden on the client self-service surface\r\n * (its links point at /control-panel/*). Bound from route data via\r\n * `withComponentInputBinding()` — admin leaves it default; client passes\r\n * `data: { showBreadcrumb: false }`.\r\n */\r\n readonly showBreadcrumb = input<boolean, unknown>(true, {\r\n transform: defaultTrueBooleanAttribute,\r\n });\r\n\r\n /**\r\n * Admin routes can embed the list under `mt-delegations`, which already owns\r\n * the page title, back button, and route tabs.\r\n */\r\n readonly showPageShell = input<boolean, unknown>(true, {\r\n transform: defaultTrueBooleanAttribute,\r\n });\r\n\r\n /**\r\n * Admin-managed surface: the create/edit form also collects the Delegator /\r\n * From user (admin creates a delegation between two users). Client\r\n * self-service leaves this false. Bound from route data via\r\n * `withComponentInputBinding()` — admin passes `data: { adminMode: true }`.\r\n */\r\n readonly adminMode = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly surfaceTitleKey = input<string, unknown>('delegations.title', {\r\n transform: defaultRouteInput('delegations.title'),\r\n });\r\n readonly assignedTabLabelKey = input<string, unknown>(\r\n 'delegations.delegatedToMe',\r\n {\r\n transform: defaultRouteInput('delegations.delegatedToMe'),\r\n },\r\n );\r\n readonly assignedDecisionTab = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly assignedEmptyStateKey = input<string, unknown>(\r\n 'delegations.empty.assigned',\r\n {\r\n transform: defaultRouteInput('delegations.empty.assigned'),\r\n },\r\n );\r\n readonly assignedStatus = input<DelegationEffectiveStatus | null>(null);\r\n readonly showApprovalTab = input<boolean, unknown>(true, {\r\n transform: defaultTrueBooleanAttribute,\r\n });\r\n readonly approvalTabLabelKey = input<string, unknown>(\r\n 'delegations.tabs.approvals',\r\n {\r\n transform: defaultRouteInput('delegations.tabs.approvals'),\r\n },\r\n );\r\n readonly approvalEmptyStateKey = input<string, unknown>(\r\n 'delegations.empty.pending',\r\n {\r\n transform: defaultRouteInput('delegations.empty.pending'),\r\n },\r\n );\r\n readonly approvalStatus = input<DelegationEffectiveStatus, unknown>(\r\n 'PendingApproval',\r\n {\r\n transform:\r\n defaultRouteInput<DelegationEffectiveStatus>('PendingApproval'),\r\n },\r\n );\r\n\r\n /**\r\n * Route-driven mode (client self-service): the active tab is the `:tab` route\r\n * segment and the open drawer is a `?view=`/`?edit=` query param, so tabs and\r\n * drawers are deep-linkable + back-button aware. When false (admin/default),\r\n * tabs and drawers are managed internally exactly as before.\r\n */\r\n readonly routed = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n /** Bound from the `:tab` route param via `withComponentInputBinding()`. */\r\n readonly tab = input<DelegationTab | null, unknown>(null, {\r\n transform: normalizeTab,\r\n });\r\n /** Bound from the `?view=<id>` query param (detail drawer). */\r\n readonly view = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n /** Back-compatible notification deep-link aliases for opening details. */\r\n readonly selected = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly itemSelected = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly selectedItemId = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly selectedItem = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly itemId = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n readonly delegationId = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n /** Bound from the `?edit=<id>` query param (edit drawer). */\r\n readonly edit = input<number | null, unknown>(null, {\r\n transform: toNullableNumber,\r\n });\r\n\r\n private readonly facade = inject(DelegationsFacade);\r\n private readonly location = inject(Location);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n protected readonly breadcrumbItems = linkedSignal(() => [\r\n {\r\n label: '',\r\n icon: 'general.home-line',\r\n routerLink: '/control-panel/workspaces',\r\n },\r\n {\r\n label: this.transloco.translate('product-settings.product-settings'),\r\n routerLink: '/control-panel/product-settings',\r\n },\r\n {\r\n label: this.transloco.translate('delegations.title'),\r\n },\r\n ]);\r\n\r\n protected readonly activeTab = signal<DelegationTab>('my');\r\n protected readonly surfaceTitle = computed(() =>\r\n this.transloco.translate(this.surfaceTitleKey()),\r\n );\r\n\r\n protected readonly isLoading = computed(() =>\r\n this.adminMode()\r\n ? this.facade.isLoadingAdmin()\r\n : this.activeTab() === 'my'\r\n ? this.facade.isLoadingMy()\r\n : this.activeTab() === 'approvals'\r\n ? this.facade.isLoadingApprovals()\r\n : this.facade.isLoadingAssigned(),\r\n );\r\n protected readonly rows = computed(() =>\r\n this.adminMode()\r\n ? this.facade.adminItems()\r\n : this.activeTab() === 'my'\r\n ? this.facade.myItems()\r\n : this.activeTab() === 'approvals'\r\n ? this.facade.approvalItems()\r\n : this.facade.assignedItems(),\r\n );\r\n protected readonly currentPage = computed(() =>\r\n this.adminMode()\r\n ? this.facade.adminPage()\r\n : this.activeTab() === 'my'\r\n ? this.facade.myPage()\r\n : this.activeTab() === 'approvals'\r\n ? this.facade.approvalsPage()\r\n : this.facade.assignedPage(),\r\n );\r\n private readonly currentQuery = signal<DelegationListQuery>({\r\n page: 1,\r\n pageSize: 25,\r\n });\r\n protected readonly tableRows = computed<DelegationTableRow[]>(() =>\r\n this.rows().map((row) => ({\r\n ...row,\r\n displayStatus:\r\n row.effectiveStatus === 'Scheduled' &&\r\n row.statusReasonCode === 'InactiveToday'\r\n ? 'InactiveToday'\r\n : row.effectiveStatus,\r\n listedUser: toDelegationUserValue(this.getListedParty(row)),\r\n delegatorUser: toDelegationUserValue(row.delegator),\r\n delegatedToUser: toDelegationUserValue(row.delegatedUser),\r\n createdByUser: toDelegationUserValue(row.createdBy),\r\n daysText: this.formatDays(row),\r\n })),\r\n );\r\n protected readonly emptyStateKey = computed(() =>\r\n this.adminMode()\r\n ? 'components.table.no-data-found'\r\n : this.activeTab() === 'my'\r\n ? 'delegations.empty.my'\r\n : this.activeTab() === 'approvals'\r\n ? this.approvalEmptyStateKey()\r\n : this.assignedEmptyStateKey(),\r\n );\r\n private readonly detailQueryId = computed(\r\n () =>\r\n this.view() ??\r\n this.selected() ??\r\n this.itemSelected() ??\r\n this.selectedItemId() ??\r\n this.selectedItem() ??\r\n this.itemId() ??\r\n this.delegationId(),\r\n );\r\n\r\n protected readonly tableActions = computed<TableAction[]>(() => [\r\n {\r\n icon: 'general.plus',\r\n label: this.transloco.translate('delegations.action.create'),\r\n color: 'primary',\r\n action: () => this.openForm(null),\r\n },\r\n ]);\r\n\r\n protected readonly rowActions = signal<TableAction[]>([\r\n {\r\n icon: 'general.eye',\r\n tooltip: this.transloco.translate('delegations.action.view'),\r\n color: 'primary',\r\n variant: 'outlined',\r\n action: (row: DelegationRow) => this.onView(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'View'),\r\n },\r\n {\r\n icon: 'custom.pencil',\r\n tooltip: this.transloco.translate('delegations.action.edit'),\r\n color: 'primary',\r\n action: (row: DelegationRow) => this.onEdit(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Edit'),\r\n },\r\n {\r\n icon: 'general.check',\r\n tooltip: this.transloco.translate('delegations.action.approve'),\r\n color: 'primary',\r\n action: (row: DelegationRow) => this.approve(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Approve'),\r\n loading: (row: DelegationRow) =>\r\n this.busyIds().includes(`approve:${row.delegationId}`),\r\n confirmation: { type: 'popup' },\r\n },\r\n {\r\n icon: 'general.x-close',\r\n tooltip: this.transloco.translate('delegations.action.reject'),\r\n color: 'danger',\r\n variant: 'outlined',\r\n // Opens a dialog that collects a required reason (no inline popup confirm).\r\n action: (row: DelegationRow) => this.reject(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Reject'),\r\n },\r\n {\r\n icon: 'general.trash-01',\r\n tooltip: this.transloco.translate('delegations.action.cancel'),\r\n color: 'danger',\r\n variant: 'outlined',\r\n action: (row: DelegationRow) => this.cancel(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'Cancel'),\r\n loading: (row: DelegationRow) =>\r\n this.busyIds().includes(`cancel:${row.delegationId}`),\r\n confirmation: {\r\n type: 'popup',\r\n message: this.transloco.translate('delegations.confirm.cancel'),\r\n icon: 'general.x-circle',\r\n acceptButton: { severity: 'danger' },\r\n },\r\n },\r\n {\r\n icon: 'arrow.arrow-right',\r\n tooltip: this.transloco.translate('delegations.action.startSession'),\r\n color: 'primary',\r\n action: (row: DelegationRow) => this.startSession(row),\r\n hidden: (row: DelegationRow) => !this.has(row, 'StartSession'),\r\n },\r\n ]);\r\n\r\n /**\r\n * Table status accent colors. Kept in visual sync with the canonical palette\r\n * in `delegation-status-chip` (its light-mode text colors) so the list table\r\n * and the status chip render the same hue for each status.\r\n */\r\n private readonly statusColors: Record<\r\n DelegationEffectiveStatus | 'InactiveToday',\r\n string\r\n > = {\r\n Active: '#166534',\r\n Scheduled: '#1e40af',\r\n PendingApproval: '#854d0e',\r\n InactiveToday: '#1e40af',\r\n Expired: '#4b5563',\r\n Rejected: '#991b1b',\r\n Cancelled: '#374151',\r\n };\r\n\r\n protected readonly statusMap = linkedSignal<\r\n Record<DelegationEffectiveStatus | 'InactiveToday', TableStatusMapValue>\r\n >(() => ({\r\n Active: {\r\n display: this.transloco.translate('delegations.status.active'),\r\n color: this.statusColors.Active,\r\n },\r\n Scheduled: {\r\n display: this.transloco.translate('delegations.status.scheduled'),\r\n color: this.statusColors.Scheduled,\r\n },\r\n PendingApproval: {\r\n display: this.transloco.translate('delegations.status.pendingApproval'),\r\n color: this.statusColors.PendingApproval,\r\n },\r\n InactiveToday: {\r\n display: this.transloco.translate('delegations.status.inactiveToday'),\r\n color: this.statusColors.InactiveToday,\r\n },\r\n Expired: {\r\n display: this.transloco.translate('delegations.status.expired'),\r\n color: this.statusColors.Expired,\r\n },\r\n Rejected: {\r\n display: this.transloco.translate('delegations.status.rejected'),\r\n color: this.statusColors.Rejected,\r\n },\r\n Cancelled: {\r\n display: this.transloco.translate('delegations.status.cancelled'),\r\n color: this.statusColors.Cancelled,\r\n },\r\n }));\r\n\r\n protected readonly tableColumns = linkedSignal<ColumnDef[]>(() => {\r\n const baseColumns: ColumnDef[] = [\r\n {\r\n key: 'displayStatus',\r\n label: this.transloco.translate('delegations.column.status'),\r\n type: 'status',\r\n statusMap: this.statusMap(),\r\n },\r\n {\r\n key: 'startsAtUtc',\r\n label: this.transloco.translate('delegations.column.startDate'),\r\n type: 'dateTime',\r\n },\r\n {\r\n key: 'endsAtUtc',\r\n label: this.transloco.translate('delegations.column.endDate'),\r\n type: 'dateTime',\r\n },\r\n {\r\n key: 'createdByUser',\r\n label: this.transloco.translate('delegations.column.createdBy'),\r\n type: 'user',\r\n },\r\n {\r\n key: 'createdAtUtc',\r\n label: this.transloco.translate('delegations.column.createdDate'),\r\n type: 'dateTime',\r\n },\r\n {\r\n key: 'daysText',\r\n label: this.transloco.translate('delegations.column.days'),\r\n type: 'text',\r\n },\r\n ];\r\n\r\n if (this.adminMode()) {\r\n return [\r\n {\r\n key: 'delegatorUser',\r\n label: this.transloco.translate('delegations.column.delegatorName'),\r\n type: 'user',\r\n },\r\n {\r\n key: 'delegatedToUser',\r\n label: this.transloco.translate('delegations.column.delegatedTo'),\r\n type: 'user',\r\n },\r\n ...baseColumns,\r\n ];\r\n }\r\n\r\n return [\r\n {\r\n key: 'listedUser',\r\n label: this.transloco.translate(\r\n this.activeTab() === 'my'\r\n ? 'delegations.column.delegatedTo'\r\n : 'delegations.column.delegatorName',\r\n ),\r\n type: 'user',\r\n },\r\n ...baseColumns,\r\n ];\r\n });\r\n\r\n private readonly busyIds = signal<string[]>([]);\r\n\r\n private readonly weekdayKeys = [\r\n 'sunday',\r\n 'monday',\r\n 'tuesday',\r\n 'wednesday',\r\n 'thursday',\r\n 'friday',\r\n 'saturday',\r\n ] as const;\r\n\r\n // Route-driven drawer refs (only used when `routed()`). The active id is\r\n // captured per-subscription so an async `onClose` can tell a user-dismiss\r\n // (route still points at the id) from a route-driven / superseded close.\r\n private detailRef: ModalRef | null = null;\r\n private detailOpenId: number | null = null;\r\n private editRef: ModalRef | null = null;\r\n private editOpenId: number | null = null;\r\n\r\n constructor() {\r\n // Tab → route sync. `ngOnInit` performs the first load; this effect only\r\n // reacts to later route changes (tab switches, Back/Forward).\r\n effect(() => {\r\n if (!this.routed()) return;\r\n const t = this.tab() ?? 'my';\r\n untracked(() => {\r\n if (t !== this.activeTab()) {\r\n this.activeTab.set(t);\r\n this.loadCurrentTab();\r\n }\r\n });\r\n });\r\n\r\n // Detail (`?view=`) drawer ↔ route.\r\n effect(() => {\r\n if (!this.routed()) return;\r\n const id = this.detailQueryId();\r\n untracked(() => this.syncDetailDrawer(id));\r\n });\r\n\r\n // Edit (`?edit=`) drawer ↔ route. `view` takes precedence: while a view is\r\n // open, the edit drawer is suppressed (and reopens if `view` later clears).\r\n effect(() => {\r\n if (!this.routed()) return;\r\n const id = this.edit();\r\n const hasView = this.detailQueryId() != null;\r\n untracked(() => this.syncEditDrawer(hasView ? null : id));\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.routed()) {\r\n this.activeTab.set(this.tab() ?? 'my');\r\n }\r\n this.loadCurrentTab();\r\n }\r\n\r\n protected switchTab(tab: DelegationTab): void {\r\n if (this.routed()) {\r\n // Sibling tab segment; drop any open drawer query params.\r\n void this.router.navigate(['..', tab], {\r\n relativeTo: this.route,\r\n queryParams: {},\r\n });\r\n return;\r\n }\r\n this.activeTab.set(tab);\r\n this.loadCurrentTab();\r\n }\r\n\r\n protected goBack(): void {\r\n this.location.back();\r\n }\r\n\r\n private loadCurrentTab(\r\n query: DelegationListQuery = { page: 1, pageSize: 25 },\r\n ): void {\r\n this.currentQuery.set(query);\r\n if (this.adminMode()) {\r\n this.facade.getAdmin(query);\r\n return;\r\n }\r\n\r\n if (this.activeTab() === 'my') {\r\n this.facade.getMy(query);\r\n } else if (this.activeTab() === 'approvals') {\r\n this.facade.getApprovals({\r\n ...query,\r\n status: this.approvalStatus(),\r\n });\r\n } else {\r\n this.facade.getAssigned({\r\n ...query,\r\n status: query.status ?? this.assignedStatus() ?? undefined,\r\n });\r\n }\r\n }\r\n\r\n private reloadCurrentTab(): void {\r\n this.loadCurrentTab(this.currentQuery());\r\n }\r\n\r\n protected onLazyLoad(event: {\r\n currentPage?: number;\r\n pageSize?: number;\r\n }): void {\r\n this.loadCurrentTab({\r\n ...this.currentQuery(),\r\n page: event.currentPage ?? 1,\r\n pageSize: event.pageSize ?? this.currentPage()?.pageSize ?? 25,\r\n });\r\n }\r\n\r\n protected has(row: DelegationRow, action: DelegationAllowedAction): boolean {\r\n return row.allowedActions?.includes(action) ?? false;\r\n }\r\n\r\n protected formatDays(row: DelegationRow): string {\r\n if (row.dayRuleMode === 'SpecificDays' && row.specificDays?.length) {\r\n return row.specificDays\r\n .filter((d) => d >= 0 && d < this.weekdayKeys.length)\r\n .map((d) =>\r\n this.transloco.translate(`delegations.days.${this.weekdayKeys[d]}`),\r\n )\r\n .join(', ');\r\n }\r\n return this.transloco.translate('delegations.form.fullRange');\r\n }\r\n\r\n protected getListedParty(row: DelegationRow) {\r\n return this.activeTab() === 'my' ? row.delegatedUser : row.delegator;\r\n }\r\n\r\n // View/Edit entry points: in routed mode flip the URL (the sync effects open\r\n // the drawer); otherwise open imperatively as before.\r\n private onView(row: DelegationRow): void {\r\n if (this.routed()) {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { view: row.delegationId, edit: null },\r\n queryParamsHandling: 'merge',\r\n });\r\n return;\r\n }\r\n this.openDetailById(row.delegationId);\r\n }\r\n\r\n private onEdit(row: DelegationRow): void {\r\n if (this.routed()) {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { edit: row.delegationId, view: null },\r\n queryParamsHandling: 'merge',\r\n });\r\n return;\r\n }\r\n this.openForm(row);\r\n }\r\n\r\n private openDetailById(delegationId: number): ModalRef {\r\n return this.modal.openModal(DelegationDetailDrawer, 'drawer', {\r\n header: this.transloco.translate('delegations.action.view'),\r\n styleClass:\r\n '!absolute !shadow-none !w-full !max-w-full sm:!w-[52rem] xl:!w-[64rem]',\r\n position: 'end',\r\n appendTo: 'page-content',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: {\r\n delegationId,\r\n adminMode: this.adminMode(),\r\n },\r\n });\r\n }\r\n\r\n private openForm(row: DelegationRow | null): ModalRef {\r\n const ref = this.modal.openModal(\r\n DelegationForm,\r\n row ? 'drawer' : 'dialog',\r\n {\r\n header: this.transloco.translate(\r\n row ? 'delegations.action.edit' : 'delegations.action.create',\r\n ),\r\n styleClass: row\r\n ? '!absolute !shadow-none !w-full !max-w-full sm:!w-[68rem] xl:!w-[84rem]'\r\n : '!w-[min(98vw,88rem)] !max-w-[98vw] !h-[min(94vh,56rem)] !max-h-[94vh] !overflow-hidden',\r\n position: row ? 'end' : '',\r\n appendTo: row ? 'page-content' : 'body',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: {\r\n delegationForEdit: row,\r\n readonly: false,\r\n adminMode: this.adminMode(),\r\n },\r\n },\r\n );\r\n // Routed edit reload/clear is handled by `syncEditDrawer`; create and\r\n // non-routed edit self-manage their reload here.\r\n if (!this.routed() || row == null) {\r\n ref.onClose.subscribe((saved: boolean) => {\r\n if (saved) this.reloadCurrentTab();\r\n });\r\n }\r\n return ref;\r\n }\r\n\r\n private syncDetailDrawer(id: number | null): void {\r\n if (id != null && this.detailOpenId !== id) {\r\n const openingId = id;\r\n this.closeDetail();\r\n this.detailOpenId = openingId;\r\n this.detailRef = this.openDetailById(openingId);\r\n this.detailRef.onClose.subscribe(() => {\r\n if (this.detailOpenId !== openingId) return; // superseded by a switch\r\n this.detailRef = null;\r\n this.detailOpenId = null;\r\n // Route still points here ⇒ the user dismissed the drawer; clear it.\r\n if (this.detailQueryId() === openingId) this.clearDetailQuery();\r\n });\r\n } else if (id == null) {\r\n this.closeDetail();\r\n }\r\n }\r\n\r\n private syncEditDrawer(id: number | null): void {\r\n if (id != null && this.editOpenId !== id) {\r\n const openingId = id;\r\n this.closeEdit();\r\n this.editOpenId = openingId;\r\n // The detail drawer loads its own data, but the form prefills from the\r\n // list row when present; fall back to an id-only stub on a cold deep-link\r\n // (the form then sources rowVersion from the detail it loads).\r\n const row =\r\n this.rows().find((r) => r.delegationId === openingId) ??\r\n ({ delegationId: openingId } as DelegationRow);\r\n this.editRef = this.openForm(row);\r\n this.editRef.onClose.subscribe((saved: boolean) => {\r\n if (this.editOpenId !== openingId) return; // superseded\r\n this.editRef = null;\r\n this.editOpenId = null;\r\n if (saved) this.reloadCurrentTab();\r\n if (this.edit() === openingId) this.clearQuery('edit');\r\n });\r\n } else if (id == null) {\r\n this.closeEdit();\r\n }\r\n }\r\n\r\n private closeDetail(): void {\r\n if (this.detailRef) {\r\n this.detailOpenId = null; // mark superseded so the pending onClose no-ops\r\n const ref = this.detailRef;\r\n this.detailRef = null;\r\n ref.close();\r\n }\r\n }\r\n\r\n private closeEdit(): void {\r\n if (this.editRef) {\r\n this.editOpenId = null;\r\n const ref = this.editRef;\r\n this.editRef = null;\r\n ref.close();\r\n }\r\n }\r\n\r\n private clearQuery(param: 'view' | 'edit'): void {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { [param]: null },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n private clearDetailQuery(): void {\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: {\r\n view: null,\r\n selected: null,\r\n itemSelected: null,\r\n selectedItemId: null,\r\n selectedItem: null,\r\n itemId: null,\r\n delegationId: null,\r\n },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n private approve(row: DelegationRow): void {\r\n this.mark(`approve:${row.delegationId}`, true);\r\n this.facade\r\n .approve(row.delegationId, { rowVersion: row.rowVersion })\r\n .pipe(finalize(() => this.mark(`approve:${row.delegationId}`, false)))\r\n .subscribe({ next: () => this.reloadCurrentTab() });\r\n }\r\n\r\n private reject(row: DelegationRow): void {\r\n const ref = this.modal.openModal(RejectDelegationDialog, 'dialog', {\r\n header: this.transloco.translate('delegations.action.reject'),\r\n styleClass: '!w-[min(96vw,30rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row },\r\n });\r\n ref.onClose.subscribe((rejected: boolean) => {\r\n if (rejected) this.reloadCurrentTab();\r\n });\r\n }\r\n\r\n private cancel(row: DelegationRow): void {\r\n this.mark(`cancel:${row.delegationId}`, true);\r\n this.facade\r\n .cancel(row.delegationId, row.rowVersion, this.adminMode())\r\n .pipe(finalize(() => this.mark(`cancel:${row.delegationId}`, false)))\r\n .subscribe({ next: () => this.reloadCurrentTab() });\r\n }\r\n\r\n private startSession(row: DelegationRow): void {\r\n const ref = this.modal.openModal(StartSessionDialog, 'dialog', {\r\n header: this.transloco.translate('delegations.action.startSession'),\r\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { delegation: row, intent: 'start' },\r\n });\r\n ref.onClose.subscribe((started: boolean) => {\r\n if (started) this.reloadCurrentTab();\r\n });\r\n }\r\n\r\n private mark(key: string, on: boolean): void {\r\n this.busyIds.update((ids) =>\r\n on ? [...ids, key] : ids.filter((id) => id !== key),\r\n );\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <ng-template #tableContent>\r\n <div class=\"flex flex-col gap-4\">\r\n @if (!adminMode()) {\r\n @let assignedLabel =\r\n assignedDecisionTab()\r\n ? t(\"delegations.action.approve\") +\r\n \" / \" +\r\n t(\"delegations.action.reject\")\r\n : t(assignedTabLabelKey());\r\n\r\n <mt-tabs\r\n mode=\"underline\"\r\n [active]=\"activeTab()\"\r\n [options]=\"\r\n showApprovalTab()\r\n ? [\r\n { value: 'my', label: t('delegations.myDelegations') },\r\n { value: 'assigned', label: assignedLabel },\r\n { value: 'approvals', label: t(approvalTabLabelKey()) },\r\n ]\r\n : [\r\n { value: 'my', label: t('delegations.myDelegations') },\r\n { value: 'assigned', label: assignedLabel },\r\n ]\r\n \"\r\n fluid\r\n (onChange)=\"switchTab($event)\"\r\n ></mt-tabs>\r\n }\r\n\r\n <mt-table\r\n [data]=\"tableRows()\"\r\n [columns]=\"tableColumns()\"\r\n [actions]=\"tableActions()\"\r\n [rowActions]=\"rowActions()\"\r\n [loading]=\"isLoading()\"\r\n [lazy]=\"true\"\r\n [lazyTotalRecords]=\"currentPage()?.totalCount ?? 0\"\r\n dataKey=\"delegationId\"\r\n [noCard]=\"true\"\r\n (lazyLoad)=\"onLazyLoad($event)\"\r\n >\r\n <ng-template #empty>\r\n <div\r\n class=\"flex min-h-64 flex-col items-center justify-center gap-4 px-6 py-10 text-center\"\r\n >\r\n <div\r\n class=\"flex size-16 items-center justify-center rounded-3xl bg-surface-0 text-primary shadow-sm\"\r\n >\r\n <svg\r\n viewBox=\"0 0 64 64\"\r\n class=\"size-9\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect\r\n x=\"10\"\r\n y=\"14\"\r\n width=\"44\"\r\n height=\"36\"\r\n rx=\"12\"\r\n class=\"fill-primary/10 stroke-primary/35\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M21 28H43\"\r\n class=\"stroke-primary\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n <path\r\n d=\"M21 36H35\"\r\n class=\"stroke-primary/70\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n <p class=\"max-w-sm text-sm text-surface-500\">\r\n {{ t(emptyStateKey()) }}\r\n </p>\r\n </div>\r\n </ng-template>\r\n </mt-table>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #adminContent>\r\n <div class=\"flex min-h-full flex-col gap-4\">\r\n @if (showBreadcrumb()) {\r\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\r\n }\r\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n @if (adminMode()) {\r\n @if (showPageShell()) {\r\n <mt-page\r\n [title]=\"surfaceTitle()\"\r\n [avatarIcon]=\"'custom.hierarchy-structure'\"\r\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-indigo-50)',\r\n '--p-avatar-color': 'var(--p-indigo-700)',\r\n }\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <ng-container *ngTemplateOutlet=\"adminContent\"></ng-container>\r\n </mt-page>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"adminContent\"></ng-container>\r\n }\r\n } @else {\r\n <div class=\"flex h-full flex-col gap-4 ps-4 pt-4\">\r\n <mt-card class=\"rounded-e-none!\" [title]=\"surfaceTitle()\">\r\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\r\n </mt-card>\r\n </div>\r\n }\r\n</ng-container>\r\n","import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { inject } from '@angular/core';\r\nimport { catchError, throwError } from 'rxjs';\r\nimport {\r\n DELEGATED_RUNTIME_REQUEST,\r\n DELEGATION_RUNTIME_CONFIG,\r\n} from '../runtime/delegation-runtime';\r\nimport { DelegationTokenVault } from '../runtime/delegation-token-vault';\r\nimport { DelegationSessionFacade } from '../store/session/delegation-session.facade';\r\nimport type { DelegationSessionInvalidationReason } from '../store/session/delegation-session.model';\r\n\r\nconst FORBIDDEN_PATHS = [\r\n /\\/(?:identity\\/)?(?:auth|login|logout|token)(?:\\/|$)/i,\r\n /\\/identity\\/delegations(?:\\/|$)/i,\r\n /\\/(?:settings|assets|public)(?:\\/|$)/i,\r\n];\r\n\r\nconst INVALIDATION_REASONS: Record<\r\n string,\r\n DelegationSessionInvalidationReason\r\n> = {\r\n scopechanged: 'ScopeChanged',\r\n versionchanged: 'VersionChanged',\r\n sessionmismatch: 'SessionMismatch',\r\n actormismatch: 'ActorMismatch',\r\n applicationmismatch: 'ApplicationMismatch',\r\n tenantmismatch: 'TenantMismatch',\r\n expired: 'Expired',\r\n tokenexpired: 'Expired',\r\n invalid: 'TokenInvalid',\r\n tokeninvalid: 'TokenInvalid',\r\n};\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n\r\nfunction field(value: unknown, key: string): unknown {\r\n return isRecord(value) ? value[key] : undefined;\r\n}\r\n\r\nfunction delegationReasonCode(error: HttpErrorResponse): string | null {\r\n const body = error.error;\r\n const errors = field(body, 'errors');\r\n const directDetails = field(body, 'errorDetails');\r\n const nestedDetails = field(errors, 'details');\r\n const value =\r\n field(directDetails, 'delegationReasonCode') ??\r\n field(nestedDetails, 'delegationReasonCode');\r\n return typeof value === 'string' ? value : null;\r\n}\r\n\r\nfunction invalidationReason(\r\n error: HttpErrorResponse,\r\n): DelegationSessionInvalidationReason | null {\r\n const code = delegationReasonCode(error);\r\n if (!code) return null;\r\n const normalized = (code.split('.').pop() ?? code)\r\n .replace(/[^a-z]/gi, '')\r\n .toLowerCase();\r\n return INVALIDATION_REASONS[normalized] ?? null;\r\n}\r\n\r\nfunction isTrustedRuntimeUrl(\r\n requestUrl: string,\r\n configuredBase: string,\r\n document: Document,\r\n): boolean {\r\n if (\r\n !configuredBase ||\r\n FORBIDDEN_PATHS.some((rule) => rule.test(requestUrl))\r\n ) {\r\n return false;\r\n }\r\n try {\r\n const pageBase = document.baseURI;\r\n const request = new URL(requestUrl, pageBase);\r\n const api = new URL(configuredBase, pageBase);\r\n const apiPath = api.pathname.endsWith('/')\r\n ? api.pathname\r\n : `${api.pathname}/`;\r\n return (\r\n request.origin === api.origin &&\r\n (request.pathname === api.pathname ||\r\n request.pathname.startsWith(apiPath))\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Adds delegated authority only to explicitly marked, trusted business-runtime\r\n * requests. Register after the normal authorization interceptor.\r\n */\r\nexport const appDelegationInterceptor: HttpInterceptorFn = (req, next) => {\r\n if (!req.context.get(DELEGATED_RUNTIME_REQUEST)) {\r\n return next(req);\r\n }\r\n\r\n const config = inject(DELEGATION_RUNTIME_CONFIG);\r\n const document = inject(DOCUMENT);\r\n if (\r\n !isTrustedRuntimeUrl(\r\n req.url,\r\n config.resolveApplicationApiBaseUrl(),\r\n document,\r\n )\r\n ) {\r\n return next(req);\r\n }\r\n\r\n const token = inject(DelegationTokenVault).token();\r\n if (!token) {\r\n return next(req);\r\n }\r\n\r\n const facade = inject(DelegationSessionFacade);\r\n return next(\r\n req.clone({ setHeaders: { 'app-delegation': `Bearer ${token}` } }),\r\n ).pipe(\r\n catchError((error: unknown) => {\r\n if (error instanceof HttpErrorResponse && error.status === 403) {\r\n const reason = invalidationReason(error);\r\n if (reason) {\r\n facade.endSession(reason).subscribe();\r\n }\r\n }\r\n return throwError(() => error);\r\n }),\r\n );\r\n};\r\n","// store/index.ts\r\nexport * from './delegations';\r\nexport * from './session';\r\n","// Runtime UI surfaces — projected into host topbars + opened via ModalService.\r\nexport { TopbarDelegationMenu } from './lib/delegations/topbar-delegation-menu/topbar-delegation-menu';\r\nexport { DelegationMenuPanel } from './lib/delegations/delegation-menu-panel/delegation-menu-panel';\r\nexport { DelegationStatusChip } from './lib/delegations/delegation-status-chip/delegation-status-chip';\r\nexport { default as StartSessionDialog } from './lib/delegations/start-session-dialog/start-session-dialog';\r\nexport { default as RejectDelegationDialog } from './lib/delegations/reject-delegation-dialog/reject-delegation-dialog';\r\n\r\n// Management UI — portal page (My Delegations / Delegated To Me) + form + detail drawer.\r\nexport { default as Delegations } from './lib/delegations/delegations';\r\nexport { default as DelegationsList } from './lib/delegations/delegations-list/delegations-list';\r\nexport { default as DelegationForm } from './lib/delegations/delegation-form/delegation-form';\r\nexport { default as DelegationDetailDrawer } from './lib/delegations/delegation-detail-drawer/delegation-detail-drawer';\r\nexport { ScopePicker } from './lib/delegations/delegation-form/scope-picker/scope-picker';\r\n\r\n// HTTP\r\nexport { appDelegationInterceptor } from './interceptors/app-delegation.interceptor';\r\nexport * from './runtime';\r\n\r\n// Store (models, actions, state, facades — both delegations and session)\r\nexport * from './store';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BASE","__decorate","isRecord","EMPTY_SCOPE","i1","i2"],"mappings":"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"}