@masterteam/delegations 0.0.56 → 0.0.57

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/store/session/delegation-session.actions.ts","../../../../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.model.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-session-resume.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-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/lib/delegations/delegation-status-chip/delegation-status-chip.ts","../../../../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 { 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/**\r\n * Re-mint the session the user was in before they reloaded the page. Dispatched\r\n * by the state itself from the persisted delegation id — never a token.\r\n */\r\nexport class ResumeDelegationSession {\r\n static readonly type = '[DelegationSession] Resume';\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 { 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 {\r\n ActiveDelegationSession,\r\n DelegationSessionInvalidationReason,\r\n} 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\n/**\r\n * Why the effective actor changed. `StartSession` / `SwitchSession` mean a new\r\n * delegated actor is now in force; every other value ends delegated mode. Hosts\r\n * should branch on this — `Logout`, `UserSwitch`, `TenantSwitch` and `AppSwitch`\r\n * are session teardowns where there is no new actor to load data for.\r\n */\r\nexport type DelegationContextChangeReason =\r\n | DelegationSessionInvalidationReason\r\n | 'StartSession'\r\n | 'SwitchSession'\r\n /** Re-minted after a page reload — same actor, so the host should stay put. */\r\n | 'ResumeSession';\r\n\r\nexport interface DelegationContextChange {\r\n previous: ActiveDelegationSession | null;\r\n current: ActiveDelegationSession | null;\r\n reason: DelegationContextChangeReason;\r\n}\r\n\r\nexport interface DelegationRuntimeConfig {\r\n resolveApplicationApiBaseUrl: () => string;\r\n resolvePromptNamespace: () => DelegationPromptNamespace;\r\n onContextChanged: (change: DelegationContextChange) => void | Promise<void>;\r\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,\r\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 { 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 { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport { DELEGATION_RUNTIME_CONFIG } from './delegation-runtime';\n\nconst STORAGE_KEY = 'mt.delegation.session-resume.v1';\n\ninterface ResumeMarker {\n /** `userId|applicationKey|tenantKey` — who the marker belongs to. */\n ns: string;\n delegationId: number;\n}\n\n/**\n * Lets a delegated session survive a page reload **without persisting the\n * token**.\n *\n * Doc 05 is unambiguous: the delegation access token is memory-only, and it\n * stays that way — this store keeps a single opaque `delegationId` plus the\n * owning user/app/tenant namespace. On the next boot the runtime calls\n * `POST identity/delegations/{id}/session` again and mints a *fresh* token,\n * which is what doc 09 already prescribes for restarting a session (\"use the\n * newly returned token because the scope hash or delegation version may have\n * changed\"). The backend re-authorizes from scratch every time, so a delegation\n * that expired, was cancelled, or had its scope revoked while the tab was shut\n * simply fails to resume and the user stays themselves.\n *\n * Never holds a token, a candidate record, a name, or an email.\n */\n@Injectable({ providedIn: 'root' })\nexport class DelegationSessionResumeStore {\n private readonly document = inject(DOCUMENT);\n private readonly config = inject(DELEGATION_RUNTIME_CONFIG);\n\n remember(delegationId: number): void {\n this.write({ ns: this.namespace(), delegationId });\n }\n\n /**\n * The delegation to resume for the *current* user/app/tenant, or `null`. A\n * marker left by a different actor is dropped rather than honoured, so\n * signing in as someone else on a shared browser never resumes their\n * delegation.\n */\n pending(): number | null {\n const marker = this.read();\n if (!marker) {\n return null;\n }\n if (marker.ns !== this.namespace()) {\n this.clear();\n return null;\n }\n return marker.delegationId;\n }\n\n clear(): void {\n try {\n this.storage()?.removeItem(STORAGE_KEY);\n } catch {\n // Storage can be unavailable (private mode, blocked cookies).\n }\n }\n\n private namespace(): string {\n const { userId, applicationKey, tenantKey } =\n this.config.resolvePromptNamespace();\n return [userId, applicationKey, tenantKey ?? ''].join('|');\n }\n\n private read(): ResumeMarker | null {\n try {\n const raw = this.storage()?.getItem(STORAGE_KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : null;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n typeof (parsed as ResumeMarker).ns !== 'string' ||\n typeof (parsed as ResumeMarker).delegationId !== 'number'\n ) {\n return null;\n }\n return parsed as ResumeMarker;\n } catch {\n return null;\n }\n }\n\n private write(marker: ResumeMarker): void {\n try {\n this.storage()?.setItem(STORAGE_KEY, JSON.stringify(marker));\n } catch {\n // Storage can be unavailable; delegated mode then simply ends on reload.\n }\n }\n\n private storage(): Storage | null {\n return this.document.defaultView?.localStorage ?? null;\n }\n}\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 {\r\n DELEGATION_RUNTIME_CONFIG,\r\n type DelegationContextChangeReason,\r\n} from '../../runtime/delegation-runtime';\r\nimport { DelegationSessionResumeStore } from '../../runtime/delegation-session-resume';\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 ResumeDelegationSession,\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/** `setTimeout` stores its delay in a signed 32-bit int; anything larger wraps\r\n * around and fires immediately. Clamp so a long-lived session never self-ends. */\r\nconst MAX_TIMEOUT_MS = 2 ** 31 - 1;\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 * Bumped whenever candidates are cleared (logout / user / tenant / app\r\n * switch). A `LoadDelegationCandidates` response that was already in flight\r\n * when the actor went away resolves against a stale generation and is\r\n * dropped, so the previous user's delegators can never repopulate the menu —\r\n * or open the availability prompt — after sign-out.\r\n */\r\n private candidatesGeneration = 0;\r\n private resumeStore = inject(DelegationSessionResumeStore);\r\n /** One resume attempt per page load — a dead delegation must not retry. */\r\n private resumeAttempted = false;\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 generation = this.candidatesGeneration;\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 // The actor changed while this request was in flight — discard it.\r\n if (generation !== this.candidatesGeneration) {\r\n return;\r\n }\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 if (!active && page === 1) {\r\n this.tryResume(candidates);\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 /**\r\n * Re-mints the delegated session the user was in before they reloaded.\r\n *\r\n * The token itself was never persisted (doc 05); only the delegation id was,\r\n * so this is a full `POST .../session` and the backend re-authorizes from\r\n * scratch. Attempted at most once per page load — a delegation that has since\r\n * expired or been revoked must not retry on every candidate refresh.\r\n */\r\n private tryResume(candidates: DelegationRow[]): void {\r\n if (this.resumeAttempted) {\r\n return;\r\n }\r\n const delegationId = this.resumeStore.pending();\r\n if (delegationId == null) {\r\n return;\r\n }\r\n const row = candidates.find(\r\n (candidate) => candidate.delegationId === delegationId,\r\n );\r\n this.resumeAttempted = true;\r\n if (!row) {\r\n // No longer startable (expired, cancelled, scope revoked) — forget it.\r\n this.resumeStore.clear();\r\n return;\r\n }\r\n queueMicrotask(() =>\r\n this.store.dispatch(new ResumeDelegationSession(row)).subscribe({\r\n error: () => this.resumeStore.clear(),\r\n }),\r\n );\r\n }\r\n\r\n @Action(ResumeDelegationSession)\r\n resume(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { delegation }: ResumeDelegationSession,\r\n ) {\r\n if (ctx.getState().active) {\r\n return EMPTY;\r\n }\r\n return this.startSession(ctx, delegation, null, 'ResumeSession');\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: DelegationContextChangeReason,\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 // Id only — see `DelegationSessionResumeStore`. Never the token.\r\n this.resumeStore.remember(delegation.delegationId);\r\n this.resumeAttempted = true;\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 const clearCandidates = shouldClearCandidates(reason);\r\n\r\n // Whatever the reason, delegated mode is over — a reload must not bring it\r\n // back. Also blocks a resume that is still queued behind this action.\r\n this.resumeStore.clear();\r\n this.resumeAttempted = true;\r\n\r\n // Logout / user / tenant / app switch must always drop the candidate list,\r\n // even when no delegated session was ever started. Leaving it behind kept\r\n // the previous actor's delegators in memory across sign-out, which is both\r\n // a leak into the next session and the reason the availability prompt could\r\n // reopen over the login page.\r\n if (clearCandidates) {\r\n this.candidatesGeneration++;\r\n ctx.patchState({\r\n candidates: [],\r\n candidatesTotalCount: 0,\r\n candidatesPage: 1,\r\n });\r\n }\r\n\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({ active: null });\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 clearCandidates\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 expiresAt = Date.parse(active.expiresAtUtc ?? '');\r\n // A missing or unparseable expiry used to produce a NaN delay, which\r\n // `setTimeout` coerces to 0 — the session ended on the very next tick and\r\n // the user silently fell back to their own identity. Fail open instead and\r\n // let the backend's `delegationReasonCode` end the session (doc 05).\r\n if (!Number.isFinite(expiresAt)) {\r\n return;\r\n }\r\n const delay = Math.min(Math.max(0, expiresAt - Date.now()), MAX_TIMEOUT_MS);\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 /**\r\n * Executed-by (the real signed-in user), known whether or not a session is\r\n * active: every assigned row carries the current user as its `delegatedUser`,\r\n * so the account switcher can list \"you\" alongside the delegators without the\r\n * package depending on the host's auth state.\r\n */\r\n readonly executedBy = computed(\r\n () =>\r\n this.active()?.delegation.delegatedUser ??\r\n this.candidates()[0]?.delegatedUser ??\r\n 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 { ModalService } from '@masterteam/components/modal';\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 /** Supplies the shared `mt-modal-content` / `mt-modal-footer` shell classes. */\r\n protected readonly modal = inject(ModalService);\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\r\n [class]=\"modal.contentClass + ' flex flex-col gap-4 overflow-y-auto p-5'\"\r\n >\r\n <mt-entity-preview\r\n [data]=\"userEntity(delegation().delegator)\"\r\n ></mt-entity-preview>\r\n\r\n <p class=\"text-sm leading-relaxed text-surface-600\">\r\n {{ t(bodyKey()) }}\r\n </p>\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\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</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 { ModalService } from '@masterteam/components/modal';\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 /** Supplies the shared `mt-modal-content` / `mt-modal-footer` shell classes. */\r\n protected readonly modal = inject(ModalService);\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\r\n [class]=\"modal.contentClass + ' flex flex-col gap-4 overflow-y-auto p-5'\"\r\n >\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 flex-col gap-2\">\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-lg border border-solid border-surface-200 bg-surface-0 px-3 py-2.5 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 </div>\r\n\r\n <div [class]=\"modal.footerClass\">\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</ng-container>\r\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { ModalService } from '@masterteam/components/modal';\nimport { ToastService } from '@masterteam/components/toast';\nimport { Icon } from '@masterteam/icons';\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\nimport {\n DelegationParty,\n DelegationRow,\n} from '../../../store/delegations/delegations.model';\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\n\n/** One selectable identity in the switcher. */\nexport interface DelegationIdentityOption {\n /** `null` for the real signed-in user; the delegation row otherwise. */\n row: DelegationRow | null;\n party: DelegationParty | null;\n isSelf: boolean;\n isActive: boolean;\n initials: string;\n}\n\n/**\n * Embeddable \"acting as\" account switcher (doc 05, 09).\n *\n * Renders one row per identity the user can operate as — themselves first, then\n * every delegator who has an active delegation assigned to them — with the\n * current one checked. Picking a row starts, switches, or ends the delegated\n * session; the {@link StartSessionDialog} still takes explicit consent before\n * any session begins, so this list never changes authority on its own.\n *\n * Designed to be dropped inside a host menu (e.g. the user-avatar dropdown) or\n * the topbar popover. Candidate loading + the post-login prompt stay in the\n * always-mounted `TopbarDelegationMenu` controller.\n *\n * Emits `closeRequested` after any action so the host overlay can dismiss.\n */\n@Component({\n selector: 'mt-delegation-menu-panel',\n standalone: true,\n imports: [CommonModule, Avatar, Icon, RouterLink, TranslocoDirective],\n templateUrl: './delegation-menu-panel.html',\n styleUrls: ['./delegation-menu-panel.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DelegationMenuPanel {\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\n readonly managePath = input<string>('/delegations');\n readonly showManageLink = input<boolean>(true);\n /**\n * Optional richer profile for the \"you\" row. Falls back to the current user\n * carried on the assigned delegation rows, so the host may omit it.\n */\n readonly currentUser = input<DelegationParty | null>(null);\n readonly closeRequested = output<void>();\n\n private readonly facade = inject(DelegationSessionFacade);\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n private readonly toast = inject(ToastService);\n\n protected readonly active = this.facade.active;\n protected readonly candidates = this.facade.candidates;\n protected readonly hasCandidates = this.facade.hasCandidates;\n protected readonly hasMoreCandidates = this.facade.hasMoreCandidates;\n protected readonly isLoadingCandidates = this.facade.isLoadingCandidates;\n protected readonly isBusy = this.facade.isStarting;\n protected readonly onBehalfOf = this.facade.onBehalfOf;\n\n /** The real signed-in user — host-supplied when available, derived otherwise. */\n protected readonly self = computed<DelegationParty | null>(\n () => this.currentUser() ?? this.facade.executedBy(),\n );\n\n /** Nothing to switch between and no session running — render nothing. */\n protected readonly visible = computed(\n () => !!this.active() || this.hasCandidates(),\n );\n\n /** \"You\", then every delegator. The active identity carries the checkmark. */\n protected readonly identities = computed<DelegationIdentityOption[]>(() => {\n const activeSession = this.active();\n const activeId = activeSession?.delegation.delegationId ?? null;\n const self = this.self();\n const candidates = this.candidates();\n\n // The identity in force is always listed, even if it has fallen off the\n // first page of candidates — a switcher that cannot show who you currently\n // are is worse than one extra row.\n const rows =\n activeSession && !candidates.some((row) => row.delegationId === activeId)\n ? [activeSession.delegation, ...candidates]\n : candidates;\n\n return [\n {\n row: null,\n party: self,\n isSelf: true,\n isActive: activeId === null,\n initials: this.initials(self),\n },\n ...rows.map((row) => ({\n row,\n party: row.delegator,\n isSelf: false,\n isActive: row.delegationId === activeId,\n initials: this.initials(row.delegator),\n })),\n ];\n });\n\n /** Two-letter initials for an avatar (matches the user-menu pattern). */\n protected initials(party: DelegationParty | null | undefined): string {\n const name = party?.displayName?.trim() || party?.email?.trim() || '';\n const parts = name.split(/\\s+/).filter(Boolean);\n if (!parts.length) return '?';\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n protected select(option: DelegationIdentityOption, event: Event): void {\n event.stopPropagation();\n if (option.isActive || this.isBusy()) {\n return;\n }\n\n this.closeRequested.emit();\n\n if (option.isSelf) {\n // Back to your own authority. There is no server call (doc 05) — ending\n // is local — so no confirmation dialog stands between the user and it.\n this.facade.endSession('Manual').subscribe({\n next: () =>\n this.toast.success(\n this.transloco.translate('delegations.session.ended'),\n ),\n });\n return;\n }\n\n if (!option.row) {\n return;\n }\n this.openConfirm(option.row, this.active() ? 'switch' : 'start');\n }\n\n protected onManage(): void {\n this.closeRequested.emit();\n }\n\n protected loadMore(event: MouseEvent): void {\n event.stopPropagation();\n this.facade.loadMoreCandidates().subscribe();\n }\n\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch'): void {\n this.modal.openModal(StartSessionDialog, 'dialog', {\n header: this.transloco.translate(\n intent === 'switch'\n ? 'delegations.action.switchSession'\n : 'delegations.action.startSession',\n ),\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row, intent },\n });\n }\n}\n","<ng-container *transloco=\"let t\">\n @if (visible()) {\n <div class=\"mt-delegation-switcher flex w-full flex-col\">\n <!-- Header: what this list is, and the current mode at a glance -->\n <div class=\"flex flex-col gap-0.5 px-4 pb-2 pt-3\">\n <span\n class=\"text-[0.6875rem] font-semibold uppercase tracking-wide text-surface-400\"\n >\n {{ t(\"delegations.session.actingAs\") }}\n </span>\n @if (active()) {\n <span class=\"text-xs text-surface-500\">\n {{\n t(\"delegations.session.switchBackHint\", {\n actualUserName: self()?.displayName,\n })\n }}\n </span>\n } @else {\n <span class=\"text-xs text-surface-500\">\n {{ t(\"delegations.session.chooseDelegatorHint\") }}\n </span>\n }\n </div>\n\n <!-- Identity list: you first, then everyone who delegated to you -->\n <div\n class=\"mt-delegation-switcher__list flex max-h-80 flex-col gap-0.5 overflow-y-auto px-1.5 pb-1.5\"\n role=\"listbox\"\n [attr.aria-label]=\"t('delegations.session.actingAs')\"\n >\n @for (\n option of identities();\n track option.row?.delegationId ?? \"self\"\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"mt-delegation-switcher__row\"\n [class.mt-delegation-switcher__row--active]=\"option.isActive\"\n [attr.aria-selected]=\"option.isActive\"\n [disabled]=\"isBusy() || option.isActive\"\n [attr.aria-label]=\"\n option.isSelf\n ? t('delegations.session.actAsSelfAria', {\n actualUserName: option.party?.displayName,\n })\n : t('delegations.session.promptStartAria', {\n delegatorName: option.party?.displayName,\n })\n \"\n (click)=\"select(option, $event)\"\n >\n <span class=\"relative shrink-0\">\n <mt-avatar\n [label]=\"option.initials\"\n shape=\"circle\"\n [styleClass]=\"\n option.isActive\n ? '!size-9 !text-xs !bg-primary-100 !text-primary-700'\n : '!size-9 !text-xs !bg-surface-100 !text-surface-600'\n \"\n ></mt-avatar>\n @if (option.isActive && !option.isSelf) {\n <span\n class=\"absolute -bottom-0.5 -end-0.5 flex size-4 items-center justify-center rounded-full bg-primary ring-2 ring-surface-0\"\n aria-hidden=\"true\"\n >\n <mt-icon\n icon=\"user.users-check\"\n styleClass=\"text-[0.55rem] text-white\"\n ></mt-icon>\n </span>\n }\n </span>\n\n <span class=\"flex min-w-0 flex-1 flex-col text-start\">\n <span class=\"flex min-w-0 items-center gap-1.5\">\n <span\n class=\"truncate text-sm font-semibold text-surface-800\"\n [class.text-primary-700]=\"option.isActive\"\n >\n {{ option.party?.displayName }}\n </span>\n @if (option.isSelf) {\n <span class=\"mt-delegation-switcher__badge\">\n {{ t(\"delegations.session.you\") }}\n </span>\n }\n </span>\n <span class=\"truncate text-xs text-surface-500\">\n @if (option.isSelf) {\n {{\n option.party?.email ||\n t(\"delegations.session.ownAccountHint\")\n }}\n } @else {\n {{\n t(\"delegations.session.until\", {\n date: option.row?.endsAtUtc | date: \"mediumDate\",\n })\n }}\n }\n </span>\n </span>\n\n @if (option.isActive) {\n <mt-icon\n icon=\"general.check\"\n styleClass=\"text-base text-primary shrink-0\"\n ></mt-icon>\n } @else {\n <mt-icon\n icon=\"arrow.chevron-right\"\n styleClass=\"mt-delegation-switcher__chevron text-base text-surface-400 shrink-0\"\n ></mt-icon>\n }\n </button>\n }\n\n @if (hasMoreCandidates()) {\n <button\n type=\"button\"\n class=\"mx-1.5 my-1 rounded-lg px-3 py-2 text-sm font-medium text-primary hover:bg-primary-50 disabled:opacity-60\"\n [disabled]=\"isLoadingCandidates()\"\n (click)=\"loadMore($event)\"\n >\n {{ t(\"delegations.session.loadMore\") }}\n </button>\n }\n </div>\n\n @if (showManageLink()) {\n <div class=\"border-t border-surface p-1.5\">\n <a\n [routerLink]=\"managePath()\"\n (click)=\"onManage()\"\n class=\"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-sm text-surface-700 hover:bg-surface-100\"\n >\n <mt-icon\n icon=\"general.settings-02\"\n styleClass=\"text-base\"\n ></mt-icon>\n <span>{{ t(\"delegations.session.manage\") }}</span>\n </a>\n </div>\n }\n </div>\n }\n</ng-container>\n","import { CommonModule } from '@angular/common';\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 OnInit,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Actions, ofActionSuccessful } from '@ngxs/store';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Popover } from 'primeng/popover';\r\nimport { ResumeDelegationSession } from '../../../store/session/delegation-session.actions';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport {\r\n DelegationParty,\r\n DelegationRow,\r\n} 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 * Optional richer profile for the \"you\" row of the switcher. Forwarded to\r\n * {@link DelegationMenuPanel}; omit it and the current user is derived from\r\n * the assigned delegation rows.\r\n */\r\n readonly currentUser = input<DelegationParty | null>(null);\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 private readonly destroyRef = inject(DestroyRef);\r\n private readonly actions$ = inject(Actions);\r\n private readonly toast = inject(ToastService);\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 private destroyed = false;\r\n /**\r\n * Dialogs opened through `ModalService` live on `document.body`, so they\r\n * outlive this component. Held so the whole prompt flow can be torn down when\r\n * the authenticated shell goes away (sign-out) instead of stranding an\r\n * \"act on behalf of\" dialog over the login page.\r\n */\r\n private promptRefs: { close: (value?: never) => void }[] = [];\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 // Candidates emptying mid-flow means the actor is gone (sign-out, user /\r\n // tenant / app switch). Nothing in the prompt is valid any more.\r\n effect(() => {\r\n if (!this.candidates().length) {\r\n this.closePromptFlow();\r\n }\r\n });\r\n\r\n // A resumed session is the one state change the user did not just ask for\r\n // — it happens silently on page load. Say so, or \"acting as someone else\"\r\n // looks like the app forgot who they are.\r\n this.actions$\r\n .pipe(ofActionSuccessful(ResumeDelegationSession), takeUntilDestroyed())\r\n .subscribe(() => {\r\n const delegatorName = this.onBehalfOf()?.displayName;\r\n if (delegatorName) {\r\n this.toast.info(\r\n this.transloco.translate('delegations.session.resumed', {\r\n delegatorName,\r\n }),\r\n );\r\n }\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.destroyed = true;\r\n this.closePromptFlow();\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 // `claimUnseen` is async (SubtleCrypto). The user can sign out inside\r\n // that window, which destroys this controller and empties the candidate\r\n // list — opening then would drop the dialog on the login page.\r\n if (\r\n unseen.length &&\r\n !this.destroyed &&\r\n !this.active() &&\r\n this.candidates().length\r\n ) {\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 (\r\n !this.destroyed &&\r\n this.promptOnCandidates() &&\r\n !this.active() &&\r\n latest.length\r\n ) {\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 this.trackPromptRef(ref);\r\n\r\n ref.onClose.subscribe((row: DelegationRow | null | undefined) => {\r\n if (row && !this.destroyed) {\r\n this.trackPromptRef(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 trackPromptRef<TRef extends { close: (value?: never) => void }>(\r\n ref: TRef,\r\n ): TRef {\r\n this.promptRefs.push(ref);\r\n return ref;\r\n }\r\n\r\n /** Tears down anything the prompt flow left on `document.body`. */\r\n private closePromptFlow(): void {\r\n const refs = this.promptRefs;\r\n this.promptRefs = [];\r\n this.promptFlowOpen = false;\r\n this.promptRefreshQueued = false;\r\n for (const ref of refs) {\r\n try {\r\n ref.close();\r\n } catch {\r\n // best-effort: a ref already closed by the user throws nothing useful\r\n }\r\n }\r\n }\r\n\r\n private finishPromptFlow(): void {\r\n this.promptFlowOpen = false;\r\n this.promptRefs = [];\r\n if (!this.promptRefreshQueued) return;\r\n this.promptRefreshQueued = false;\r\n const latest = this.candidates();\r\n if (\r\n !this.destroyed &&\r\n this.promptOnCandidates() &&\r\n !this.active() &&\r\n latest.length\r\n ) {\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-80 max-w-[92vw]\">\r\n <mt-delegation-menu-panel\r\n [managePath]=\"managePath()\"\r\n [showManageLink]=\"showManageLink()\"\r\n [currentUser]=\"currentUser()\"\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 { 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 {\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;\r\n delegationDaysType: DelegationDayRuleMode;\r\n specificDays?: number[];\r\n requiresApproval: boolean;\r\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;\r\n delegationDaysType: DelegationDayRuleMode;\r\n specificDays?: number[];\r\n requiresApproval: boolean;\r\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 { ModalService } from '@masterteam/components/modal';\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 /** Supplies the shared `mt-modal-content` / `mt-modal-footer` shell classes. */\r\n protected readonly modal = inject(ModalService);\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\r\n [class]=\"modal.contentClass + ' flex flex-col gap-4 overflow-y-auto p-5'\"\r\n >\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 </div>\r\n\r\n <div [class]=\"modal.footerClass\">\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</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,\r\n RadioButtonFieldConfig,\r\n REQUEST_CONTEXT,\r\n TextareaFieldConfig,\r\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';\r\nimport { delegationScopeFingerprint } from '../../../store/delegations/scope-fingerprint';\r\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.\r\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);\r\n private readonly facade = inject(DelegationsFacade);\r\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({\r\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,\r\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,\r\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,\r\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,\r\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,\r\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":["STORAGE_KEY","BASE","__decorate","isRecord","EMPTY_SCOPE","i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-delegations.mjs","sources":["../../../../packages/masterteam/delegations/src/store/session/delegation-session.actions.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-runtime.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-prompt-receipts.ts","../../../../packages/masterteam/delegations/src/runtime/delegation-session-resume.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-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/lib/delegations/delegation-status-chip/delegation-status-chip.ts","../../../../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 { 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/**\r\n * Re-mint the session the user was in before they reloaded the page, from the\r\n * persisted delegation id — never a token.\r\n *\r\n * Pass `delegation` when the row is already in hand; otherwise the state loads\r\n * the candidates itself, so a host can await this action **before** the\r\n * authenticated shell mounts and boot straight into delegated mode instead of\r\n * loading everything twice.\r\n *\r\n * Completes quietly when there is nothing to resume or the delegation is no\r\n * longer startable — the user simply stays themselves.\r\n */\r\nexport class ResumeDelegationSession {\r\n static readonly type = '[DelegationSession] Resume';\r\n constructor(public delegation: DelegationRow | null = null) {}\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 { 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 {\r\n ActiveDelegationSession,\r\n DelegationSessionInvalidationReason,\r\n} 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\n/**\r\n * Why the effective actor changed. `StartSession` / `SwitchSession` mean a new\r\n * delegated actor is now in force; every other value ends delegated mode. Hosts\r\n * should branch on this — `Logout`, `UserSwitch`, `TenantSwitch` and `AppSwitch`\r\n * are session teardowns where there is no new actor to load data for.\r\n */\r\nexport type DelegationContextChangeReason =\r\n | DelegationSessionInvalidationReason\r\n | 'StartSession'\r\n | 'SwitchSession'\r\n /** Re-minted after a page reload — same actor, so the host should stay put. */\r\n | 'ResumeSession';\r\n\r\nexport interface DelegationContextChange {\r\n previous: ActiveDelegationSession | null;\r\n current: ActiveDelegationSession | null;\r\n reason: DelegationContextChangeReason;\r\n}\r\n\r\nexport interface DelegationRuntimeConfig {\r\n resolveApplicationApiBaseUrl: () => string;\r\n resolvePromptNamespace: () => DelegationPromptNamespace;\r\n onContextChanged: (change: DelegationContextChange) => void | Promise<void>;\r\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,\r\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 { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport { DELEGATION_RUNTIME_CONFIG } from './delegation-runtime';\n\nconst STORAGE_KEY = 'mt.delegation.session-resume.v1';\n\ninterface ResumeMarker {\n /** `userId|applicationKey|tenantKey` — who the marker belongs to. */\n ns: string;\n delegationId: number;\n}\n\n/**\n * Lets a delegated session survive a page reload **without persisting the\n * token**.\n *\n * Doc 05 is unambiguous: the delegation access token is memory-only, and it\n * stays that way — this store keeps a single opaque `delegationId` plus the\n * owning user/app/tenant namespace. On the next boot the runtime calls\n * `POST identity/delegations/{id}/session` again and mints a *fresh* token,\n * which is what doc 09 already prescribes for restarting a session (\"use the\n * newly returned token because the scope hash or delegation version may have\n * changed\"). The backend re-authorizes from scratch every time, so a delegation\n * that expired, was cancelled, or had its scope revoked while the tab was shut\n * simply fails to resume and the user stays themselves.\n *\n * Never holds a token, a candidate record, a name, or an email.\n */\n@Injectable({ providedIn: 'root' })\nexport class DelegationSessionResumeStore {\n private readonly document = inject(DOCUMENT);\n private readonly config = inject(DELEGATION_RUNTIME_CONFIG);\n\n remember(delegationId: number): void {\n this.write({ ns: this.namespace(), delegationId });\n }\n\n /**\n * The delegation to resume for the *current* user/app/tenant, or `null`. A\n * marker left by a different actor is dropped rather than honoured, so\n * signing in as someone else on a shared browser never resumes their\n * delegation.\n */\n pending(): number | null {\n const marker = this.read();\n if (!marker) {\n return null;\n }\n if (marker.ns !== this.namespace()) {\n this.clear();\n return null;\n }\n return marker.delegationId;\n }\n\n clear(): void {\n try {\n this.storage()?.removeItem(STORAGE_KEY);\n } catch {\n // Storage can be unavailable (private mode, blocked cookies).\n }\n }\n\n private namespace(): string {\n const { userId, applicationKey, tenantKey } =\n this.config.resolvePromptNamespace();\n return [userId, applicationKey, tenantKey ?? ''].join('|');\n }\n\n private read(): ResumeMarker | null {\n try {\n const raw = this.storage()?.getItem(STORAGE_KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : null;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n typeof (parsed as ResumeMarker).ns !== 'string' ||\n typeof (parsed as ResumeMarker).delegationId !== 'number'\n ) {\n return null;\n }\n return parsed as ResumeMarker;\n } catch {\n return null;\n }\n }\n\n private write(marker: ResumeMarker): void {\n try {\n this.storage()?.setItem(STORAGE_KEY, JSON.stringify(marker));\n } catch {\n // Storage can be unavailable; delegated mode then simply ends on reload.\n }\n }\n\n private storage(): Storage | null {\n return this.document.defaultView?.localStorage ?? null;\n }\n}\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 { catchError, EMPTY, from, switchMap } from 'rxjs';\r\nimport {\r\n DELEGATION_RUNTIME_CONFIG,\r\n type DelegationContextChangeReason,\r\n} from '../../runtime/delegation-runtime';\r\nimport { DelegationSessionResumeStore } from '../../runtime/delegation-session-resume';\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 ResumeDelegationSession,\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/** `setTimeout` stores its delay in a signed 32-bit int; anything larger wraps\r\n * around and fires immediately. Clamp so a long-lived session never self-ends. */\r\nconst MAX_TIMEOUT_MS = 2 ** 31 - 1;\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 * Bumped whenever candidates are cleared (logout / user / tenant / app\r\n * switch). A `LoadDelegationCandidates` response that was already in flight\r\n * when the actor went away resolves against a stale generation and is\r\n * dropped, so the previous user's delegators can never repopulate the menu —\r\n * or open the availability prompt — after sign-out.\r\n */\r\n private candidatesGeneration = 0;\r\n private resumeStore = inject(DelegationSessionResumeStore);\r\n /** One resume attempt per page load — a dead delegation must not retry. */\r\n private resumeAttempted = false;\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 generation = this.candidatesGeneration;\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 // The actor changed while this request was in flight — discard it.\r\n if (generation !== this.candidatesGeneration) {\r\n return;\r\n }\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 if (!active && page === 1) {\r\n this.tryResume(candidates);\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 /**\r\n * Fallback resume for hosts that do not await {@link ResumeDelegationSession}\r\n * before mounting their authenticated shell: pick the session back up as soon\r\n * as the candidates arrive.\r\n *\r\n * Prefer the awaited path — resuming after the shell has already loaded means\r\n * every actor-scoped read runs twice, once as the real user and again under\r\n * delegated authority.\r\n */\r\n private tryResume(candidates: DelegationRow[]): void {\r\n if (this.resumeAttempted || this.resumeStore.pending() == null) {\r\n return;\r\n }\r\n const delegationId = this.resumeStore.pending();\r\n const row = candidates.find(\r\n (candidate) => candidate.delegationId === delegationId,\r\n );\r\n if (!row) {\r\n // No longer startable (expired, cancelled, scope revoked) — forget it.\r\n this.resumeAttempted = true;\r\n this.resumeStore.clear();\r\n return;\r\n }\r\n queueMicrotask(() =>\r\n this.store.dispatch(new ResumeDelegationSession(row)).subscribe(),\r\n );\r\n }\r\n\r\n @Action(ResumeDelegationSession)\r\n resume(\r\n ctx: StateContext<DelegationSessionStateModel>,\r\n { delegation }: ResumeDelegationSession,\r\n ) {\r\n const delegationId = this.resumeStore.pending();\r\n if (ctx.getState().active || delegationId == null) {\r\n return EMPTY;\r\n }\r\n // Claim the attempt up front so the nested candidate load below does not\r\n // also fire `tryResume` for the same delegation.\r\n this.resumeAttempted = true;\r\n\r\n const known =\r\n delegation?.delegationId === delegationId\r\n ? delegation\r\n : ctx\r\n .getState()\r\n .candidates.find(\r\n (candidate) => candidate.delegationId === delegationId,\r\n );\r\n\r\n const start$ = known\r\n ? this.startSession(ctx, known, null, 'ResumeSession')\r\n : this.store.dispatch(new LoadDelegationCandidates()).pipe(\r\n switchMap(() => {\r\n const row = ctx\r\n .getState()\r\n .candidates.find(\r\n (candidate) => candidate.delegationId === delegationId,\r\n );\r\n if (!row) {\r\n // Expired, cancelled, or scope revoked while the tab was closed.\r\n this.resumeStore.clear();\r\n return EMPTY;\r\n }\r\n return this.startSession(ctx, row, null, 'ResumeSession');\r\n }),\r\n );\r\n\r\n // A failed resume is not the caller's problem: drop the marker and let the\r\n // user carry on as themselves rather than blocking the boot on an error.\r\n return start$.pipe(\r\n catchError(() => {\r\n this.resumeStore.clear();\r\n return EMPTY;\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: DelegationContextChangeReason,\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 // Id only — see `DelegationSessionResumeStore`. Never the token.\r\n this.resumeStore.remember(delegation.delegationId);\r\n this.resumeAttempted = true;\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 const clearCandidates = shouldClearCandidates(reason);\r\n\r\n // Whatever the reason, delegated mode is over — a reload must not bring it\r\n // back. Also blocks a resume that is still queued behind this action.\r\n this.resumeStore.clear();\r\n this.resumeAttempted = true;\r\n\r\n // Logout / user / tenant / app switch must always drop the candidate list,\r\n // even when no delegated session was ever started. Leaving it behind kept\r\n // the previous actor's delegators in memory across sign-out, which is both\r\n // a leak into the next session and the reason the availability prompt could\r\n // reopen over the login page.\r\n if (clearCandidates) {\r\n this.candidatesGeneration++;\r\n ctx.patchState({\r\n candidates: [],\r\n candidatesTotalCount: 0,\r\n candidatesPage: 1,\r\n });\r\n }\r\n\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({ active: null });\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 clearCandidates\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 expiresAt = Date.parse(active.expiresAtUtc ?? '');\r\n // A missing or unparseable expiry used to produce a NaN delay, which\r\n // `setTimeout` coerces to 0 — the session ended on the very next tick and\r\n // the user silently fell back to their own identity. Fail open instead and\r\n // let the backend's `delegationReasonCode` end the session (doc 05).\r\n if (!Number.isFinite(expiresAt)) {\r\n return;\r\n }\r\n const delay = Math.min(Math.max(0, expiresAt - Date.now()), MAX_TIMEOUT_MS);\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';\nimport { select, Store } from '@ngxs/store';\nimport { finalize, Observable, shareReplay } from 'rxjs';\nimport { DelegationPromptReceiptService } from '../../runtime/delegation-prompt-receipts';\nimport { DelegationSessionResumeStore } from '../../runtime/delegation-session-resume';\nimport {\n EndDelegationSession,\n LoadDelegationCandidates,\n ResumeDelegationSession,\n StartDelegationSession,\n SwitchDelegationSession,\n} from './delegation-session.actions';\nimport {\n DelegationSessionActionKey,\n DelegationSessionInvalidationReason,\n DelegationSessionStateModel,\n} from './delegation-session.model';\nimport { DelegationSessionState } from './delegation-session.state';\nimport { DelegationRow } from '../delegations/delegations.model';\n\n@Injectable({ providedIn: 'root' })\nexport class DelegationSessionFacade {\n private readonly store = inject(Store);\n private readonly promptReceipts = inject(DelegationPromptReceiptService);\n private readonly resumeStore = inject(DelegationSessionResumeStore);\n private endInFlight: Observable<unknown> | null = null;\n\n // ---------------------------------------------------------------------------\n // Data slices\n // ---------------------------------------------------------------------------\n readonly active = select(DelegationSessionState.getActive);\n readonly candidates = select(DelegationSessionState.getCandidates);\n readonly candidatesTotalCount = select(\n DelegationSessionState.getCandidatesTotalCount,\n );\n readonly isDelegated = select(DelegationSessionState.isDelegated);\n\n private readonly loadingActive = select(\n DelegationSessionState.getLoadingActive,\n );\n\n // ---------------------------------------------------------------------------\n // Derived (interceptor + topbar)\n // ---------------------------------------------------------------------------\n /** On-behalf-of (delegator). */\n readonly onBehalfOf = computed(\n () => this.active()?.delegation.delegator ?? null,\n );\n /**\n * Executed-by (the real signed-in user), known whether or not a session is\n * active: every assigned row carries the current user as its `delegatedUser`,\n * so the account switcher can list \"you\" alongside the delegators without the\n * package depending on the host's auth state.\n */\n readonly executedBy = computed(\n () =>\n this.active()?.delegation.delegatedUser ??\n this.candidates()[0]?.delegatedUser ??\n null,\n );\n readonly hasCandidates = computed(() => this.candidates().length > 0);\n readonly hasMoreCandidates = computed(\n () => this.candidates().length < this.candidatesTotalCount(),\n );\n\n readonly isStarting = computed(() =>\n this.loadingActive().includes(DelegationSessionActionKey.StartSession),\n );\n readonly isLoadingCandidates = computed(() =>\n this.loadingActive().includes(DelegationSessionActionKey.LoadCandidates),\n );\n\n // ---------------------------------------------------------------------------\n // Dispatchers\n // ---------------------------------------------------------------------------\n loadCandidates(page = 1, pageSize = 25, append = false) {\n return this.store.dispatch(\n new LoadDelegationCandidates(page, pageSize, append),\n );\n }\n loadMoreCandidates() {\n const state = this.store.selectSnapshot<DelegationSessionStateModel>(\n (snapshot) => snapshot.delegationSession,\n );\n if (!state || state.candidates.length >= state.candidatesTotalCount) {\n return this.store.dispatch([]);\n }\n return this.loadCandidates(\n state.candidatesPage + 1,\n state.candidatesPageSize,\n true,\n );\n }\n claimPromptCandidates(candidates: DelegationRow[]) {\n return this.promptReceipts.claimUnseen(candidates);\n }\n /**\n * True when a previous session is waiting to be re-minted after a reload.\n * Synchronous (a `localStorage` read), so a route guard can check it without\n * paying for a round-trip on the overwhelmingly common no-delegation boot.\n */\n hasPendingResume(): boolean {\n return this.resumeStore.pending() != null;\n }\n /**\n * Re-mints the delegated session the user reloaded out of, and completes when\n * delegated mode is in force (or when there is nothing to resume). Await this\n * **before** mounting the authenticated shell so its reads run once, already\n * delegated.\n */\n resumeSession() {\n return this.store.dispatch(new ResumeDelegationSession());\n }\n startSession(delegation: DelegationRow) {\n return this.store.dispatch(new StartDelegationSession(delegation));\n }\n switchSession(delegation: DelegationRow) {\n return this.store.dispatch(new SwitchDelegationSession(delegation));\n }\n endSession(reason: DelegationSessionInvalidationReason = 'Manual') {\n if (this.endInFlight) {\n return this.endInFlight;\n }\n const operation = this.store\n .dispatch(new EndDelegationSession(reason))\n .pipe(\n finalize(() => (this.endInFlight = null)),\n shareReplay({ bufferSize: 1, refCount: false }),\n );\n this.endInFlight = operation;\n return operation;\n }\n}\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 { ModalService } from '@masterteam/components/modal';\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 /** Supplies the shared `mt-modal-content` / `mt-modal-footer` shell classes. */\r\n protected readonly modal = inject(ModalService);\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\r\n [class]=\"modal.contentClass + ' flex flex-col gap-4 overflow-y-auto p-5'\"\r\n >\r\n <mt-entity-preview\r\n [data]=\"userEntity(delegation().delegator)\"\r\n ></mt-entity-preview>\r\n\r\n <p class=\"text-sm leading-relaxed text-surface-600\">\r\n {{ t(bodyKey()) }}\r\n </p>\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\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</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 { ModalService } from '@masterteam/components/modal';\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 /** Supplies the shared `mt-modal-content` / `mt-modal-footer` shell classes. */\r\n protected readonly modal = inject(ModalService);\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\r\n [class]=\"modal.contentClass + ' flex flex-col gap-4 overflow-y-auto p-5'\"\r\n >\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 flex-col gap-2\">\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-lg border border-solid border-surface-200 bg-surface-0 px-3 py-2.5 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 </div>\r\n\r\n <div [class]=\"modal.footerClass\">\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</ng-container>\r\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { ModalService } from '@masterteam/components/modal';\nimport { ToastService } from '@masterteam/components/toast';\nimport { Icon } from '@masterteam/icons';\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\nimport {\n DelegationParty,\n DelegationRow,\n} from '../../../store/delegations/delegations.model';\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\n\n/** One selectable identity in the switcher. */\nexport interface DelegationIdentityOption {\n /** `null` for the real signed-in user; the delegation row otherwise. */\n row: DelegationRow | null;\n party: DelegationParty | null;\n isSelf: boolean;\n isActive: boolean;\n initials: string;\n}\n\n/**\n * Embeddable \"acting as\" account switcher (doc 05, 09).\n *\n * Renders one row per identity the user can operate as — themselves first, then\n * every delegator who has an active delegation assigned to them — with the\n * current one checked. Picking a row starts, switches, or ends the delegated\n * session; the {@link StartSessionDialog} still takes explicit consent before\n * any session begins, so this list never changes authority on its own.\n *\n * Designed to be dropped inside a host menu (e.g. the user-avatar dropdown) or\n * the topbar popover. Candidate loading + the post-login prompt stay in the\n * always-mounted `TopbarDelegationMenu` controller.\n *\n * Emits `closeRequested` after any action so the host overlay can dismiss.\n */\n@Component({\n selector: 'mt-delegation-menu-panel',\n standalone: true,\n imports: [CommonModule, Avatar, Icon, RouterLink, TranslocoDirective],\n templateUrl: './delegation-menu-panel.html',\n styleUrls: ['./delegation-menu-panel.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DelegationMenuPanel {\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\n readonly managePath = input<string>('/delegations');\n readonly showManageLink = input<boolean>(true);\n /**\n * Optional richer profile for the \"you\" row. Falls back to the current user\n * carried on the assigned delegation rows, so the host may omit it.\n */\n readonly currentUser = input<DelegationParty | null>(null);\n readonly closeRequested = output<void>();\n\n private readonly facade = inject(DelegationSessionFacade);\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n private readonly toast = inject(ToastService);\n\n protected readonly active = this.facade.active;\n protected readonly candidates = this.facade.candidates;\n protected readonly hasCandidates = this.facade.hasCandidates;\n protected readonly hasMoreCandidates = this.facade.hasMoreCandidates;\n protected readonly isLoadingCandidates = this.facade.isLoadingCandidates;\n protected readonly isBusy = this.facade.isStarting;\n protected readonly onBehalfOf = this.facade.onBehalfOf;\n\n /** The real signed-in user — host-supplied when available, derived otherwise. */\n protected readonly self = computed<DelegationParty | null>(\n () => this.currentUser() ?? this.facade.executedBy(),\n );\n\n /** Nothing to switch between and no session running — render nothing. */\n protected readonly visible = computed(\n () => !!this.active() || this.hasCandidates(),\n );\n\n /** \"You\", then every delegator. The active identity carries the checkmark. */\n protected readonly identities = computed<DelegationIdentityOption[]>(() => {\n const activeSession = this.active();\n const activeId = activeSession?.delegation.delegationId ?? null;\n const self = this.self();\n const candidates = this.candidates();\n\n // The identity in force is always listed, even if it has fallen off the\n // first page of candidates — a switcher that cannot show who you currently\n // are is worse than one extra row.\n const rows =\n activeSession && !candidates.some((row) => row.delegationId === activeId)\n ? [activeSession.delegation, ...candidates]\n : candidates;\n\n return [\n {\n row: null,\n party: self,\n isSelf: true,\n isActive: activeId === null,\n initials: this.initials(self),\n },\n ...rows.map((row) => ({\n row,\n party: row.delegator,\n isSelf: false,\n isActive: row.delegationId === activeId,\n initials: this.initials(row.delegator),\n })),\n ];\n });\n\n /** Two-letter initials for an avatar (matches the user-menu pattern). */\n protected initials(party: DelegationParty | null | undefined): string {\n const name = party?.displayName?.trim() || party?.email?.trim() || '';\n const parts = name.split(/\\s+/).filter(Boolean);\n if (!parts.length) return '?';\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n protected select(option: DelegationIdentityOption, event: Event): void {\n event.stopPropagation();\n if (option.isActive || this.isBusy()) {\n return;\n }\n\n this.closeRequested.emit();\n\n if (option.isSelf) {\n // Back to your own authority. There is no server call (doc 05) — ending\n // is local — so no confirmation dialog stands between the user and it.\n this.facade.endSession('Manual').subscribe({\n next: () =>\n this.toast.success(\n this.transloco.translate('delegations.session.ended'),\n ),\n });\n return;\n }\n\n if (!option.row) {\n return;\n }\n this.openConfirm(option.row, this.active() ? 'switch' : 'start');\n }\n\n protected onManage(): void {\n this.closeRequested.emit();\n }\n\n protected loadMore(event: MouseEvent): void {\n event.stopPropagation();\n this.facade.loadMoreCandidates().subscribe();\n }\n\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch'): void {\n this.modal.openModal(StartSessionDialog, 'dialog', {\n header: this.transloco.translate(\n intent === 'switch'\n ? 'delegations.action.switchSession'\n : 'delegations.action.startSession',\n ),\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row, intent },\n });\n }\n}\n","<ng-container *transloco=\"let t\">\n @if (visible()) {\n <div class=\"mt-delegation-switcher flex w-full flex-col\">\n <!-- Header: what this list is, and the current mode at a glance -->\n <div class=\"flex flex-col gap-0.5 px-4 pb-2 pt-3\">\n <span\n class=\"text-[0.6875rem] font-semibold uppercase tracking-wide text-surface-400\"\n >\n {{ t(\"delegations.session.actingAs\") }}\n </span>\n @if (active()) {\n <span class=\"text-xs text-surface-500\">\n {{\n t(\"delegations.session.switchBackHint\", {\n actualUserName: self()?.displayName,\n })\n }}\n </span>\n } @else {\n <span class=\"text-xs text-surface-500\">\n {{ t(\"delegations.session.chooseDelegatorHint\") }}\n </span>\n }\n </div>\n\n <!-- Identity list: you first, then everyone who delegated to you -->\n <div\n class=\"mt-delegation-switcher__list flex max-h-80 flex-col gap-0.5 overflow-y-auto px-1.5 pb-1.5\"\n role=\"listbox\"\n [attr.aria-label]=\"t('delegations.session.actingAs')\"\n >\n @for (\n option of identities();\n track option.row?.delegationId ?? \"self\"\n ) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"mt-delegation-switcher__row\"\n [class.mt-delegation-switcher__row--active]=\"option.isActive\"\n [attr.aria-selected]=\"option.isActive\"\n [disabled]=\"isBusy() || option.isActive\"\n [attr.aria-label]=\"\n option.isSelf\n ? t('delegations.session.actAsSelfAria', {\n actualUserName: option.party?.displayName,\n })\n : t('delegations.session.promptStartAria', {\n delegatorName: option.party?.displayName,\n })\n \"\n (click)=\"select(option, $event)\"\n >\n <span class=\"relative shrink-0\">\n <mt-avatar\n [label]=\"option.initials\"\n shape=\"circle\"\n [styleClass]=\"\n option.isActive\n ? '!size-9 !text-xs !bg-primary-100 !text-primary-700'\n : '!size-9 !text-xs !bg-surface-100 !text-surface-600'\n \"\n ></mt-avatar>\n @if (option.isActive && !option.isSelf) {\n <span\n class=\"absolute -bottom-0.5 -end-0.5 flex size-4 items-center justify-center rounded-full bg-primary ring-2 ring-surface-0\"\n aria-hidden=\"true\"\n >\n <mt-icon\n icon=\"user.users-check\"\n styleClass=\"text-[0.55rem] text-white\"\n ></mt-icon>\n </span>\n }\n </span>\n\n <span class=\"flex min-w-0 flex-1 flex-col text-start\">\n <span class=\"flex min-w-0 items-center gap-1.5\">\n <span\n class=\"truncate text-sm font-semibold text-surface-800\"\n [class.text-primary-700]=\"option.isActive\"\n >\n {{ option.party?.displayName }}\n </span>\n @if (option.isSelf) {\n <span class=\"mt-delegation-switcher__badge\">\n {{ t(\"delegations.session.you\") }}\n </span>\n }\n </span>\n <span class=\"truncate text-xs text-surface-500\">\n @if (option.isSelf) {\n {{\n option.party?.email ||\n t(\"delegations.session.ownAccountHint\")\n }}\n } @else {\n {{\n t(\"delegations.session.until\", {\n date: option.row?.endsAtUtc | date: \"mediumDate\",\n })\n }}\n }\n </span>\n </span>\n\n @if (option.isActive) {\n <mt-icon\n icon=\"general.check\"\n styleClass=\"text-base text-primary shrink-0\"\n ></mt-icon>\n } @else {\n <mt-icon\n icon=\"arrow.chevron-right\"\n styleClass=\"mt-delegation-switcher__chevron text-base text-surface-400 shrink-0\"\n ></mt-icon>\n }\n </button>\n }\n\n @if (hasMoreCandidates()) {\n <button\n type=\"button\"\n class=\"mx-1.5 my-1 rounded-lg px-3 py-2 text-sm font-medium text-primary hover:bg-primary-50 disabled:opacity-60\"\n [disabled]=\"isLoadingCandidates()\"\n (click)=\"loadMore($event)\"\n >\n {{ t(\"delegations.session.loadMore\") }}\n </button>\n }\n </div>\n\n @if (showManageLink()) {\n <div class=\"border-t border-surface p-1.5\">\n <a\n [routerLink]=\"managePath()\"\n (click)=\"onManage()\"\n class=\"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-sm text-surface-700 hover:bg-surface-100\"\n >\n <mt-icon\n icon=\"general.settings-02\"\n styleClass=\"text-base\"\n ></mt-icon>\n <span>{{ t(\"delegations.session.manage\") }}</span>\n </a>\n </div>\n }\n </div>\n }\n</ng-container>\n","import { CommonModule } from '@angular/common';\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 OnInit,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Actions, ofActionSuccessful } from '@ngxs/store';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { Popover } from 'primeng/popover';\r\nimport { ResumeDelegationSession } from '../../../store/session/delegation-session.actions';\r\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\r\nimport {\r\n DelegationParty,\r\n DelegationRow,\r\n} 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 * Optional richer profile for the \"you\" row of the switcher. Forwarded to\r\n * {@link DelegationMenuPanel}; omit it and the current user is derived from\r\n * the assigned delegation rows.\r\n */\r\n readonly currentUser = input<DelegationParty | null>(null);\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 private readonly destroyRef = inject(DestroyRef);\r\n private readonly actions$ = inject(Actions);\r\n private readonly toast = inject(ToastService);\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 private destroyed = false;\r\n /**\r\n * Dialogs opened through `ModalService` live on `document.body`, so they\r\n * outlive this component. Held so the whole prompt flow can be torn down when\r\n * the authenticated shell goes away (sign-out) instead of stranding an\r\n * \"act on behalf of\" dialog over the login page.\r\n */\r\n private promptRefs: { close: (value?: never) => void }[] = [];\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 // Candidates emptying mid-flow means the actor is gone (sign-out, user /\r\n // tenant / app switch). Nothing in the prompt is valid any more.\r\n effect(() => {\r\n if (!this.candidates().length) {\r\n this.closePromptFlow();\r\n }\r\n });\r\n\r\n // A resumed session is the one state change the user did not just ask for\r\n // — it happens silently on page load. Say so, or \"acting as someone else\"\r\n // looks like the app forgot who they are.\r\n this.actions$\r\n .pipe(ofActionSuccessful(ResumeDelegationSession), takeUntilDestroyed())\r\n .subscribe(() => {\r\n const delegatorName = this.onBehalfOf()?.displayName;\r\n if (delegatorName) {\r\n this.toast.info(\r\n this.transloco.translate('delegations.session.resumed', {\r\n delegatorName,\r\n }),\r\n );\r\n }\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.destroyed = true;\r\n this.closePromptFlow();\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 // `claimUnseen` is async (SubtleCrypto). The user can sign out inside\r\n // that window, which destroys this controller and empties the candidate\r\n // list — opening then would drop the dialog on the login page.\r\n if (\r\n unseen.length &&\r\n !this.destroyed &&\r\n !this.active() &&\r\n this.candidates().length\r\n ) {\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 (\r\n !this.destroyed &&\r\n this.promptOnCandidates() &&\r\n !this.active() &&\r\n latest.length\r\n ) {\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 this.trackPromptRef(ref);\r\n\r\n ref.onClose.subscribe((row: DelegationRow | null | undefined) => {\r\n if (row && !this.destroyed) {\r\n this.trackPromptRef(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 trackPromptRef<TRef extends { close: (value?: never) => void }>(\r\n ref: TRef,\r\n ): TRef {\r\n this.promptRefs.push(ref);\r\n return ref;\r\n }\r\n\r\n /** Tears down anything the prompt flow left on `document.body`. */\r\n private closePromptFlow(): void {\r\n const refs = this.promptRefs;\r\n this.promptRefs = [];\r\n this.promptFlowOpen = false;\r\n this.promptRefreshQueued = false;\r\n for (const ref of refs) {\r\n try {\r\n ref.close();\r\n } catch {\r\n // best-effort: a ref already closed by the user throws nothing useful\r\n }\r\n }\r\n }\r\n\r\n private finishPromptFlow(): void {\r\n this.promptFlowOpen = false;\r\n this.promptRefs = [];\r\n if (!this.promptRefreshQueued) return;\r\n this.promptRefreshQueued = false;\r\n const latest = this.candidates();\r\n if (\r\n !this.destroyed &&\r\n this.promptOnCandidates() &&\r\n !this.active() &&\r\n latest.length\r\n ) {\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-80 max-w-[92vw]\">\r\n <mt-delegation-menu-panel\r\n [managePath]=\"managePath()\"\r\n [showManageLink]=\"showManageLink()\"\r\n [currentUser]=\"currentUser()\"\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 { 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 {\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;\r\n delegationDaysType: DelegationDayRuleMode;\r\n specificDays?: number[];\r\n requiresApproval: boolean;\r\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;\r\n delegationDaysType: DelegationDayRuleMode;\r\n specificDays?: number[];\r\n requiresApproval: boolean;\r\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 { ModalService } from '@masterteam/components/modal';\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 /** Supplies the shared `mt-modal-content` / `mt-modal-footer` shell classes. */\r\n protected readonly modal = inject(ModalService);\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\r\n [class]=\"modal.contentClass + ' flex flex-col gap-4 overflow-y-auto p-5'\"\r\n >\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 </div>\r\n\r\n <div [class]=\"modal.footerClass\">\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</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,\r\n RadioButtonFieldConfig,\r\n REQUEST_CONTEXT,\r\n TextareaFieldConfig,\r\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';\r\nimport { delegationScopeFingerprint } from '../../../store/delegations/scope-fingerprint';\r\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.\r\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);\r\n private readonly facade = inject(DelegationsFacade);\r\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({\r\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,\r\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,\r\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,\r\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,\r\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,\r\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":["STORAGE_KEY","BASE","__decorate","isRecord","EMPTY_SCOPE","i1","i2"],"mappings":"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"}