mesauth-angular 1.18.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"mesauth-angular.mjs","sources":["../../src/ma-ui-config.service.ts","../../src/x-ma-perm.pipe.ts","../../src/mes-auth.service.ts","../../src/mes-auth.interceptor.ts","../../src/mes-auth.module.ts","../../src/theme.service.ts","../../src/ma-avatar.component.ts","../../src/ma-avatar.component.html","../../src/user-profile.component.ts","../../src/user-profile.component.html","../../src/toast.service.ts","../../src/toast-container.component.ts","../../src/toast-container.component.html","../../src/notification-panel.component.ts","../../src/notification-panel.component.html","../../src/approval.service.ts","../../src/approval.models.ts","../../src/ma-approval-panel.component.ts","../../src/ma-approval-panel.component.html","../../src/ma-user.component.ts","../../src/ma-user.component.html","../../src/ma-ux.component.ts","../../src/ma-ux.component.html","../../src/notification-badge.component.ts","../../src/notification-badge.component.html","../../src/ma-arv-container.component.ts","../../src/ma-arv-container.component.html","../../src/x-ma-resource.ts","../../src/ma-icon.component.ts","../../src/ma-theme.directive.ts","../../src/ma-user-menu-color.ts","../../src/ma-user-menu.component.ts","../../src/ma-user-menu.component.html","../../src/sso-handshake.helper.ts","../../src/index.ts","../../src/mesauth-angular.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, of } from 'rxjs';\n\nexport interface MaUiManifest {\n /** Version of the package that created this manifest. */\n version: string;\n /** Latest published package version — library logs a warning if installed version is older. */\n latestPackageVersion?: string;\n /** Set true to show an upgrade banner inside components. */\n updateRequired?: boolean;\n /** URL override for the theme CSS (defaults to themes/default.css relative to assetsUrl). */\n themeUrl?: string;\n /** URL override for the SVG icon sprite. */\n iconSpriteUrl?: string;\n /** UI string overrides — keys match component label identifiers. */\n labels?: Record<string, string>;\n /** Feature flags read by components at runtime. */\n features?: Record<string, boolean>;\n}\n\n/** Current installed package version — keep in sync with package.json. */\nexport const PACKAGE_VERSION = '1.18.0';\n\n/**\n * Provides server-driven UI configuration loaded from the hosted manifest.\n * Components read `labels()` and `features()` signals instead of hardcoded strings.\n * Update manifest.json on the server to change labels or toggle features without\n * republishing the npm package.\n */\n@Injectable({ providedIn: 'root' })\nexport class MaUiConfigService {\n private _labels = signal<Record<string, string>>({});\n private _features = signal<Record<string, boolean>>({\n showApprovalPanel: true,\n showNotificationPanel: true\n });\n private _updateRequired = signal(false);\n private _manifestVersion = signal<string | null>(null);\n\n /** Reactive map of UI string overrides from the server manifest. */\n readonly labels = this._labels.asReadonly();\n /** Reactive map of feature flags from the server manifest. */\n readonly features = this._features.asReadonly();\n /** True when the server signals that a package upgrade is needed. */\n readonly updateRequired = this._updateRequired.asReadonly();\n /** The manifest version string loaded from the server, or null if not yet loaded. */\n readonly manifestVersion = this._manifestVersion.asReadonly();\n\n /**\n * Returns a label by key, falling back to `defaultValue` when the server\n * manifest has not provided an override.\n */\n label(key: string, defaultValue: string): string {\n return this._labels()[key] ?? defaultValue;\n }\n\n /**\n * Returns a feature flag by key, falling back to `defaultValue`.\n */\n feature(key: string, defaultValue = true): boolean {\n const val = this._features()[key];\n return val !== undefined ? val : defaultValue;\n }\n\n /**\n * Called by MesAuthService.init() — fetches the manifest and applies any\n * label/feature overrides. Failures are silently ignored so the library\n * works without a manifest endpoint.\n */\n loadManifest(assetsUrl: string, http: HttpClient): void {\n http.get<MaUiManifest>(`${assetsUrl}/manifest.json`).pipe(\n catchError(() => of(null))\n ).subscribe(manifest => {\n if (!manifest) return;\n\n if (manifest.labels) this._labels.set(manifest.labels);\n if (manifest.features) this._features.update(f => ({ ...f, ...manifest.features }));\n if (manifest.updateRequired) this._updateRequired.set(true);\n if (manifest.version) this._manifestVersion.set(manifest.version);\n\n // Version-check: warn dev team when a newer package is available\n const latest = manifest.latestPackageVersion;\n if (latest && latest !== PACKAGE_VERSION) {\n console.warn(\n `[mesauth-angular] A newer version (${latest}) is available. ` +\n `Installed: ${PACKAGE_VERSION}. Please update the package.`\n );\n }\n });\n }\n}\n","import { HttpResponse } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\nimport { OperatorFunction } from 'rxjs';\n\nexport interface PermissionHeader {\n resource: string;\n allowedActions: string[];\n}\n// ─── Utility: extract allowedActions from x-ma-perm header ───\n \nexport const ALL_ACTIONS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'WEBSOCKET'] as const;\n\nexport function extractXMaPerm(response: HttpResponse<unknown>): string[] {\n const raw = response.headers.get('x-ma-perm');\n if (!raw) return [];\n \n try {\n const parsed = JSON.parse(raw) as PermissionHeader;\n const actions = parsed?.allowedActions ?? [];\n // Wildcard means all actions are allowed\n if (actions.includes('*')) return [...ALL_ACTIONS];\n return actions;\n } catch {\n return [];\n }\n}\n \n// ─── RxJS operator: pipe it on any HttpClient call ───\n \nexport function withXMaPerm<T>(): OperatorFunction<\n HttpResponse<T>,\n { data: T; allowedActions: string[] }\n> {\n return map((response: HttpResponse<T>) => ({\n data: response.body as T,\n allowedActions: extractXMaPerm(response),\n }));\n}","import { inject, Injectable, InjectionToken, EnvironmentProviders, makeEnvironmentProviders, provideAppInitializer, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { MaUiConfigService, PACKAGE_VERSION } from './ma-ui-config.service';\nimport { HttpClient } from '@angular/common/http';\nimport { HubConnection, HubConnectionBuilder, LogLevel } from '@microsoft/signalr';\nimport { Subject, Observable, of, EMPTY } from 'rxjs';\nimport { tap, catchError, map } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { withXMaPerm } from './x-ma-perm.pipe';\n\nexport interface MesAuthConfig {\n apiBaseUrl: string;\n withCredentials?: boolean;\n userBaseUrl?: string;\n /**\n * Base URL for hosted UI assets (CSS themes, icons, manifest).\n * Defaults to `{apiBaseUrl}/mesauth-angular/v1` when omitted.\n * Allows updating themes, icons, and labels without republishing the npm package.\n */\n uiAssetsUrl?: string;\n /**\n * Hostnames of backend services that run MesAuth.Authorizer middleware.\n * The interceptor will attach Bearer + X-Refresh-Token headers to requests\n * going to any of these hosts so the authorizer can silently refresh tokens.\n * Example: [\"mes.kefico.vn\", \"api.kefico.vn\"]\n */\n trustedHosts?: string[];\n /**\n * Called after a successful sign-in (login, externalLogin, or notifySignedIn).\n * Use this to persist tokens to localStorage or sessionStorage for cross-origin requests.\n */\n onSignedIn?: (accessToken: string, refreshToken?: string) => void;\n /**\n * Called during sign-out (before the logout HTTP request completes).\n * Use this to clear any persisted tokens from localStorage or sessionStorage.\n */\n onSigningOut?: () => void;\n}\n\n/** Injection token for MesAuth configuration */\nexport const MES_AUTH_CONFIG = new InjectionToken<MesAuthConfig>('MES_AUTH_CONFIG');\n\n/**\n * Provides MesAuth with configuration.\n * This is the recommended way to set up mesauth-angular in standalone apps.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([mesAuthInterceptor])),\n * provideMesAuth({\n * apiBaseUrl: 'https://auth.example.com',\n * userBaseUrl: 'https://app.example.com'\n * })\n * ]\n * };\n * ```\n */\nexport function provideMesAuth(config: MesAuthConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MES_AUTH_CONFIG, useValue: config },\n MesAuthService,\n provideAppInitializer(() => {\n const mesAuthService = inject(MesAuthService);\n const httpClient = inject(HttpClient);\n const router = inject(Router);\n mesAuthService.init(config, httpClient, router);\n })\n ]);\n}\n\nexport interface IUser {\n id?: string;\n userId?: string;\n userName?: string;\n fullName?: string;\n gender?: string;\n email?: string;\n phoneNumber?: string;\n department?: string;\n position?: string;\n givenTitle?: string | null;\n givenColor?: string | null;\n tokenVersion?: string;\n permEndpoint?: string;\n perms?: Set<string>;\n employeeCode?: string;\n avatarPath?: string;\n avatarShape?: 'circle' | 'rounded' | 'rectangle' | 'portrait';\n avatarFrame?: string | null;\n avatarSize?: 'sm' | 'md' | 'lg';\n avatarRatio?: 'ar-11' | 'ar-43' | 'ar-169';\n avatarStyleAllowed?: boolean;\n loginMethod?: number;\n hrFullNameVn?: string;\n hrFullNameEn?: string;\n hrPosition?: string;\n hrJobTitle?: string;\n hrGender?: string;\n hrMobile?: string;\n hrEmail?: string;\n hrJoinDate?: string;\n hrBirthDate?: string;\n hrWorkStatus?: string;\n hrDoiTuong?: string;\n hrTeamCode?: string;\n hrLineCode?: string;\n}\n\nexport enum NotificationType {\n Info = 'Info',\n Warning = 'Warning',\n Error = 'Error',\n Success = 'Success'\n}\n\nexport interface NotificationDto {\n id: string;\n title: string;\n message: string;\n messageHtml?: string;\n url?: string;\n type: NotificationType;\n isRead: boolean;\n createdAt: string;\n sourceAppName: string;\n sourceAppIconUrl?: string;\n}\n\nexport interface FrontEndRoute {\n id: number;\n roleId: string;\n roleName: string;\n routePath: string;\n routeName: string;\n description?: string;\n icon?: string;\n cssClass?: string;\n parentId?: number | null;\n sortOrder: number;\n isLabel: boolean;\n isActive: boolean;\n createdAt: string;\n updatedAt?: string;\n children: FrontEndRoute[];\n}\n\nexport interface UserFrontEndRoutesGrouped {\n appId: string;\n appName: string;\n feUrl?: string;\n routes: FrontEndRoute[];\n}\n\nexport interface PagedList<T> {\n items: T[];\n totalCount: number;\n page: number;\n pageSize: number;\n totalPages: number;\n hasNext: boolean;\n hasPrevious: boolean;\n}\n\nexport interface RealTimeNotificationDto {\n id: string;\n title: string;\n message: string;\n messageHtml?: string;\n url?: string;\n type: NotificationType;\n createdAt: string;\n sourceAppName: string;\n sourceAppIconUrl?: string;\n}\n\n@Injectable()\nexport class MesAuthService {\n private hubConnection: HubConnection | null = null;\n private readonly _currentUser = signal<IUser | null>(null);\n /** Observable for components that prefer RxJS - backed by the signal. */\n public readonly currentUser$: Observable<IUser | null> = toObservable(this._currentUser);\n private readonly _notifications = new Subject<any>();\n public readonly notifications$: Observable<any> = this._notifications.asObservable();\n private readonly _approvalEvents = new Subject<any>();\n public readonly approvalEvents$: Observable<any> = this._approvalEvents.asObservable(); \n\n private apiBase = '';\n private config: MesAuthConfig | null = null;\n private http!: HttpClient;\n private router?: Router; \n\n constructor() {\n // Empty constructor - all dependencies passed to init()\n }\n\n /** _ngZone accepted but ignored - not needed in zoneless apps. */\n init(config: MesAuthConfig, httpClient: HttpClient, router?: Router, _ngZone?: unknown) {\n this.config = config;\n this.http = httpClient;\n this.router = router;\n this.apiBase = config.apiBaseUrl.replace(/\\/$/, '');\n\n // Server-hosted theme CSS and manifest are best-effort: if the MesAuth API is\n // unreachable the consumer app must keep working (unstyled library components\n // are acceptable). Any failure here is logged and swallowed so bootstrap\n // never fails because of a missing stylesheet or manifest.\n const assetsUrl = config.uiAssetsUrl || `${this.apiBase}/mesauth-angular/v1`;\n try {\n const uiConfig = inject(MaUiConfigService);\n this.injectThemeStylesheet(assetsUrl);\n uiConfig.loadManifest(assetsUrl, httpClient);\n // After manifest loads, refresh CSS URL if server version differs from package version.\n // This forces a re-fetch when default.css is updated on the server independently of the npm package.\n const manifestSub = toObservable(uiConfig.manifestVersion).subscribe({\n next: ver => {\n if (ver && ver !== PACKAGE_VERSION) {\n this.updateThemeStylesheetVersion(assetsUrl, ver);\n manifestSub.unsubscribe();\n }\n },\n error: err => console.warn('[mesauth-angular] manifest version stream failed:', err)\n });\n } catch (err) {\n console.warn('[mesauth-angular] hot UI asset loading skipped:', err);\n }\n\n // Fetch user once on init. Route changes do NOT re-fetch the user.\n // Auth state is maintained via cookies; 401 errors are handled by HTTP interceptors.\n // SignalR handles real-time notification delivery without polling.\n this.fetchCurrentUser().subscribe();\n }\n\n private injectThemeStylesheet(assetsUrl: string) {\n const id = 'ma-theme-css';\n if (typeof document === 'undefined' || document.getElementById(id)) return;\n try {\n const link = document.createElement('link');\n link.id = id;\n link.rel = 'stylesheet';\n link.href = `${assetsUrl}/themes/default.css?v=${PACKAGE_VERSION}`;\n // If the CSS cannot be fetched (server down, 404, CORS) detach the link so\n // the browser stops reporting it and the consumer app renders unstyled\n // library components instead of a broken one.\n link.onerror = () => {\n console.warn(`[mesauth-angular] theme stylesheet failed to load from ${link.href} — continuing without hosted theme`);\n link.remove();\n };\n document.head.appendChild(link);\n } catch (err) {\n console.warn('[mesauth-angular] could not inject theme stylesheet:', err);\n }\n }\n\n private updateThemeStylesheetVersion(assetsUrl: string, manifestVersion: string) {\n if (typeof document === 'undefined') return;\n try {\n const existing = document.getElementById('ma-theme-css') as HTMLLinkElement | null;\n if (existing) {\n existing.href = `${assetsUrl}/themes/default.css?v=${manifestVersion}`;\n return;\n }\n // Original link was removed by an earlier load failure — retry with the\n // server-reported version; it may now be reachable.\n this.injectThemeStylesheet(`${assetsUrl}`);\n const retry = document.getElementById('ma-theme-css') as HTMLLinkElement | null;\n if (retry) retry.href = `${assetsUrl}/themes/default.css?v=${manifestVersion}`;\n } catch (err) {\n console.warn('[mesauth-angular] could not update theme stylesheet version:', err);\n }\n }\n\n getConfig(): MesAuthConfig | null {\n return this.config;\n }\n\n private fetchCurrentUser(): Observable<any> {\n if (!this.apiBase) return EMPTY;\n const url = `${this.apiBase}/auth/me`;\n return this.http.get(url, { withCredentials: this.config?.withCredentials ?? true }).pipe(\n tap((u) => {\n this._currentUser.set(u as IUser);\n if (u && this.config) {\n this.startConnection(this.config);\n }\n }),\n catchError((err) => {\n // Silently handle auth errors (401/403) - user is not logged in\n if (err.status === 401 || err.status === 403) {\n this._currentUser.set(null);\n }\n return of(null);\n })\n );\n }\n\n public getUnreadCount(): Observable<any> {\n return this.http.get(`${this.apiBase}/notif/me/unread-count`, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public getNotifications(page: number = 1, pageSize: number = 20, includeRead: boolean = false, type?: string): Observable<any> {\n let url = `${this.apiBase}/notif/me?page=${page}&pageSize=${pageSize}&includeRead=${includeRead}`;\n if (type) {\n url += `&type=${type}`;\n }\n return this.http.get(url, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public markAsRead(notificationId: string): Observable<any> {\n return this.http.patch(`${this.apiBase}/notif/${notificationId}/read`, {}, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public markAllAsRead(): Observable<any> {\n return this.http.patch(`${this.apiBase}/notif/me/read-all`, {}, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public deleteNotification(notificationId: string): Observable<any> {\n return this.http.delete(`${this.apiBase}/notif/${notificationId}`, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n /**\n * Get frontend routes assigned to the current user\n * Returns routes grouped by application\n */\n public getFrontEndRoutes(): Observable<UserFrontEndRoutesGrouped[]> {\n if (!this.apiBase) throw new Error('MesAuth not initialized');\n return this.http.get<UserFrontEndRoutesGrouped[]>(`${this.apiBase}/fe-routes/me`, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n private startConnection(config: MesAuthConfig) {\n if (this.hubConnection) return;\n const signalrUrl = config.apiBaseUrl.replace(/\\/$/, '') + '/hub/notification';\n const builder = new HubConnectionBuilder()\n .withUrl(signalrUrl, { withCredentials: config.withCredentials ?? true })\n .withAutomaticReconnect()\n .configureLogging(LogLevel.Warning);\n\n this.hubConnection = builder.build();\n\n // No NgZone.run() needed - signal mutations and toSignal() in consumers\n // schedule Angular change detection correctly in zoneless apps.\n this.hubConnection.on('ReceiveNotification', (n: any) => {\n this._notifications.next(n);\n });\n\n this.hubConnection.on('ApprovalCompleted', (e: any) => {\n this._approvalEvents.next({ type: 'ApprovalCompleted', ...e });\n });\n\n this.hubConnection.on('ApprovalStepChanged', (e: any) => {\n this._approvalEvents.next({ type: 'ApprovalStepChanged', ...e });\n });\n\n this.hubConnection.start().then(() => {}).catch((err) => {});\n\n this.hubConnection.onclose(() => {});\n this.hubConnection.onreconnecting(() => {});\n this.hubConnection.onreconnected(() => {});\n }\n\n public stop() {\n if (!this.hubConnection) return;\n this.hubConnection.stop().catch(() => {});\n this.hubConnection = null;\n }\n\n public logout(): Observable<any> {\n const url = `${this.apiBase}/auth/logout`;\n this.config?.onSigningOut?.();\n return this.http.post(url, {}, { withCredentials: this.config?.withCredentials ?? true }).pipe(\n tap(() => {\n this._currentUser.set(null);\n this.stop();\n })\n );\n }\n\n /**\n * Call this after a successful local login to trigger the `onSignedIn` lifecycle hook.\n * This allows the config's `onSignedIn` callback (e.g. localStorage persistence) to\n * run consistently for both normal login and external/SSO login flows.\n */\n public notifySignedIn(accessToken: string, refreshToken?: string): void {\n this.config?.onSignedIn?.(accessToken, refreshToken);\n }\n\n public get currentUser(): IUser | null {\n return this._currentUser();\n }\n\n public get isAuthenticated(): boolean {\n return this._currentUser() !== null;\n }\n\n /**\n * Refreshes the current user from the server.\n * Returns an Observable that completes when the user data is loaded.\n * Callers can subscribe to wait for completion before proceeding (e.g., navigating after login).\n */\n public refreshUser(): Observable<any> {\n return this.fetchCurrentUser();\n }\n\n public getAvatarStyle(): Observable<{data: string; allowedActions: string[]}> {\n const userId = this._currentUser()?.userId;\n if (!userId) throw new Error('Not authenticated');\n const url = `${this.apiBase}/auth/${userId}/avatar-style`;\n return this.http.get(\n url,\n { withCredentials: this.config?.withCredentials ?? true, observe: 'response' }\n ).pipe(\n withXMaPerm(), \n map((res) => ({ \n data: (res.data as string) ?? '', \n allowedActions: res.allowedActions \n }))\n );\n }\n\n\n public updateAvatarStyle(\n avatarShape: string | null,\n avatarFrame: string | null,\n avatarSize: string | null,\n avatarRatio: string | null\n ): Observable<{avatarShape: string | null; avatarFrame: string | null; avatarSize: string | null; avatarRatio: string | null }> {\n const userId = this._currentUser()?.userId;\n if (!userId) throw new Error('Not authenticated');\n const url = `${this.apiBase}/auth/${userId}/avatar-style`;\n return this.http.put<{ avatarShape: string | null; avatarFrame: string | null; avatarSize: string | null; avatarRatio: string | null }>(\n url,\n { avatarShape, avatarFrame, avatarSize, avatarRatio },\n { withCredentials: this.config?.withCredentials ?? true }\n ).pipe(\n tap((result) => {\n const cur = this._currentUser();\n if (cur) {\n this._currentUser.set({ ...cur, avatarShape: (result.avatarShape ?? undefined) as IUser['avatarShape'], avatarFrame: result.avatarFrame, avatarSize: (result.avatarSize ?? undefined) as IUser['avatarSize'], avatarRatio: (result.avatarRatio ?? undefined) as IUser['avatarRatio'] }); \n }\n })\n );\n }\n\n public getUserX(userId: string): Observable<IUser | null> {\n const url = `${this.apiBase}/urs/users/${userId}`;\n return this.http.get<IUser | null>(url, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n // ── Federation / SSO ──────────────────────────────────────────────────\n\n /** POST a peer-issued JWT to the local /auth/external-login, returning local tokens. */\n public externalLogin(peerToken: string): Observable<{ accessToken: string; refreshToken: string }> {\n return this.http.post<{ accessToken: string; refreshToken: string }>(\n `${this.apiBase}/auth/external-login`,\n { token: peerToken },\n { withCredentials: this.config?.withCredentials ?? true }\n ).pipe(\n tap(res => this.config?.onSignedIn?.(res.accessToken, res.refreshToken))\n );\n }\n\n /** List active trusted issuers (public, no auth required). */\n public getTrustedIssuers(): Observable<{ issuer: string; origin: string; displayName: string; priority: number }[]> {\n return this.http.get<any[]>(`${this.apiBase}/external-issuers/public`);\n }\n\n /** List origins that are allowed to silent-SSO from this host (public, no auth required). */\n public getSsoAllowedPeers(): Observable<{ peerOrigin: string }[]> {\n return this.http.get<any[]>(`${this.apiBase}/sso/allowed-peers`);\n }\n\n /**\n * Get a short-lived SSO exchange token from this host (requires active session cookie).\n * Used by the /sso/check page before postMessaging the token to a peer's iframe.\n */\n public getSsoToken(): Observable<{ token: string }> {\n return this.http.get<{ token: string }>(\n `${this.apiBase}/auth/sso-token`,\n { withCredentials: this.config?.withCredentials ?? true }\n );\n }\n\n /**\n * Open a hidden iframe to `${issuerOrigin}/sso/check` and wait for a postMessage reply.\n * Returns the peer's short-lived SSO token, or null if the peer has no active session\n * or does not respond within `timeoutMs` milliseconds.\n */\n public trySilentSsoFromPeer(issuerOrigin: string, timeoutMs = 4000): Promise<string | null> {\n return new Promise(resolve => {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n resolve(null);\n return;\n }\n\n const iframe = document.createElement('iframe');\n iframe.src = `${issuerOrigin}/sso/check`;\n iframe.style.cssText = 'display:none;width:0;height:0;border:0;position:absolute;';\n document.body.appendChild(iframe);\n\n let settled = false;\n const cleanup = (token: string | null) => {\n if (settled) return;\n settled = true;\n window.removeEventListener('message', handler);\n clearTimeout(timer);\n try { document.body.removeChild(iframe); } catch { /* already removed */ }\n resolve(token);\n };\n\n const handler = (event: MessageEvent) => {\n // Pin origin to prevent cross-origin spoofing\n if (event.origin !== issuerOrigin) return;\n const data = event.data as { type?: string; ok?: boolean; token?: string };\n if (data?.type !== 'sso-check-result') return;\n cleanup(data.ok && data.token ? data.token : null);\n };\n\n window.addEventListener('message', handler);\n const timer = setTimeout(() => cleanup(null), timeoutMs);\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { throwError, timer } from 'rxjs';\nimport { catchError, switchMap, tap } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { MesAuthService } from './mes-auth.service';\n\n// Track if we're currently redirecting to prevent loopback\nlet isRedirecting = false;\n\ninterface PermissionHeader {\n resource: string;\n allowedActions: string[];\n}\n/**\n * Functional HTTP interceptor for handling 401/403 auth errors.\n * Redirects to login page on 401, and to 403 page on 403.\n * Includes loopback prevention to avoid infinite redirects.\n */\nexport const mesAuthInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(MesAuthService);\n const router = inject(Router);\n\n // Attach access + refresh tokens from localStorage to requests going to the auth server\n // or any backend host running MesAuth.Authorizer (trustedHosts). This lets the authorizer\n // middleware silently refresh tokens and emit X-Refreshed-Token response headers.\n // Relative URLs are always considered trusted (same origin).\n const config = authService.getConfig();\n const apiBase = config?.apiBaseUrl ?? '';\n const trustedHosts = config?.trustedHosts ?? [];\n\n function isTrusted(url: string): boolean {\n if (apiBase && url.startsWith(apiBase)) return true;\n try {\n return trustedHosts.includes(new URL(url).hostname);\n } catch {\n return true; // relative URL — same origin\n }\n }\n\n let authReq = req;\n if (typeof localStorage !== 'undefined' && isTrusted(req.url)) {\n let headers = req.headers;\n if (!headers.has('Authorization')) {\n const accessToken = localStorage.getItem('mes_auth_token');\n if (accessToken) headers = headers.set('Authorization', `Bearer ${accessToken}`);\n }\n if (!headers.has('X-Refresh-Token')) {\n const refreshToken = localStorage.getItem('mes_refresh_token');\n if (refreshToken) headers = headers.set('X-Refresh-Token', refreshToken);\n }\n if (headers !== req.headers) authReq = req.clone({ headers });\n }\n\n return next(authReq).pipe(\n tap(event => {\n if (event instanceof HttpResponse) {\n const newAccessToken = event.headers.get('X-Refreshed-Token');\n if (newAccessToken) {\n const newRefreshToken = event.headers.get('X-Refreshed-Refresh-Token') ?? undefined;\n authService.notifySignedIn(newAccessToken, newRefreshToken);\n }\n }\n }),\n catchError((error: HttpErrorResponse) => {\n const status = error.status;\n\n // Check if we should handle this error and prevent loopback\n if ((status === 401 || status === 403) && !isRedirecting) {\n const config = authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n\n const currentUrl = router.url + (window.location.hash || '');\n const returnUrl = encodeURIComponent(currentUrl);\n\n // Avoid loops if already on auth/unauth pages\n const isLoginPage = currentUrl.includes('/login');\n const is403Page = currentUrl.includes('/403');\n const isAuthPage = currentUrl.includes('/auth');\n // Public pages that should never trigger a 401 redirect (e.g., register, password reset)\n const isPublicPage = currentUrl.includes('/register')\n || currentUrl.includes('/forgot-password')\n || currentUrl.includes('/reset-password');\n // Skip redirect for the initial /auth/me check (app startup when not logged in)\n const isMeAuthPage = req.url.includes('/auth/me');\n\n if (status === 401 && !isLoginPage && !isAuthPage && !isMeAuthPage && !isPublicPage) {\n // Wait 1.5s for the concurrent refresh's Set-Cookie to be processed, then retry once.\n // If retry also gets 401, redirect to login.\n return timer(1500).pipe(\n switchMap(() => next(req)),\n catchError((retryError: HttpErrorResponse) => {\n if (retryError.status === 401) {\n isRedirecting = true;\n setTimeout(() => { isRedirecting = false; }, 5000);\n window.location.href = `${baseUrl}/login?returnUrl=${returnUrl}`;\n }\n return throwError(() => retryError);\n })\n );\n } else if (status === 403 && !is403Page) {\n isRedirecting = true;\n setTimeout(() => { isRedirecting = false; }, 5000);\n let redirectUrl = `${baseUrl}/403?returnUrl=${returnUrl}`;\n if (error.error && error.error.required) {\n redirectUrl += `&required=${encodeURIComponent(error.error.required)}`;\n }\n window.location.href = redirectUrl;\n }\n }\n return throwError(() => error);\n })\n );\n};\n\n\nfunction appendPermissions(body: unknown, allowedActions: string[]): unknown {\n if (body === null || body === undefined) {\n return { 'x-ma-perms': allowedActions };\n }\n\n if (Array.isArray(body)) {\n return { data: body, 'x-ma-perms': allowedActions };\n }\n\n if (typeof body === 'object') {\n return { ...(body as object), 'x-ma-perms': allowedActions };\n }\n\n // Primitive (string, number, boolean)\n return { data: body, 'x-ma-perms': allowedActions };\n}","import { NgModule } from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\n\n@NgModule({\n providers: [\n MesAuthService\n ]\n})\nexport class MesAuthModule {}\n","import { afterNextRender, Injectable, OnDestroy, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\nexport type Theme = 'light' | 'dark';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService implements OnDestroy {\n private readonly _currentTheme = signal<Theme>('light');\n readonly currentTheme = this._currentTheme.asReadonly();\n /** Observable kept for backward compatibility */\n readonly currentTheme$: Observable<Theme> = toObservable(this._currentTheme);\n\n private observer: MutationObserver | null = null;\n private _settedTheme = signal<Theme | null>(null); \n\n constructor() {\n afterNextRender(() => { // ✅ guarantees DOM is ready\n this.detectTheme();\n this.startWatching();\n });\n // this.detectTheme();\n // this.startWatching();\n }\n\n ngOnDestroy(): void {\n this.stopWatching();\n }\n\n private detectTheme(): void {\n const fixed = this._settedTheme();\n if (fixed !== null) {\n this._currentTheme.set(fixed);\n return;\n }\n const html = document.documentElement;\n const body = document.body;\n const isDark = html.classList.contains('dark') ||\n html.getAttribute('data-theme') === 'dark' ||\n html.getAttribute('theme') === 'dark' ||\n html.getAttribute('data-coreui-theme') === 'dark' ||\n body.classList.contains('dark') ||\n body.getAttribute('data-theme') === 'dark' ||\n body.getAttribute('theme') === 'dark' ||\n body.getAttribute('data-coreui-theme') === 'dark';\n this._currentTheme.set(isDark ? 'dark' : 'light');\n }\n\n private startWatching(): void {\n if (typeof MutationObserver === 'undefined') {\n setInterval(() => this.detectTheme(), 1000);\n return;\n }\n const config = {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'theme', 'data-coreui-theme']\n };\n\n this.observer = new MutationObserver(() => this.detectTheme());\n this.observer.observe(document.documentElement, config);\n this.observer.observe(document.body, config); \n }\n\n private stopWatching(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n\n get currentThemeValue(): Theme {\n return this._currentTheme();\n }\n\n setTheme(theme: Theme): void {\n this._currentTheme.set(theme);\n }\n\n setFixTheme(theme: Theme): void { \n this._settedTheme.set(theme);\n this._currentTheme.set(theme);\n }\n\n refreshTheme(): void {\n this.detectTheme();\n }\n}\n","import { Component, booleanAttribute, computed, HostBinding, inject, input } from '@angular/core';\nimport { ThemeService } from './theme.service';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\nexport type AvatarShape = 'circle' | 'rounded' | 'rectangle' | 'portrait';\n\nexport interface AvatarFrameDef {\n id: string;\n label: string;\n}\n\nexport const AVATAR_FRAMES: ReadonlyArray<AvatarFrameDef> = [\n { id: 'none', label: 'None' },\n { id: 'gold-ring', label: 'Gold Ring' },\n { id: 'neon-glow', label: 'Neon Glow' },\n { id: 'dashed', label: 'Dashed' },\n { id: 'double-border', label: 'Double Border' },\n { id: 'gradient-ring', label: 'Gradient Ring' },\n { id: 'notched', label: 'Notched' },\n];\n\n@Component({\n selector: 'ma-avatar',\n imports: [],\n templateUrl: './ma-avatar.component.html',\n styleUrl: './ma-avatar.component.css'\n})\nexport class MaAvatarComponent {\n src = input<string>('');\n alt = input<string>('');\n initials = input<string>('');\n size = input<AvatarSize>('md');\n shape = input<AvatarShape>('circle');\n frame = input<string | null>(null);\n ratio = input<string | null>(null);\n scale = input<number>(1);\n ring = input(false, { transform: booleanAttribute });\n ringActive = input(false, { transform: booleanAttribute });\n\n private themeService = inject(ThemeService);\n @HostBinding('class') get themeClass(): string { return `theme-${this.themeService.currentTheme()}`; }\n\n readonly wrapperClass = computed(() => {\n const f = this.frame() && this.frame() !== 'none' ? `ma-avatar--frame-${this.frame()}` : '';\n const r = this.ratio() ? `ma-avatar--ratio-${this.ratio()}` : '';\n return [\n 'ma-avatar',\n `ma-avatar--${this.shape()}`,\n `ma-avatar--${this.size()}`,\n f,\n r,\n this.ring() ? 'ma-avatar--ring' : '',\n this.ringActive() ? 'ma-avatar--ring-active' : '',\n ].filter(Boolean).join(' ');\n });\n\n readonly wrapperStyle = computed(() => ({\n '--avatar-scale': this.scale()\n }));\n\n readonly showImage = computed(() => !!this.src());\n}\n","<div [class]=\"wrapperClass()\" [style]=\"wrapperStyle()\">\n @if (showImage()) {\n <img [src]=\"src()\" [alt]=\"alt()\" class=\"ma-avatar__img\" />\n } @else {\n <span class=\"ma-avatar__initial\">{{ initials() }}</span>\n }\n</div>\n","import { Component, HostBinding, HostListener, inject, output, signal, effect, computed, input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport { MesAuthService, IUser } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { MaAvatarComponent, AvatarSize } from './ma-avatar.component';\n\n@Component({\n selector: 'ma-user-profile',\n imports: [MaAvatarComponent],\n templateUrl: './user-profile.component.html',\n styleUrl: './user-profile.component.css'\n})\nexport class UserProfileComponent { \n inputAvatarShape = input<'rectangle' | 'circle' | 'rounded'>('circle'); \n showBell = input(true);\n showApproval = input(true); \n showName = input(false);\n showSignature = input<boolean[]>([false, false]);\n signatureHeight = input<number>(40);\n notificationClick = output<void>();\n approvalClick = output<void>(); \n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly currentUser = signal<IUser | null>(null);\n readonly unreadCount = signal(0);\n readonly pendingApprovalCount = signal(0);\n readonly dropdownOpen = signal(false);\n readonly avatarRefresh = signal<number>(Date.now());\n \n\n // Avatar style derived from per-user preferences\n readonly navAvatarSize = computed<AvatarSize>(() => (this.currentUser()?.avatarSize as AvatarSize) ?? 'md');\n // Dropdown is always one step larger than the nav avatar\n readonly dropAvatarSize = computed<AvatarSize>(() => {\n const s = this.navAvatarSize();\n return s === 'sm' ? 'md' : s === 'md' ? 'lg' : 'xl';\n });\n readonly avatarShape = computed(() => this.currentUser()?.avatarShape ?? this.inputAvatarShape());\n readonly avatarFrame = computed(() => this.currentUser()?.avatarFrame ?? null);\n readonly avatarRatio = computed(() => this.currentUser()?.avatarRatio ?? 'ar-11');\n\n readonly givenStyle = computed(() => this.currentUser()?.givenColor || 'indigo'); \n\n readonly signatureBroken = signal<boolean>(false);\n readonly signatureUrl = computed(() => {\n if (!this.showSignature().some(s => s) || this.signatureBroken()) return null;\n const baseRaw = this.authService.getConfig()?.apiBaseUrl ?? '';\n const base = baseRaw.replace(/\\/$/, '');\n \n const u = this.currentUser();\n const id = u?.userId ?? u?.id;\n if (!id || !base) return null;\n return `${base}/auth/${id}/signature`; \n })\n\n private readonly authService = inject(MesAuthService);\n private readonly router = inject(Router);\n private readonly themeService = inject(ThemeService);\n private readonly http = inject(HttpClient);\n\n constructor() {\n const currentUserSig = toSignal(this.authService.currentUser$, { initialValue: null });\n const approvalEvent = toSignal(this.authService.approvalEvents$);\n const notification = toSignal(this.authService.notifications$);\n\n effect(() => {\n const user = currentUserSig();\n this.currentUser.set(user);\n this.avatarRefresh.set(Date.now());\n if (!user) {\n this.unreadCount.set(0);\n this.pendingApprovalCount.set(0);\n return;\n }\n this.loadUnreadCount();\n this.loadPendingApprovalCount();\n });\n\n effect(() => {\n approvalEvent(); // track SignalR approval events\n if (currentUserSig()) this.loadPendingApprovalCount();\n });\n\n effect(() => {\n notification(); // track SignalR notification events\n if (currentUserSig()) this.loadUnreadCount();\n });\n }\n\n loadUnreadCount() {\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => this.unreadCount.set(response.unreadCount || 0),\n error: () => {}\n });\n }\n\n loadPendingApprovalCount() {\n const config = this.authService.getConfig();\n if (!config) return;\n const url = `${config.apiBaseUrl.replace(/\\/$/, '')}/approval/dashboard`;\n this.http.get(url, { withCredentials: config.withCredentials ?? true }).subscribe({\n next: (r: any) => this.pendingApprovalCount.set(r?.pendingCount ?? 0),\n error: () => {}\n });\n }\n\n onApprovalClick() {\n this.approvalClick.emit();\n }\n\n getAvatarUrl(user: IUser): string {\n // Use the refresh signal to force update\n const refresh = this.avatarRefresh();\n const config = this.authService.getConfig();\n const baseUrl = config?.apiBaseUrl || '';\n\n if (user.avatarPath) {\n if (user.avatarPath.startsWith('http://') || user.avatarPath.startsWith('https://')) {\n return user.avatarPath;\n }\n return `${baseUrl.replace(/\\/$/, '')}${user.avatarPath}?t=${refresh}`;\n }\n\n const userId = user.userId;\n if (userId && baseUrl) {\n return `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatar?t=${refresh}`;\n }\n\n const displayName = user.userName || user.userId || 'User';\n return `https://ui-avatars.com/api/?name=${encodeURIComponent(displayName)}&background=1976d2&color=fff`;\n }\n\n getLastNameInitial(user: IUser): string {\n const fullName = user.fullName || user.userName || 'U';\n const parts = fullName.split(' ');\n const lastPart = parts[parts.length - 1];\n return lastPart.charAt(0).toUpperCase();\n }\n\n toggleDropdown() {\n this.dropdownOpen.set(!this.dropdownOpen());\n }\n\n closeDropdown() {\n this.dropdownOpen.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event) {\n const target = event.target as HTMLElement;\n const clickedInside = target.closest('.user-menu-wrapper');\n if (!clickedInside) {\n this.dropdownOpen.set(false);\n return;\n }\n if (target.closest('.ma-user-menu-btn')) {\n this.dropdownOpen.set(false);\n }\n }\n\n onLogin() {\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n const returnUrl = encodeURIComponent(this.router.url);\n window.location.href = `${baseUrl}/login?returnUrl=${returnUrl}`;\n }\n\n onViewProfile() {\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n const currentUrl = window.location.href;\n \n this.openInNewTabIfSameOrigin(currentUrl, `${baseUrl}/profile`);\n this.dropdownOpen.set(false);\n }\n\n private openInNewTabIfSameOrigin(currentUrl: string, destinationUrl: string) {\n // Check if current page URL starts with the destination URL\n if (!destinationUrl.startsWith(currentUrl)) {\n window.open(destinationUrl, \"_blank\", \"noopener,noreferrer\");\n \n } else { \n // Optional: redirect in same tab\n window.location.href = destinationUrl;\n }\n}\n\n onLogout() {\n this.authService.logout().subscribe({\n next: () => {\n this.dropdownOpen.set(false);\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n const returnUrl = encodeURIComponent(window.location.href);\n window.location.href = `${baseUrl}/login?returnUrl=${returnUrl}`;\n },\n error: () => {\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n window.location.href = `${baseUrl}/login`;\n }\n });\n }\n\n onNotificationClick() {\n this.notificationClick.emit();\n }\n\n onSigErr(_ev: Event): void {\n this.signatureBroken.set(true);\n }\n}\n","<div class=\"user-profile-container\">\n @if (!currentUser()) {\n <!-- Not logged in -->\n <button class=\"login-btn\" (click)=\"onLogin()\">Login</button>\n } @else {\n <!-- Logged in -->\n <div class=\"user-header\">\n <!-- Notification Bell -->\n @if (showBell()) {\n <button class=\"notification-btn\" [class.has-unread]=\"unreadCount() > 0\" (click)=\"onNotificationClick()\" title=\"Notifications\" aria-label=\"Notifications\">\n <svg class=\"bell-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n @if (unreadCount() > 0) {\n <span class=\"badge\">{{ unreadCount() > 99 ? '99+' : unreadCount() }}</span>\n }\n </button>\n }\n \n\n <!-- Approval Button -->\n @if (showApproval()) {\n <button class=\"notification-btn\" [class.has-unread]=\"pendingApprovalCount() > 0\" (click)=\"onApprovalClick()\" title=\"Approvals\" aria-label=\"Approvals\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 11l3 3L22 4\"/>\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/>\n </svg>\n @if (pendingApprovalCount() > 0) {\n <span class=\"badge\">{{ pendingApprovalCount() > 99 ? '99+' : pendingApprovalCount() }}</span>\n }\n </button>\n } \n\n <!-- User Avatar + Dropdown -->\n <div class=\"user-menu-wrapper\">\n <button class=\"user-menu-btn\" (click)=\"toggleDropdown()\" [attr.aria-label]=\"'User menu for ' + (currentUser().fullName || currentUser().userName)\" aria-haspopup=\"true\" [attr.aria-expanded]=\"dropdownOpen()\">\n <ma-avatar\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName || ''\"\n [initials]=\"getLastNameInitial(currentUser())\"\n [size]=\"navAvatarSize()\"\n [shape]=\"avatarShape()\"\n [ratio]=\"avatarRatio()\"\n [frame]=\"avatarFrame()\" \n [ring]=\"true\"\n [ringActive]=\"dropdownOpen()\" /> \n </button>\n\n @if (dropdownOpen()) {\n <div class=\"mes-dropdown-menu\">\n <!-- User info header -->\n <div class=\"mes-dropdown-header\">\n <div class=\"dropdown-avatar-wrap\">\n <ma-avatar\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName || ''\"\n [initials]=\"getLastNameInitial(currentUser())\"\n [size]=\"dropAvatarSize()\"\n [shape]=\"avatarShape()\"\n [ratio]=\"avatarRatio()\"\n [frame]=\"avatarFrame()\"\n [scale]=\"1.5\" /> \n </div> \n <div class=\"dropdown-info-col\">\n <div class=\"dropdown-user-info\">\n <span class=\"dropdown-user-name\">{{ currentUser().fullName || currentUser().userName }}</span> \n <span class=\"dropdown-user-sub\">\n @if (currentUser().position || currentUser().department) {\n {{ currentUser().position || currentUser().department }} \n }\n @if (currentUser().givenTitle) {\n <span class=\"given-title-badge given-title\"\n [class]=\"'given-color-' + givenStyle()\">{{ currentUser().givenTitle }}</span>\n }\n </span>\n </div>\n <div class=\"dropdown-user-actions\">\n @if (showSignature()[1] && signatureUrl(); as sigUrl) {\n <img class=\"ma-ux-signature\"\n [src]=\"sigUrl\"\n [style.height.px]=\"signatureHeight()\"\n (error)=\"onSigErr($event)\"\n alt=\"signature\" />\n }\n <button class=\"icon-action profile-link\" (click)=\"onViewProfile()\" title=\"View Profile\" aria-label=\"View Profile\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </button>\n <button class=\"icon-action logout-item\" (click)=\"onLogout()\" title=\"Logout\" aria-label=\"Logout\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mes-dropdown-items\">\n <ng-content></ng-content>\n </div>\n </div>\n }\n </div>\n\n @if (showName()){\n <div class=\"mes-user-header\">\n {{currentUser().fullName || currentUser().userName}}\n </div>\n }\n @if (showSignature()[0] && signatureUrl(); as sigUrl) {\n <img class=\"ma-ux-signature\"\n [src]=\"sigUrl\"\n [style.height.px]=\"signatureHeight()\"\n (error)=\"onSigErr($event)\"\n alt=\"signature\" />\n }\n </div>\n }\n</div>\n","import { Injectable, signal } from '@angular/core';\n\nexport interface Toast {\n id: string;\n message: string;\n title?: string;\n type: 'info' | 'success' | 'warning' | 'error';\n duration?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private readonly _toasts = signal<Toast[]>([]);\n readonly toasts = this._toasts.asReadonly();\n\n show(message: string, title?: string, type: 'info' | 'success' | 'warning' | 'error' = 'info', duration: number = 5000) {\n const id = Math.random().toString(36).substr(2, 9);\n const toast: Toast = { id, message, title, type, duration };\n this._toasts.update(t => [...t, toast]);\n\n if (duration > 0) {\n setTimeout(() => this.remove(id), duration);\n }\n\n return id;\n }\n\n remove(id: string) {\n this._toasts.update(t => t.filter(toast => toast.id !== id));\n }\n\n clear() {\n this._toasts.set([]);\n }\n}\n","import { Component, HostBinding, inject } from '@angular/core';\nimport { ToastService } from './toast.service';\nimport { ThemeService } from './theme.service';\n\n@Component({\n selector: 'ma-toast-container',\n imports: [],\n templateUrl: './toast-container.component.html',\n styleUrl: './toast-container.component.css'\n})\nexport class ToastContainerComponent {\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n private readonly toastService = inject(ToastService);\n private readonly themeService = inject(ThemeService);\n\n protected readonly toasts = this.toastService.toasts;\n\n close(id: string) {\n this.toastService.remove(id);\n }\n}\n","<div class=\"toast-container\">\n @for (toast of toasts(); track toast.id) {\n <div class=\"toast toast-{{ toast.type }}\">\n\n <!-- Type icon -->\n <div class=\"toast-icon\">\n @if (toast.type === 'info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n }\n @if (toast.type === 'success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n @if (toast.type === 'warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n }\n @if (toast.type === 'error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n </div>\n\n <!-- Content -->\n <div class=\"toast-content\">\n @if (toast.title) {\n <div class=\"toast-title\">{{ toast.title }}</div>\n }\n <div class=\"toast-message\" [innerHTML]=\"toast.message\"></div>\n </div>\n\n <!-- Close -->\n <button class=\"toast-close\" (click)=\"close(toast.id)\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n\n <!-- Auto-dismiss progress bar — hidden when duration <= 0 (persistent toast) -->\n @if (toast.duration == null || toast.duration > 0) {\n <div class=\"toast-progress\" [style.animation-duration]=\"(toast.duration ?? 5000) + 'ms'\"></div>\n }\n </div>\n }\n</div>\n","import { Component, HostBinding, inject, output, signal, computed, effect } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MesAuthService, NotificationDto, PagedList, RealTimeNotificationDto } from './mes-auth.service';\nimport { ToastService } from './toast.service';\nimport { ThemeService } from './theme.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n selector: 'ma-notification-panel',\n imports: [],\n templateUrl: './notification-panel.component.html',\n styleUrls: ['./panel-shared.css', './notification-panel.component.css'],\n})\nexport class NotificationPanelComponent {\n notificationRead = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly isOpen = signal(false);\n readonly activeTab = signal<'unread' | 'read'>('unread');\n readonly notifications = signal<NotificationDto[]>([]);\n readonly selectedNotification = signal<NotificationDto | null>(null);\n readonly selectedNotificationHtml = signal<SafeHtml | null>(null);\n readonly selectedNotificationDate = signal('');\n // Stable time-ago strings keyed by notification id - refreshed every 30s via signal\n readonly dateLabels = signal<Map<string, string>>(new Map());\n\n readonly unreadNotifications = computed(() => this.notifications().filter(n => !n.isRead));\n readonly readNotifications = computed(() => this.notifications().filter(n => n.isRead));\n readonly currentNotifications = computed(() =>\n this.activeTab() === 'unread' ? this.unreadNotifications() : this.readNotifications()\n );\n\n private dateTimer: ReturnType<typeof setInterval> | null = null;\n\n // Normalize type to string - API may return integer or string\n // Backend enum: Info=0, Success=1, Warning=2, Error=3\n typeOf(notification: { type: any }): 'Info' | 'Success' | 'Warning' | 'Error' {\n const t = notification.type;\n if (t === 0 || t === 'Info') return 'Info';\n if (t === 1 || t === 'Success') return 'Success';\n if (t === 2 || t === 'Warning') return 'Warning';\n if (t === 3 || t === 'Error') return 'Error';\n return 'Info';\n }\n\n private toastType(type: any): 'info' | 'warning' | 'error' | 'success' {\n const t = this.typeOf({ type });\n return t.toLowerCase() as 'info' | 'warning' | 'error' | 'success';\n }\n\n private readonly sanitizer = inject(DomSanitizer);\n private readonly authService = inject(MesAuthService);\n private readonly toastService = inject(ToastService);\n private readonly themeService = inject(ThemeService);\n\n constructor() {\n this.loadNotifications();\n\n // Refresh time-ago labels every 30s - signal mutation triggers CD in zoneless\n this.dateTimer = setInterval(() => this.refreshDateLabels(), 30000);\n\n const latestNotification = toSignal(this.authService.notifications$);\n\n effect(() => {\n const notification = latestNotification() as RealTimeNotificationDto | undefined;\n if (!notification) return;\n this.toastService.show(\n notification.message || '',\n notification.title,\n this.toastType(notification.type),\n 5000\n );\n this.loadNotifications();\n });\n }\n\n ngOnDestroy() {\n if (this.dateTimer !== null) {\n clearInterval(this.dateTimer);\n this.dateTimer = null;\n }\n }\n\n private loadNotifications() {\n this.authService.getNotifications(1, 50, true).subscribe({\n next: (response: PagedList<NotificationDto>) => {\n this.notifications.set(response.items || []);\n this.refreshDateLabels();\n },\n error: () => {}\n });\n }\n\n open() {\n this.isOpen.set(true);\n this.activeTab.set('unread');\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n switchTab(tab: 'unread' | 'read') {\n this.activeTab.set(tab);\n }\n\n openDetails(notification: NotificationDto) {\n this.selectedNotification.set(notification);\n const html = notification.messageHtml || notification.message || '';\n this.selectedNotificationHtml.set(this.sanitizer.bypassSecurityTrustHtml(html));\n this.selectedNotificationDate.set(this.formatDate(notification.createdAt));\n if (!notification.isRead) {\n this.authService.markAsRead(notification.id).subscribe({\n next: () => {\n this.notifications.update(notifs =>\n notifs.map(n => n.id === notification.id ? { ...n, isRead: true } : n)\n );\n this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n }\n\n closeDetails() {\n this.selectedNotification.set(null);\n this.selectedNotificationHtml.set(null);\n this.selectedNotificationDate.set('');\n }\n\n openUrl() {\n const url = this.selectedNotification()?.url?.trim();\n if (url) {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }\n\n markAsRead(notificationId: string, event?: Event) {\n if (event) event.stopPropagation();\n this.authService.markAsRead(notificationId).subscribe({\n next: () => {\n this.notifications.update(notifs =>\n notifs.map(n => n.id === notificationId ? { ...n, isRead: true } : n)\n );\n this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n\n markAllAsRead() {\n this.authService.markAllAsRead().subscribe({\n next: () => {\n this.notifications.update(notifs => notifs.map(n => ({ ...n, isRead: true })));\n this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n\n deleteAllRead() {\n const readIds = this.notifications().filter(n => n.isRead).map(n => n.id);\n const deletePromises = readIds.map(id => firstValueFrom(this.authService.deleteNotification(id)));\n Promise.all(deletePromises).then(() => {\n this.notifications.update(notifs => notifs.filter(n => !n.isRead));\n }).catch(() => {\n this.loadNotifications();\n });\n }\n\n deleteAllUnread() {\n const unreadIds = this.notifications().filter(n => !n.isRead).map(n => n.id);\n const deletePromises = unreadIds.map(id => firstValueFrom(this.authService.deleteNotification(id)));\n Promise.all(deletePromises).then(() => {\n this.notifications.update(notifs => notifs.filter(n => n.isRead));\n this.notificationRead.emit();\n }).catch(() => {\n this.loadNotifications();\n });\n }\n\n delete(notificationId: string, event: Event) {\n event.stopPropagation();\n const wasUnread = this.notifications().some(n => n.id === notificationId && !n.isRead);\n this.authService.deleteNotification(notificationId).subscribe({\n next: () => {\n this.notifications.update(notifs => notifs.filter(n => n.id !== notificationId));\n if (wasUnread) this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n\n formatDate(dateString: string): string {\n return this.computeTimeAgo(dateString, new Date());\n }\n\n // Pure computation - takes now as param so it never calls new Date() internally\n private computeTimeAgo(dateString: string, now: Date): string {\n const normalizedDateString = this.parseUtcDate(dateString);\n const date = new Date(normalizedDateString);\n\n if (isNaN(date.getTime())) return 'Invalid date';\n\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return date.toLocaleDateString();\n }\n\n // Rebuild dateLabels map and store as a new signal value so CD is triggered\n private refreshDateLabels(): void {\n const now = new Date();\n const newLabels = new Map<string, string>();\n for (const n of this.notifications()) {\n newLabels.set(n.id, this.computeTimeAgo(n.createdAt, now));\n }\n this.dateLabels.set(newLabels);\n }\n\n // Parse date string from server (stored in UTC but without 'Z' suffix or 'T' separator)\n private parseUtcDate(dateStr: string): string {\n let normalized = dateStr.includes('T') ? dateStr : dateStr.replace(' ', 'T');\n if (!normalized.endsWith('Z') && !normalized.includes('+') && !normalized.includes('-', 10)) {\n normalized += 'Z';\n }\n return normalized;\n }\n}\n","<div class=\"notification-panel\" [class.open]=\"isOpen()\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-header-left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n <h3>Notifications</h3>\n </div>\n <button class=\"close-btn\" (click)=\"close()\" title=\"Close\" aria-label=\"Close notifications\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'unread'\" (click)=\"switchTab('unread')\">\n Unread\n @if (unreadNotifications().length > 0) {\n <span class=\"tab-badge\">{{ unreadNotifications().length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'read'\" (click)=\"switchTab('read')\">\n Read\n @if (readNotifications().length > 0) {\n <span class=\"tab-badge read-badge\">{{ readNotifications().length }}</span>\n }\n </button>\n </div>\n\n <!-- Notifications List -->\n <div class=\"notifications-list\">\n @if (currentNotifications().length > 0) {\n @for (notification of currentNotifications(); track notification.id) {\n <div\n class=\"notification-item\"\n [class.unread]=\"!notification.isRead\"\n (click)=\"openDetails(notification)\"\n >\n @let t = typeOf(notification);\n <div class=\"notif-accent\"\n [class.type-info]=\"t === 'Info'\"\n [class.type-success]=\"t === 'Success'\"\n [class.type-warning]=\"t === 'Warning'\"\n [class.type-error]=\"t === 'Error'\"></div>\n <div class=\"notif-type-icon\"\n [class.type-info]=\"t === 'Info'\"\n [class.type-success]=\"t === 'Success'\"\n [class.type-warning]=\"t === 'Warning'\"\n [class.type-error]=\"t === 'Error'\">\n @if (t === 'Info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n }\n @if (t === 'Success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n }\n @if (t === 'Warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n }\n @if (t === 'Error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n </div>\n <div class=\"notification-content\">\n <div class=\"notification-title\">{{ notification.title }}</div>\n <div class=\"notification-message\">{{ notification.message }}</div>\n <div class=\"notification-meta\">\n <span class=\"app-name\">{{ notification.sourceAppName }}</span>\n <span class=\"time\">{{ dateLabels().get(notification.id) }}</span>\n </div>\n </div>\n @if (!notification.isRead) {\n <button class=\"icon-btn read-btn\" (click)=\"markAsRead(notification.id, $event)\" title=\"Mark as read\" aria-label=\"Mark as read\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n </button>\n }\n @if (notification.isRead) {\n <button class=\"icon-btn delete-btn\" (click)=\"delete(notification.id, $event)\" title=\"Delete\" aria-label=\"Delete notification\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/><path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/>\n </svg>\n </button>\n }\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <svg class=\"empty-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n <p>No {{ activeTab() }} notifications</p>\n </div>\n }\n </div>\n\n <!-- Footer Actions -->\n @if (currentNotifications().length > 0) {\n <div class=\"panel-footer\">\n @if (activeTab() === 'unread') {\n <div class=\"footer-actions\">\n @if (unreadNotifications().length > 0) {\n <button class=\"action-btn\" (click)=\"markAllAsRead()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>\n Mark all read\n </button>\n <button class=\"action-btn delete-all-btn\" (click)=\"deleteAllUnread()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/></svg>\n Delete all\n </button>\n }\n </div>\n }\n @if (activeTab() === 'read' && readNotifications().length > 0) {\n <button class=\"action-btn delete-all-btn\" (click)=\"deleteAllRead()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/></svg>\n Delete all\n </button>\n }\n </div>\n }\n</div>\n\n<!-- Details Modal -->\n@if (selectedNotification()) {\n <div class=\"modal-overlay\" (click)=\"closeDetails()\">\n <div class=\"modal-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\"\n [class.modal-type-info]=\"typeOf(selectedNotification()!) === 'Info'\"\n [class.modal-type-success]=\"typeOf(selectedNotification()!) === 'Success'\"\n [class.modal-type-warning]=\"typeOf(selectedNotification()!) === 'Warning'\"\n [class.modal-type-error]=\"typeOf(selectedNotification()!) === 'Error'\">\n <div class=\"modal-header-left\">\n <div class=\"modal-type-icon\">\n @if (typeOf(selectedNotification()!) === 'Info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n }\n @if (typeOf(selectedNotification()!) === 'Success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n @if (typeOf(selectedNotification()!) === 'Warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/>\n </svg>\n }\n @if (typeOf(selectedNotification()!) === 'Error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n </div>\n <h3>{{ selectedNotification()!.title }}</h3>\n </div>\n <button class=\"close-btn\" (click)=\"closeDetails()\" title=\"Close\" aria-label=\"Close notification detail\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n <div class=\"modal-meta\">\n <span class=\"app-name\">{{ selectedNotification()!.sourceAppName }}</span>\n <span class=\"time\">{{ selectedNotificationDate() }}</span>\n </div>\n <div class=\"modal-body\" [innerHTML]=\"selectedNotificationHtml()\"></div>\n <div class=\"modal-footer\">\n @if (selectedNotification()?.url?.trim()) {\n <button class=\"action-btn see-details-btn\" (click)=\"openUrl()\">See Details</button>\n }\n <button class=\"action-btn\" (click)=\"closeDetails()\">Close</button>\n </div>\n </div>\n </div>\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { MesAuthConfig, PagedList } from './mes-auth.service';\nimport {\n ApprovalDocumentDto,\n ApprovalDocumentSummaryDto,\n ApprovalDocumentStatus,\n ApprovalDashboardDto,\n ApprovalHistoryDto,\n ApprovalTemplateSummaryDto,\n ApprovalTemplateDto,\n RolePreviewUserDto,\n CreateApprovalRequest,\n CreateApprovalResponseDto,\n CreateApprovalTemplateRequest,\n UpdateApprovalTemplateRequest,\n ApproveRejectRequest,\n DelegateRequest\n} from './approval.models';\n\n@Injectable()\nexport class MaApprovalService {\n private apiBase = '';\n private http!: HttpClient;\n private config: MesAuthConfig | null = null;\n\n constructor() {}\n\n init(config: MesAuthConfig, httpClient: HttpClient) {\n this.config = config;\n this.http = httpClient;\n this.apiBase = config.apiBaseUrl.replace(/\\/$/, '');\n }\n\n private get opts() {\n return { withCredentials: this.config?.withCredentials ?? true };\n }\n\n // ====================== Dashboard ======================\n\n getDashboard(): Observable<ApprovalDashboardDto> {\n return this.http.get<ApprovalDashboardDto>(`${this.apiBase}/approval/dashboard`, this.opts);\n }\n\n // ====================== Pending & My Requests ======================\n\n getPendingApprovals(page = 1, pageSize = 20): Observable<PagedList<ApprovalDocumentSummaryDto>> {\n return this.http.get<PagedList<ApprovalDocumentSummaryDto>>(\n `${this.apiBase}/approval/pending?page=${page}&pageSize=${pageSize}`,\n this.opts\n );\n }\n\n getMyRequests(page = 1, pageSize = 20, status?: ApprovalDocumentStatus): Observable<PagedList<ApprovalDocumentSummaryDto>> {\n let url = `${this.apiBase}/approval/my-requests?page=${page}&pageSize=${pageSize}`;\n if (status !== undefined) url += `&status=${status}`;\n return this.http.get<PagedList<ApprovalDocumentSummaryDto>>(url, this.opts);\n }\n\n // ====================== Document ======================\n\n getDocument(id: string): Observable<ApprovalDocumentDto> {\n return this.http.get<ApprovalDocumentDto>(`${this.apiBase}/approval/documents/${id}`, this.opts);\n }\n\n getDocumentHistory(id: string): Observable<ApprovalHistoryDto[]> {\n return this.http.get<ApprovalHistoryDto[]>(`${this.apiBase}/approval/documents/${id}/history`, this.opts);\n }\n\n getDocumentContentUrl(id: string): string {\n return `${this.apiBase}/approval/documents/${id}/content`;\n }\n\n getDocumentThumbnailUrl(id: string): string {\n return `${this.apiBase}/approval/documents/${id}/thumbnail`;\n }\n\n // ====================== Actions ======================\n\n approve(documentId: string, comment?: string): Observable<void> {\n const body: ApproveRejectRequest = { comment };\n return this.http.post<void>(`${this.apiBase}/approval/documents/${documentId}/approve`, body, this.opts);\n }\n\n reject(documentId: string, comment: string): Observable<void> {\n const body: ApproveRejectRequest = { comment };\n return this.http.post<void>(`${this.apiBase}/approval/documents/${documentId}/reject`, body, this.opts);\n }\n\n delegate(documentId: string, toUserId: string, reason?: string): Observable<void> {\n const body: DelegateRequest = { toUserId, reason };\n return this.http.post<void>(`${this.apiBase}/approval/documents/${documentId}/delegate`, body, this.opts);\n }\n\n cancel(documentId: string, reason?: string): Observable<void> {\n let url = `${this.apiBase}/approval/documents/${documentId}`;\n if (reason) url += `?reason=${encodeURIComponent(reason)}`;\n return this.http.delete<void>(url, this.opts);\n }\n\n // ====================== Templates ======================\n\n getTemplates(appId?: string): Observable<ApprovalTemplateSummaryDto[]> {\n let url = `${this.apiBase}/approval/templates`;\n if (appId) url += `?appId=${encodeURIComponent(appId)}`;\n return this.http.get<ApprovalTemplateSummaryDto[]>(url, this.opts);\n }\n\n getTemplate(id: number): Observable<ApprovalTemplateDto> {\n return this.http.get<ApprovalTemplateDto>(`${this.apiBase}/approval/templates/${id}`, this.opts);\n }\n\n createTemplate(request: CreateApprovalTemplateRequest): Observable<ApprovalTemplateDto> {\n return this.http.post<ApprovalTemplateDto>(`${this.apiBase}/approval/templates`, request, this.opts);\n }\n\n updateTemplate(id: number, request: UpdateApprovalTemplateRequest): Observable<ApprovalTemplateDto> {\n return this.http.put<ApprovalTemplateDto>(`${this.apiBase}/approval/templates/${id}`, request, this.opts);\n }\n\n deleteTemplate(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiBase}/approval/templates/${id}`, this.opts);\n }\n\n previewRole(orgCode: string, level: string): Observable<RolePreviewUserDto[]> {\n return this.http.get<RolePreviewUserDto[]>(\n `${this.apiBase}/approval/roles/preview?orgCode=${encodeURIComponent(orgCode)}&level=${encodeURIComponent(level)}`,\n this.opts\n );\n }\n\n // ====================== Create (used by ma-arv-container) ======================\n\n createApproval(request: CreateApprovalRequest): Observable<CreateApprovalResponseDto> {\n return this.http.post<CreateApprovalResponseDto>(`${this.apiBase}/approval/documents`, request, this.opts);\n }\n}\n","// ====================== Enums ======================\n\nexport enum ApprovalStepMode {\n Sequential = 0,\n Parallel = 1\n}\n\nexport enum ApprovalDocumentStatus {\n Draft = 0,\n Pending = 1,\n Approved = 2,\n Rejected = 3,\n Cancelled = 4,\n Expired = 5\n}\n\nexport enum ApprovalStepStatus {\n Waiting = 0,\n Active = 1,\n Approved = 2,\n Rejected = 3,\n Delegated = 4,\n Expired = 5,\n Skipped = 6\n}\n\nexport enum ApprovalActionType {\n Created = 0,\n Submitted = 1,\n Approved = 2,\n Rejected = 3,\n Delegated = 4,\n Cancelled = 5,\n Commented = 6,\n Expired = 7,\n StepAdvanced = 8\n}\n\n// ====================== DTOs ======================\n\nexport interface ApprovalDocumentSummaryDto {\n id: string;\n title: string;\n description?: string;\n thumbnailPath?: string;\n sourceAppId: string;\n referenceId: string;\n requestedByUserName: string;\n status: ApprovalDocumentStatus;\n currentStepOrder: number;\n totalSteps: number;\n currentStepName?: string;\n createdAt: string;\n completedAt?: string;\n}\n\nexport interface ApprovalStepDto {\n id: number;\n stepOrder: number;\n stepName: string;\n mode: ApprovalStepMode;\n assignedUserId: string;\n assignedUserName: string;\n delegatedToUserId?: string;\n delegatedToUserName?: string;\n status: ApprovalStepStatus;\n comment?: string;\n decidedAt?: string;\n deadlineAt?: string;\n}\n\nexport interface ApprovalReferenceDto {\n userId: string;\n userName: string;\n addedAt: string;\n}\n\nexport interface ApprovalDocumentDto {\n id: string;\n title: string;\n description?: string;\n contentPath: string;\n thumbnailPath?: string;\n sourceAppId: string;\n referenceId: string;\n templateId?: number;\n requestedByUserId: string;\n requestedByUserName: string;\n status: ApprovalDocumentStatus;\n currentStepOrder: number;\n callbackUrl?: string;\n createdAt: string;\n updatedAt: string;\n completedAt?: string;\n deadlineAt?: string;\n steps: ApprovalStepDto[];\n references: ApprovalReferenceDto[];\n}\n\nexport interface ApprovalHistoryDto {\n id: number;\n documentId: string;\n stepId?: number;\n action: ApprovalActionType;\n actorUserId: string;\n actorUserName: string;\n comment?: string;\n details?: string;\n timestamp: string;\n signatureUrl?: string | null;\n}\n\nexport interface ApprovalTemplateSummaryDto {\n id: number;\n name: string;\n description?: string;\n sourceAppId: string;\n stepCount: number;\n referenceCount: number;\n isActive: boolean;\n createdAt: string;\n}\n\nexport interface StepRoleDto {\n id: number;\n orgCode: string;\n positionLevel: string;\n orgName?: string;\n}\n\nexport interface RolePreviewUserDto {\n userId: string; \n fullName?: string;\n position?: string;\n department?: string;\n employeeCode?: string;\n}\n\nexport interface ApprovalTemplateStepDto {\n id: number;\n stepOrder: number;\n stepName: string;\n mode: ApprovalStepMode;\n deadlineHours?: number;\n assigneeUserIds: string[];\n roles: StepRoleDto[];\n}\n\nexport interface ApprovalTemplateDto {\n id: number;\n name: string;\n description?: string;\n sourceAppId: string;\n createdByUserId: string;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n steps: ApprovalTemplateStepDto[];\n referenceUserIds: string[];\n}\n\nexport interface ApprovalDashboardDto {\n pendingCount: number;\n approvedTodayCount: number;\n rejectedTodayCount: number;\n recentActivity: ApprovalDocumentSummaryDto[];\n}\n\nexport interface CreateApprovalResponseDto {\n documentId: string;\n message: string;\n}\n\n// ====================== Requests ======================\n\nexport interface ApprovalStepRequest {\n stepOrder: number;\n stepName: string;\n mode?: ApprovalStepMode;\n approverUserIds: string[];\n deadlineHours?: number;\n}\n\nexport interface CreateApprovalRequest {\n title: string;\n description?: string;\n contentHtml: string;\n thumbnailBase64?: string;\n referenceId: string;\n templateId?: number;\n requestedByUserId?: string;\n callbackUrl?: string;\n deadlineHours?: number;\n steps?: ApprovalStepRequest[];\n referenceUserIds?: string[];\n}\n\nexport interface ApproveRejectRequest {\n comment?: string;\n}\n\nexport interface DelegateRequest {\n toUserId: string;\n reason?: string;\n}\n\nexport interface CreateApprovalTemplateRequest {\n name: string;\n description?: string;\n sourceAppId: string;\n steps: ApprovalStepRequest[];\n referenceUserIds?: string[];\n}\n\nexport interface UpdateApprovalTemplateRequest {\n name: string;\n description?: string;\n steps: ApprovalStepRequest[];\n referenceUserIds?: string[];\n}\n\n// ====================== Submit Result ======================\n\nexport interface ApprovalSubmitResult {\n documentId: string;\n message: string;\n}\n","import {\n Component, inject, output, signal, effect\n} from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { MesAuthService } from './mes-auth.service';\nimport { MaApprovalService } from './approval.service';\nimport { ApprovalDocumentSummaryDto, ApprovalDocumentStatus } from './approval.models';\nimport { HttpClient } from '@angular/common/http';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\ntype PanelTab = 'processing' | 'approved' | 'rejected';\n\n@Component({\n selector: 'ma-approval-panel',\n imports: [DatePipe],\n templateUrl: './ma-approval-panel.component.html',\n styleUrls: ['./panel-shared.css', './ma-approval-panel.component.css']\n})\nexport class MaApprovalPanelComponent {\n approvalActioned = output<void>();\n\n readonly isOpen = signal(false);\n readonly loading = signal(false);\n readonly activeTab = signal<PanelTab>('processing');\n readonly processingItems = signal<ApprovalDocumentSummaryDto[]>([]);\n readonly approvedItems = signal<ApprovalDocumentSummaryDto[]>([]);\n readonly rejectedItems = signal<ApprovalDocumentSummaryDto[]>([]);\n\n private readonly mesAuth = inject(MesAuthService);\n private readonly http = inject(HttpClient);\n private readonly router = inject(Router);\n private approvalSvc: MaApprovalService | null = null;\n\n constructor() {\n const config = this.mesAuth.getConfig();\n if (config) {\n this.approvalSvc = new MaApprovalService();\n this.approvalSvc.init(config, this.http);\n }\n\n const approvalEvent = toSignal(this.mesAuth.approvalEvents$);\n\n effect(() => {\n approvalEvent(); // track SignalR approval events\n if (this.isOpen()) this.loadCurrentTab();\n });\n }\n\n open() {\n this.isOpen.set(true);\n this.loadAllTabs();\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n toggle() {\n if (this.isOpen()) this.close();\n else this.open();\n }\n\n switchTab(tab: PanelTab) {\n this.activeTab.set(tab);\n this.loadCurrentTab();\n }\n\n private loadAllTabs() {\n this.loading.set(true);\n if (!this.approvalSvc) { this.loading.set(false); return; }\n\n let pending = 3;\n const done = () => { if (--pending === 0) this.loading.set(false); };\n\n this.approvalSvc.getPendingApprovals(1, 100).subscribe({\n next: r => { this.processingItems.set(r.items); done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Approved).subscribe({\n next: r => { this.approvedItems.set(r.items); done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => { this.rejectedItems.set(r.items); done(); },\n error: () => done()\n });\n }\n\n private loadCurrentTab() {\n if (!this.approvalSvc) return;\n\n if (this.activeTab() === 'processing') {\n this.approvalSvc.getPendingApprovals(1, 100).subscribe({\n next: r => this.processingItems.set(r.items),\n error: () => {}\n });\n } else if (this.activeTab() === 'approved') {\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Approved).subscribe({\n next: r => this.approvedItems.set(r.items),\n error: () => {}\n });\n } else {\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => this.rejectedItems.set(r.items),\n error: () => {}\n });\n }\n }\n\n navigateToDetail(id: string) {\n this.close();\n this.router.navigate(['/auth/approval/detail', id]);\n this.approvalActioned.emit();\n }\n\n showMore(status: 'approved' | 'rejected') {\n this.close();\n this.router.navigate(['/auth/approval/my-requests'], { queryParams: { status } });\n }\n}\n","<div class=\"approval-backdrop\" [class.open]=\"isOpen()\" (click)=\"close()\"></div>\n<div class=\"approval-panel\" [class.open]=\"isOpen()\">\n\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-header-left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 11l3 3L22 4\"/>\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/>\n </svg>\n <h3>Approvals</h3>\n </div>\n <button class=\"close-btn\" (click)=\"close()\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'processing'\" (click)=\"switchTab('processing')\">\n Processing\n @if (processingItems().length > 0) {\n <span class=\"tab-badge\">{{ processingItems().length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'approved'\" (click)=\"switchTab('approved')\">\n Approved\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'rejected'\" (click)=\"switchTab('rejected')\">\n Rejected\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Loading -->\n @if (loading()) {\n <div class=\"loading-state\">\n <div class=\"spinner\"></div>\n <span>Loading...</span>\n </div>\n }\n\n <!-- Processing tab -->\n @if (!loading() && activeTab() === 'processing') {\n @if (processingItems().length === 0) {\n <div class=\"empty-state\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.4\"><path d=\"M9 11l3 3L22 4\"/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/></svg>\n <p>No pending approvals</p>\n </div>\n }\n @for (item of processingItems(); track item.id) {\n <div class=\"approval-item\" (click)=\"navigateToDetail(item.id)\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div class=\"item-meta\">\n <span class=\"item-requester\">By {{ item.requestedByUserName }}</span>\n @if (item.currentStepName) {\n <span class=\"item-step\">· {{ item.currentStepName }}</span>\n }\n </div>\n <div class=\"item-footer\">\n <span class=\"item-time\">{{ item.createdAt | date:'shortDate' }}</span>\n <span class=\"item-link\">View &rarr;</span>\n </div>\n </div>\n }\n }\n\n <!-- Approved tab -->\n @if (!loading() && activeTab() === 'approved') {\n @if (approvedItems().length === 0) {\n <div class=\"empty-state\">\n <p>No approved documents</p>\n </div>\n }\n @for (item of approvedItems(); track item.id) {\n <div class=\"approval-item approved\" (click)=\"navigateToDetail(item.id)\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div class=\"item-meta\">\n <span class=\"item-requester\">By {{ item.requestedByUserName }}</span>\n </div>\n <div class=\"item-footer\">\n <span class=\"status-badge approved-badge\">Approved</span>\n <span class=\"item-time\">{{ item.completedAt | date:'shortDate' }}</span>\n <span class=\"item-link\">View &rarr;</span>\n </div>\n </div>\n }\n @if (approvedItems().length >= 10) {\n <div class=\"show-more\" (click)=\"showMore('approved')\">Show more &rarr;</div>\n }\n }\n\n <!-- Rejected tab -->\n @if (!loading() && activeTab() === 'rejected') {\n @if (rejectedItems().length === 0) {\n <div class=\"empty-state\">\n <p>No rejected documents</p>\n </div>\n }\n @for (item of rejectedItems(); track item.id) {\n <div class=\"approval-item rejected\" (click)=\"navigateToDetail(item.id)\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div class=\"item-meta\">\n <span class=\"item-requester\">By {{ item.requestedByUserName }}</span>\n </div>\n <div class=\"item-footer\">\n <span class=\"status-badge rejected-badge\">Rejected</span>\n <span class=\"item-time\">{{ item.completedAt | date:'shortDate' }}</span>\n <span class=\"item-link\">View &rarr;</span>\n </div>\n </div>\n }\n @if (rejectedItems().length >= 10) {\n <div class=\"show-more\" (click)=\"showMore('rejected')\">Show more &rarr;</div>\n }\n }\n </div>\n</div>\n","import { Component, ViewChild, AfterViewInit, input, inject, effect } from '@angular/core';\nimport { ToastContainerComponent } from './toast-container.component';\nimport { UserProfileComponent } from './user-profile.component';\nimport { NotificationPanelComponent } from './notification-panel.component';\nimport { MaApprovalPanelComponent } from './ma-approval-panel.component';\nimport { ThemeService } from './theme.service';\n\n@Component({\n selector: 'ma-user',\n imports: [ToastContainerComponent, UserProfileComponent, NotificationPanelComponent, MaApprovalPanelComponent],\n templateUrl: './ma-user.component.html',\n styleUrl: './ma-user.component.css'\n})\nexport class MaUserComponent implements AfterViewInit {\n @ViewChild(UserProfileComponent) userProfile?: UserProfileComponent;\n @ViewChild(MaApprovalPanelComponent) approvalPanel!: MaApprovalPanelComponent;\n\n avatarShape = input<'rectangle' | 'circle' | 'rounded'>('rounded');\n showBell = input(true);\n showApproval = input(true);\n showName = input(false);\n showSignature = input<boolean[]>([false, true]);\n theme = input<'light' | 'dark' | null>(null);\n\n themeService = inject(ThemeService);\n constructor() {\n effect(() => {\n const t = this.theme();\n if (t) {\n this.themeService.setFixTheme(t);\n }\n });\n }\n\n ngAfterViewInit() {\n if (this.userProfile) {\n this.userProfile.loadUnreadCount();\n this.userProfile.loadPendingApprovalCount();\n } \n }\n\n onNotificationRead() {\n if (this.userProfile) {\n this.userProfile.loadUnreadCount();\n }\n }\n\n onApprovalActioned() {\n if (this.userProfile) {\n this.userProfile.loadPendingApprovalCount();\n }\n }\n}\n","<ma-toast-container></ma-toast-container>\n<div class=\"user-header\">\n <ma-user-profile\n (notificationClick)=\"notificationPanel.open()\"\n (approvalClick)=\"approvalPanel.open()\"\n [inputAvatarShape]=\"avatarShape()\"\n [showBell]=\"showBell()\"\n [showApproval]=\"showApproval()\"\n [showName]=\"showName()\"\n [showSignature]=\"showSignature()\">\n <ng-content></ng-content>\n </ma-user-profile> \n</div>\n<ma-notification-panel #notificationPanel (notificationRead)=\"onNotificationRead()\"></ma-notification-panel>\n<ma-approval-panel #approvalPanel (approvalActioned)=\"onApprovalActioned()\"></ma-approval-panel>\n","import { Component, input, inject, effect, computed, signal, HostBinding, HostListener, ElementRef } from '@angular/core';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ThemeService } from './theme.service';\nimport { IUser, MesAuthService } from './mes-auth.service';\nimport { AvatarSize, MaAvatarComponent } from './ma-avatar.component';\nimport { distinctUntilChanged, of, switchMap } from 'rxjs';\n\n@Component({\n selector: 'ma-ux',\n imports: [MaAvatarComponent],\n templateUrl: './ma-ux.component.html',\n styleUrl: './ma-ux.component.css'\n})\nexport class MaUserXComponent { \n userId = input<string | null>(null); \n showName = input<'short' | 'full' | 'none'>('full');\n showTitle = input<boolean>(true); \n scale = input<number>(0.5);\n shape = input<'circle' | 'rounded' | 'rectangle' | null>(null);\n ratio = input<'ar-11' | 'ar-43' | 'ar-169'>('ar-11');\n user = input<IUser | null>(null);\n useDefault = input<boolean>(false);\n showTooltip = input<boolean>(true);\n\n // === Signature ===\n showSignature = input<boolean>(false);\n // Optional explicit signature URL (e.g. an approval-history snapshot path).\n // When omitted and showSignature=true, falls back to the live user signature: /auth/{userId}/signature\n signatureUrl = input<string | null>(null);\n signatureHeight = input<number>(40);\n signatureOnly = input<boolean>(false);\n\n theme = input<'light' | 'dark' | null>(null);\n\n themeService = inject(ThemeService);\n authService = inject(MesAuthService);\n private hostEl = inject(ElementRef<HTMLElement>);\n\n xUser = signal<IUser | null>(null);\n readonly avatarRefresh = signal<number>(Date.now());\n\n readonly tooltipOpen = signal<boolean>(false);\n readonly tooltipTop = signal<number>(0);\n readonly tooltipLeft = signal<number>(0);\n\n readonly avatarShape = computed(() => this.shape() ?? this.xUser()?.avatarShape ?? 'circle');\n readonly avatarFrame = computed(() => this.xUser()?.avatarFrame ?? null);\n readonly avatarRatio = computed(() => this.ratio() ?? this.xUser()?.avatarRatio);\n readonly avatarSize = computed<AvatarSize>(() => (this.xUser()?.avatarSize as AvatarSize) ?? 'md');\n\n readonly signatureBroken = signal<boolean>(false);\n readonly resolvedSignatureUrl = computed<string | null>(() => {\n if (!this.showSignature() || this.signatureBroken()) return null;\n const baseRaw = this.authService.getConfig()?.apiBaseUrl ?? '';\n const base = baseRaw.replace(/\\/$/, '');\n const explicit = this.signatureUrl();\n if (explicit) {\n if (/^https?:\\/\\//i.test(explicit)) return explicit;\n return `${base}${explicit.startsWith('/') ? '' : '/'}${explicit}`;\n }\n const u = this.xUser();\n const id = u?.userId ?? u?.id;\n if (!id || !base) return null;\n return `${base}/auth/${id}/signature`;\n });\n\n @HostBinding('class') get themeClass(): string { return `theme-${this.themeService.currentTheme()}`; }\n constructor() {\n effect(() => {\n const t = this.theme();\n if (t) {\n this.themeService.setFixTheme(t);\n }\n });\n\n effect(() => {\n const user = this.user();\n if (user) this.xUser.set(user);\n });\n\n effect(() => {\n // Reset broken flag whenever the signature source changes\n this.signatureUrl();\n this.userId();\n this.xUser();\n this.signatureBroken.set(false);\n });\n\n toObservable(this.userId).pipe(\n distinctUntilChanged(),\n switchMap(id => {\n if (this.user()) return of(null);\n if (!id) {\n this.xUser.set(null);\n return of(null);\n }\n return this.authService.getUserX(id);\n }),\n takeUntilDestroyed()\n ).subscribe({\n next: (u) => { if (u) this.xUser.set(u); },\n error: () => this.xUser.set(null)\n });\n } \n\n name = computed(() => {\n const fullname = this.xUser()?.fullName ?? '';\n if (this.showName() == 'none') return '';\n else if (this.showName() == 'short') {\n const parts = fullname?.split(' ');\n return parts[parts.length - 1];\n }\n\n return fullname;\n });\n\n getAvatarUrl(user?: IUser): string {\n // Use the refresh signal to force update\n //const refresh = this.avatarRefresh();\n const config = this.authService.getConfig();\n const baseUrl = config?.apiBaseUrl || '';\n\n // if (user.avatarPath) {\n // if (user.avatarPath.startsWith('http://') || user.avatarPath.startsWith('https://')) {\n // return user.avatarPath;\n // }\n // return `${baseUrl.replace(/\\/$/, '')}${user.avatarPath}?t=${refresh}`;\n // }\n\n const userId = user?.userId ?? user?.id;\n if (userId && baseUrl) {\n return this.useDefault() ? `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatars/__default__` //?t=${refresh}\n : `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatar`; //?t=${refresh}\n }\n\n const displayName = user?.userName || user?.userId || 'User';\n return `https://ui-avatars.com/api/?name=${encodeURIComponent(displayName)}&background=1976d2&color=fff`;\n }\n\n getLastNameInitial(user: IUser): string {\n const fullName = user.fullName || user.userName || 'U';\n const parts = fullName.split(' ');\n const lastPart = parts[parts.length - 1];\n return lastPart.charAt(0).toUpperCase();\n }\n\n @HostListener('mouseenter')\n onHostMouseEnter(): void {\n if (!this.showTooltip() || !this.xUser()) return;\n const rect = (this.hostEl.nativeElement as HTMLElement).getBoundingClientRect();\n this.tooltipTop.set(rect.top - 8);\n this.tooltipLeft.set(rect.left);\n this.tooltipOpen.set(true);\n }\n\n @HostListener('mouseleave')\n onHostMouseLeave(): void {\n this.tooltipOpen.set(false);\n }\n\n @HostListener('window:scroll')\n @HostListener('window:resize')\n onViewportChange(): void {\n if (this.tooltipOpen()) this.tooltipOpen.set(false);\n }\n\n onSigErr(_ev: Event): void {\n this.signatureBroken.set(true);\n }\n}\n","<ng-container>\n @if (xUser()){\n @if (!signatureOnly()) {\n <ma-avatar\n [src]=\"getAvatarUrl(xUser())\"\n [alt]=\"xUser()?.fullName || xUser()?.userName || ''\"\n [initials]=\"getLastNameInitial(xUser())\"\n [size]=\"avatarSize()\"\n [shape]=\"avatarShape()\"\n [ratio]=\"avatarRatio()\"\n [frame]=\"avatarFrame()\"\n [scale]=\"scale()\" />\n <span class=\"user-name\">{{ name() }}</span>\n @if (showTitle() && xUser()?.givenTitle){\n <span class=\"given-title-cell given-title-badge\" [class]=\"'given-color-' + xUser()?.givenColor\">{{xUser()?.givenTitle }}</span>\n }\n }\n @if (showSignature() && resolvedSignatureUrl(); as sigUrl) {\n <img class=\"ma-ux-signature\"\n [src]=\"sigUrl\"\n [style.height.px]=\"signatureHeight()\"\n (error)=\"onSigErr($event)\"\n alt=\"signature\" />\n }\n @if (showTooltip() && xUser(); as u) {\n <div class=\"ma-ux-tooltip\"\n [class.open]=\"tooltipOpen()\"\n [style.top.px]=\"tooltipTop()\"\n [style.left.px]=\"tooltipLeft()\"\n role=\"tooltip\">\n <ma-avatar\n [src]=\"getAvatarUrl(u)\"\n [alt]=\"u.fullName || u.userName || ''\"\n [initials]=\"getLastNameInitial(u)\"\n [size]=\"avatarSize()\"\n [frame]=\"avatarFrame()\"\n [shape]=\"avatarShape()\"\n [scale]=\"1\" />\n <div class=\"ma-ux-tooltip-info\">\n <div class=\"ma-ux-tooltip-name\">{{ u.fullName || u.userName }}</div>\n <div class=\"ma-ux-tooltip-meta\"> \n <span>{{ u.department || '-' }}</span>\n <span class=\"sep\">·</span>\n <span>{{ u.position || '-' }}</span>\n @if (showTitle() && xUser()?.givenTitle){ \n <span class=\"given-title-cell given-title-badge\" [class]=\"'given-color-' + xUser()?.givenColor\">{{xUser()?.givenTitle }}</span> \n }\n </div>\n </div>\n </div>\n }\n }\n @else {\n <span>User | UserId is not config!</span>\n }\n \n</ng-container>\n","import { Component, HostBinding, inject, signal, output, effect } from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ma-notification-badge',\n imports: [],\n templateUrl: './notification-badge.component.html',\n styleUrl: './notification-badge.component.css'\n})\nexport class NotificationBadgeComponent {\n notificationClick = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly unreadCount = signal(0);\n\n private readonly authService = inject(MesAuthService);\n private readonly themeService = inject(ThemeService);\n\n constructor() {\n const currentUser = toSignal(this.authService.currentUser$, { initialValue: null });\n const latestNotification = toSignal(this.authService.notifications$);\n\n effect(() => {\n if (!currentUser()) {\n this.unreadCount.set(0);\n return;\n }\n this.loadUnreadCount();\n });\n\n effect(() => {\n latestNotification(); // track SignalR notification events\n if (currentUser()) this.loadUnreadCount();\n });\n }\n\n private loadUnreadCount() {\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => this.unreadCount.set(response.unreadCount || 0),\n error: () => {}\n });\n }\n\n onNotificationClick() {\n this.notificationClick.emit();\n }\n}\n","<button class=\"notification-btn\" (click)=\"onNotificationClick()\" title=\"Notifications\">\n <span class=\"icon\">🔔</span>\n @if (unreadCount() > 0) {\n <span class=\"badge\">{{ unreadCount() }}</span>\n }\n</button>\n","import {\n Component, ElementRef, ViewChild, HostBinding, inject, input, output, DestroyRef,\n signal,\n computed\n} from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { MaApprovalService } from './approval.service';\nimport {\n ApprovalTemplateSummaryDto,\n ApprovalTemplateDto,\n ApprovalTemplateStepDto,\n RolePreviewUserDto,\n ApprovalStepRequest,\n ApprovalStepMode,\n CreateApprovalRequest,\n ApprovalSubmitResult \n} from './approval.models';\nimport { forkJoin, of, firstValueFrom } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient } from '@angular/common/http';\nimport { MaUserXComponent } from './ma-ux.component';\n\n@Component({\n selector: 'ma-arv-container',\n imports: [MaUserXComponent],\n templateUrl: './ma-arv-container.component.html',\n styleUrl: './ma-arv-container.component.css'\n})\nexport class MaArvContainerComponent {\n title = input('');\n description = input<string | undefined>(undefined);\n referenceId = input('');\n templateIds = input<number[] | undefined>(undefined);\n callbackUrl = input<string | undefined>(undefined);\n deadlineHours = input<number | undefined>(undefined);\n\n approvalSubmitted = output<ApprovalSubmitResult>();\n approvalSubmitting = output<void>();\n cancelled = output<void>();\n\n @ViewChild('contentBody', { static: true }) contentBody!: ElementRef<HTMLElement>;\n\n @HostBinding('class') get themeClass(): string { return `theme-${this.themeService.currentTheme()}`; }\n\n readonly routingMode = signal<'template' | 'adhoc'>('template');\n templates = signal<ApprovalTemplateSummaryDto[]>([]);\n selectedTemplateId = signal<number | null>(null);\n selectedTemplate = signal<ApprovalTemplateDto | null>(null);\n loadingTemplate = signal(false);\n\n // Per-step role candidates and selected user\n stepCandidates = signal<RolePreviewUserDto[][]>([]);\n stepLoadingCandidates = signal<boolean[]>([]);\n stepSelectedUsers = signal<string[]>([]);\n readonly adHocSteps = signal<ApprovalStepRequest[]>([]);\n\n readonly referenceUserIds = signal<string[]>([]);\n readonly refSearchQuery = signal('');\n readonly refSearchResults = signal<any[]>([]);\n\n readonly userSearchQuery = signal<string[]>([]);\n readonly userSearchResults = signal<any[][]>([]);\n\n readonly candidateSearchQuery = signal<string[]>([]);\n readonly candidateSearchResults = signal<any[][]>([]);\n\n submitting = signal(false);\n isSubmitted = signal(false);\n errorMessage = computed(() => {\n if (!this.approvalSvc) { return 'Approval service not initialized. Ensure provideMesAuth() is configured.'; }\n if (!this.referenceId()) { return 'ReferenceId is required.'; }\n if (!this.title()) { return 'Title is required.'; }\n\n if (this.routingMode() === 'template' && !this.selectedTemplateId()) {\n return 'Please select a template or switch to Custom Steps.';\n }\n if (this.routingMode() === 'adhoc' && this.adHocSteps().length === 0) {\n return 'Please add at least one approval step.';\n }\n if (this.routingMode() === 'adhoc') {\n for (const step of this.adHocSteps()) {\n if (step.approverUserIds.length === 0) {\n return `Step \"${step.stepName}\" needs at least one approver.`;\n }\n }\n }\n // Validate selectable steps (role-based or multi-assignee) have a selected approver\n if (this.routingMode() === 'template' && this.selectedTemplate()) {\n for (let i = 0; i < this.selectedTemplate().steps.length; i++) {\n const step = this.selectedTemplate().steps[i];\n const isSelectable = (this.stepCandidates()[i]?.length ?? 0) > 1;\n if (isSelectable && !this.stepSelectedUsers()[i]) {\n return `Please select an approver for step \"${step.stepName}\".`;\n }\n }\n }\n return '';\n });\n isError = computed(() => !!this.errorMessage());\n isStepsError = computed(() => {\n const stepsError: Record<number, boolean> = {};\n if (this.routingMode() === 'template' && this.selectedTemplate()) {\n for (let i = 0; i < this.selectedTemplate().steps.length; i++) {\n const isSelectable = (this.stepCandidates()[i]?.length ?? 0) > 1;\n stepsError[i] = isSelectable && !this.stepSelectedUsers()[i];\n }\n }\n if (this.routingMode() === 'adhoc') {\n for (let i = 0; i < this.adHocSteps().length; i++) {\n stepsError[i] = this.adHocSteps()[i].approverUserIds.length === 0;\n }\n }\n return stepsError;\n });\n submitResultError = signal<string | null>(null);\n\n private mesAuth = inject(MesAuthService);\n private themeService = inject(ThemeService);\n private approvalSvc: MaApprovalService | null = null;\n private http = inject(HttpClient);\n private destroyRef = inject(DestroyRef);\n\n constructor() {\n const config = this.mesAuth.getConfig();\n if (config) {\n this.approvalSvc = new MaApprovalService();\n this.approvalSvc.init(config, this.http);\n \n this.loadTemplates();\n }\n this.addStep();\n }\n\n private loadTemplates() {\n this.approvalSvc!.getTemplates().pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (t) => {\n const ids = this.templateIds();\n if (ids && ids.length > 0)\n t = t.filter(temp => ids.includes(temp.id));\n\n this.templates.set(t);\n if (ids && ids.length > 0) {\n this.selectedTemplateId.set(ids[0]);\n this.loadTemplateDetail(this.selectedTemplateId()!);\n }\n },\n error: () => {}\n });\n }\n\n private loadTemplateDetail(id: number) {\n this.loadingTemplate.set(true);\n this.selectedTemplate.set(null);\n this.stepCandidates.set([]);\n this.stepLoadingCandidates.set([]);\n this.stepSelectedUsers.set([]);\n this.candidateSearchQuery.set([]);\n this.candidateSearchResults.set([]);\n this.approvalSvc!.getTemplate(id).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (t) => {\n this.selectedTemplate.set(t);\n this.loadingTemplate.set(false);\n this.loadStepCandidates(t.steps);\n },\n error: () => { this.loadingTemplate.set(false); }\n });\n }\n\n private loadStepCandidates(steps: ApprovalTemplateStepDto[]) {\n this.stepCandidates.set(steps.map(() => []));\n this.stepLoadingCandidates.set(steps.map(() => false));\n this.stepSelectedUsers.set(steps.map(() => ''));\n this.candidateSearchQuery.set(steps.map(() => ''));\n this.candidateSearchResults.set(steps.map(() => []));\n\n const config = this.mesAuth.getConfig();\n\n steps.forEach((step, i) => {\n if (step.roles && step.roles.length > 0) {\n // Role-based: fetch candidates via role preview\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = true; return next;\n });\n const calls = step.roles.map(r => this.approvalSvc!.previewRole(r.orgCode, r.positionLevel));\n const source$ = calls.length > 0\n ? forkJoin(calls)\n : of([] as RolePreviewUserDto[][]);\n\n source$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (results: RolePreviewUserDto[][]) => {\n const merged = new Map<string, RolePreviewUserDto>();\n \n // results is already a flat array of all candidates across all roles\n results.forEach(roleList => roleList.forEach(u => merged.set(u.userId, u)));\n\n const candidates = Array.from(merged.values());\n\n this.stepCandidates.update(c => {\n const next = [...c]; next[i] = candidates; return next;\n });\n\n if (candidates.length === 1) {\n this.stepSelectedUsers.update(u => {\n const next = [...u]; next[i] = candidates[0].userId; return next;\n });\n }\n\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n },\n error: () => {\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n }\n });\n } else if (step.assigneeUserIds && step.assigneeUserIds.length > 0 && config) {\n // Search-selected employees: resolve IDs to display names\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = true; return next;\n });\n const base = config.apiBaseUrl.replace(/\\/$/, '');\n const opts = { withCredentials: config.withCredentials ?? true };\n const calls = step.assigneeUserIds.map(uid =>\n this.http.get<any>(`${base}/urs/users/${encodeURIComponent(uid)}`, opts)\n );\n forkJoin(calls)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: results => {\n this.stepCandidates.update(c => {\n const next = [...c]; \n next[i] = results.map((u: any) => ({\n userId: u.id || u.Id, \n fullName: u.fullName || u.FullName || u.userName || u.UserName,\n department: u.department || u.Department,\n position: u.position || u.Position,\n employeeCode: u.employeeCode || u.EmployeeCode\n } as RolePreviewUserDto)); \n return next;\n });\n \n // Single assignee - pre-select automatically\n if (this.stepCandidates()[i].length === 1) {\n this.stepSelectedUsers.update(u => {\n const next = [...u]; next[i] = this.stepCandidates()[i][0].userId; return next;\n });\n }\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n },\n error: () => {\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n }\n });\n }\n });\n }\n\n onStepUserChange(stepIndex: number, event: Event) {\n this.stepSelectedUsers.update(u => { \n const next = [...u]; next[stepIndex] = (event.target as HTMLSelectElement).value; return next;\n });\n }\n\n onStepUserChangeInput(stepIndex: number, userId: string) {\n this.stepSelectedUsers.update(u => {\n const next = [...u]; next[stepIndex] = userId; return next;\n });\n this.candidateSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = ''; return copy; });\n this.candidateSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n }\n\n private normalize(str: string | undefined): string {\n if (!str) return '';\n return str\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/đ/g, 'd')\n .replace(/Đ/g, 'D')\n .toLowerCase();\n }\n onCandidateSearchInput(stepIndex: number, query: string) {\n this.candidateSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = query; return copy; });\n if (!query || query.length < 2) {\n this.candidateSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = this.stepCandidates()[stepIndex]; return copy; });\n return;\n }\n const q = this.normalize(query);\n this.candidateSearchResults.update(r => {\n const copy = [...r];\n copy[stepIndex] = this.stepCandidates()[stepIndex].filter(u =>\n this.normalize(u.fullName).includes(q)\n || this.normalize(u.employeeCode).includes(q)\n || this.normalize(u.department).includes(q)\n || this.normalize(u.position).includes(q)\n );\n return copy;\n });\n }\n\n clearCandidateResults(stepIndex: number) {\n this.candidateSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n }\n\n onTemplateChange(event: Event) {\n const val = (event.target as HTMLSelectElement).value;\n this.selectedTemplateId.set(val ? parseInt(val, 10) : null);\n this.selectedTemplate.set(null);\n if (this.selectedTemplateId()) {\n this.loadTemplateDetail(this.selectedTemplateId()!);\n }\n }\n\n addStep() {\n this.adHocSteps.update(steps => {\n const order = steps.length + 1;\n return [...steps, { stepOrder: order, stepName: `Step ${order}`, approverUserIds: [] }];\n });\n this.userSearchQuery.update(q => [...q, '']);\n this.userSearchResults.update(r => [...r, []]);\n }\n\n removeStep(i: number) {\n this.adHocSteps.update(steps => {\n const copy = steps.filter((_, idx) => idx !== i);\n copy.forEach((s, idx) => s.stepOrder = idx + 1);\n return copy;\n });\n this.userSearchQuery.update(q => q.filter((_, idx) => idx !== i));\n this.userSearchResults.update(r => r.filter((_, idx) => idx !== i));\n }\n\n updateStepName(stepIndex: number, name: string) {\n this.adHocSteps.update(steps => {\n const copy = [...steps];\n copy[stepIndex] = { ...copy[stepIndex], stepName: name };\n return copy;\n });\n }\n\n addApprover(stepIndex: number, userId: string) {\n this.adHocSteps.update(steps => {\n const copy = [...steps];\n const step = copy[stepIndex];\n if (!step.approverUserIds.includes(userId)) {\n copy[stepIndex] = { ...step, approverUserIds: [...step.approverUserIds, userId] };\n }\n return copy;\n });\n this.userSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = ''; return copy; });\n this.userSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n }\n\n removeApprover(stepIndex: number, approverIndex: number) {\n this.adHocSteps.update(steps => {\n const copy = [...steps];\n const step = copy[stepIndex];\n const newApprovers = [...step.approverUserIds];\n newApprovers.splice(approverIndex, 1);\n copy[stepIndex] = { ...step, approverUserIds: newApprovers };\n return copy;\n });\n }\n\n addReference(userId: string) {\n if (!this.referenceUserIds().includes(userId)) {\n this.referenceUserIds.update(ids => [...ids, userId]);\n }\n this.refSearchQuery.set('');\n this.refSearchResults.set([]);\n }\n\n removeReference(j: number) {\n this.referenceUserIds.update(ids => ids.filter((_, idx) => idx !== j));\n }\n\n onUserSearchInput(stepIndex: number, query: string) {\n this.userSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = query; return copy; });\n if (!query || query.length < 2) {\n this.userSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n return;\n }\n this.searchUsers(query).then(r => {\n this.userSearchResults.update(results => { const copy = [...results]; copy[stepIndex] = r; return copy; });\n });\n }\n\n onRefSearchInput(query: string) {\n this.refSearchQuery.set(query);\n if (!query || query.length < 2) { this.refSearchResults.set([]); return; }\n this.searchUsers(query).then(r => this.refSearchResults.set(r));\n }\n\n private searchUsers(query: string): Promise<any[]> {\n const config = this.mesAuth.getConfig();\n if (!config) return Promise.resolve([]);\n const url = `${config.apiBaseUrl.replace(/\\/$/, '')}/urs/users?search=${encodeURIComponent(query)}&page=1&pageSize=20`;\n return firstValueFrom(\n this.http.get<any>(url, { withCredentials: config.withCredentials ?? true })\n ).then((r: any) => {\n const items = r?.data || r?.Data || r?.items || r || [];\n return (Array.isArray(items) ? items : []).map((u: any) => ({\n id: u.id || u.Id,\n userName: u.userName || u.UserName,\n fullName: u.fullName || u.FullName,\n email: u.email || u.Email,\n department: u.department || u.Department,\n position: u.position || u.Position,\n employeeCode: u.employeeCode || u.EmployeeCode\n }));\n }).catch(() => []);\n }\n\n async submit() {\n if (this.submitting()) return;\n\n if (this.errorMessage()) return;\n\n // Emit before capture so parent can hide edit controls (inputs, buttons)\n // then wait one tick for Angular CD to update the DOM before snapshotting\n this.approvalSubmitting.emit();\n await new Promise(resolve => setTimeout(resolve));\n\n this.submitting.set(true);\n\n try {\n const contentHtml = await this.captureContent();\n const thumbnailBase64 = await this.captureThumbnail().catch(() => undefined);\n\n const request: CreateApprovalRequest = {\n title: this.title(),\n description: this.description(),\n contentHtml,\n thumbnailBase64,\n referenceId: this.referenceId(),\n callbackUrl: this.callbackUrl(),\n deadlineHours: this.deadlineHours(),\n referenceUserIds: this.referenceUserIds().length > 0 ? this.referenceUserIds() : undefined\n };\n\n if (this.routingMode() === 'template') {\n request.templateId = this.selectedTemplateId() ?? this.templateIds()?.[0];\n // If template has role-based steps with selected approvers, pass explicit steps\n if (this.selectedTemplate()) {\n const hasSelectableSteps = this.selectedTemplate()!.steps.some(\n (s, i) => (this.stepCandidates()[i]?.length ?? 0) > 0\n );\n if (hasSelectableSteps) {\n request.steps = this.selectedTemplate()!.steps.map((s, i) => ({\n stepOrder: s.stepOrder,\n stepName: s.stepName,\n mode: s.mode,\n approverUserIds: this.stepSelectedUsers()[i]\n ? [this.stepSelectedUsers()[i]]\n : (this.stepCandidates()[i] && this.stepCandidates()[i].length > 0\n ? this.stepCandidates()[i].map(u => u.userId)\n : s.assigneeUserIds) // fallback to original assignees if no selection made\n }));\n }\n }\n } else {\n request.steps = this.adHocSteps().map((s, i) => ({\n stepOrder: i + 1,\n stepName: s.stepName,\n mode: ApprovalStepMode.Sequential,\n approverUserIds: s.approverUserIds\n }));\n }\n\n this.approvalSvc!.createApproval(request).subscribe({\n next: (result) => {\n this.isSubmitted.set(true);\n this.submitting.set(false);\n this.approvalSubmitted.emit({ documentId: result.documentId, message: result.message });\n },\n error: (err) => {\n this.submitting.set(false);\n this.submitResultError.set(err?.error?.message || 'Failed to submit approval. Please try again.');\n }\n });\n } catch (err: any) {\n this.submitting.set(false);\n this.submitResultError.set(err?.message || 'Failed to capture content.');\n }\n }\n\n onCancel() {\n this.cancelled.emit();\n }\n\n // ====================== Content Capture ======================\n\n async captureContent(): Promise<string> {\n const host = this.contentBody.nativeElement;\n\n // Step 1: Build canvas -> img map from the live DOM\n const canvasMap = new Map<Element, HTMLImageElement>();\n host.querySelectorAll('canvas').forEach((canvas) => {\n try {\n const img = document.createElement('img');\n img.src = (canvas as HTMLCanvasElement).toDataURL('image/png');\n img.style.width = canvas.offsetWidth + 'px';\n img.style.height = canvas.offsetHeight + 'px';\n canvasMap.set(canvas, img);\n } catch {}\n });\n\n // Step 2: Deep clone\n const clone = host.cloneNode(true) as HTMLElement;\n\n // Step 3: Replace canvas nodes in clone with img snapshots\n const originalCanvases = Array.from(host.querySelectorAll('canvas'));\n clone.querySelectorAll('canvas').forEach((cloneCanvas, idx) => {\n const img = canvasMap.get(originalCanvases[idx]);\n if (img) cloneCanvas.replaceWith(img.cloneNode(true));\n });\n\n // Step 4: Inline all <img> sources as base64 data URIs for content integrity\n const imgElements = Array.from(clone.querySelectorAll('img')) as HTMLImageElement[];\n await Promise.all(imgElements.map(async (img) => {\n const src = img.getAttribute('src');\n if (!src || src.startsWith('data:')) return;\n try {\n const resp = await fetch(src, { mode: 'cors', credentials: 'same-origin' });\n if (!resp.ok) return;\n const blob = await resp.blob();\n const dataUri = await new Promise<string>((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n img.setAttribute('src', dataUri);\n } catch { /* keep original src if fetch fails */ }\n }));\n\n // Step 5: Inline only essential layout styles (skip colors, widths, cursors)\n const liveElements = Array.from(host.querySelectorAll('*'));\n const cloneElements = Array.from(clone.querySelectorAll('*'));\n const styleProps = this.getStyleProperties();\n\n liveElements.forEach((liveEl, i) => {\n const cloneEl = cloneElements[i] as HTMLElement;\n if (!cloneEl || typeof cloneEl.setAttribute !== 'function') return;\n try {\n const computed = window.getComputedStyle(liveEl as Element);\n const styles: string[] = [];\n styleProps.forEach(prop => {\n const val = computed.getPropertyValue(prop);\n if (val && val !== '' && val !== 'initial' && val !== 'normal' && val !== 'none' && val !== 'auto') {\n styles.push(`${prop}:${val}`);\n }\n });\n if (styles.length) cloneEl.setAttribute('style', styles.join(';'));\n } catch {}\n });\n\n // Step 6: Strip scripts, Angular attributes, style/link tags, and form elements\n clone.querySelectorAll('script, link, style').forEach(el => el.remove());\n clone.querySelectorAll('*').forEach(el => {\n Array.from(el.attributes).forEach(attr => {\n if (attr.name.startsWith('_ngcontent-') ||\n attr.name.startsWith('_nghost-') ||\n attr.name.startsWith('ng-reflect-') ||\n attr.name.startsWith('ng-version') ||\n attr.name.startsWith('on') ||\n attr.name === 'cformcontrol' ||\n attr.name === 'clabel') {\n el.removeAttribute(attr.name);\n }\n });\n el.removeAttribute('class');\n });\n\n // Step 7: Wrap in a clean, print-friendly HTML document\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n margin: 0; padding: 24px;\n color: #212121; background: #fff;\n font-size: 14px; line-height: 1.6;\n max-width: 210mm;\n }\n h1, h2, h3, h4, h5, h6 { color: #1565c0; margin: 0 0 12px; }\n p { margin: 0 0 8px; }\n img { max-width: 100%; }\n table { border-collapse: collapse; width: 100%; }\n td, th { padding: 8px 12px; border: 1px solid #ddd; text-align: left; vertical-align: top; }\n input, textarea, select {\n border: 1px solid #ccc; border-radius: 4px; padding: 6px 10px;\n font-size: 14px; width: 100%; background: #fafafa; color: #333;\n }\n label { font-weight: 500; display: block; margin-bottom: 4px; color: #333; }\n div { max-width: 100%; }\n </style>\n</head>\n<body>\n${clone.outerHTML}\n</body>\n</html>`;\n }\n\n private async captureThumbnail(): Promise<string | undefined> {\n const html2canvas = (window as any)['html2canvas'];\n if (!html2canvas) return undefined;\n\n const canvas: HTMLCanvasElement = await html2canvas(this.contentBody.nativeElement, {\n scale: 1, useCORS: true, logging: false, width: 600, height: 400\n });\n return canvas.toDataURL('image/png').split(',')[1];\n }\n\n private getStyleProperties(): string[] {\n return [\n 'font-size', 'font-weight', 'font-style', 'line-height', 'text-align', 'text-decoration',\n 'border', 'border-top', 'border-right', 'border-bottom', 'border-left',\n 'border-width', 'border-style', 'border-radius',\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'display', 'flex-direction', 'flex-wrap', 'justify-content', 'align-items', 'gap',\n 'vertical-align', 'table-layout', 'border-collapse', 'border-spacing',\n 'text-transform', 'letter-spacing', 'white-space', 'word-break'\n ];\n }\n}\n","<div class=\"arv-container\">\n <!-- Content Area -->\n <div class=\"arv-content-body\" #contentBody>\n <ng-content></ng-content>\n </div>\n\n <!-- Approval Footer -->\n <div class=\"arv-footer\">\n @if (!isSubmitted()) {\n <div class=\"arv-footer-inner\">\n\n <!-- Routing mode -->\n <div class=\"arv-routing\">\n <div class=\"arv-routing-header\">\n <h4 class=\"arv-section-title\">Approval Routing</h4>\n <!-- Show routing toggle only when templateId is NOT locked to a single template -->\n @if (!templateIds() || templateIds()!.length <= 0) {\n <div class=\"arv-routing-mode\">\n <label class=\"arv-radio\">\n <input type=\"radio\" name=\"routingMode\" value=\"template\" [checked]=\"routingMode() === 'template'\" (change)=\"routingMode.set('template')\"> Use Template\n </label>\n <label class=\"arv-radio\">\n <input type=\"radio\" name=\"routingMode\" value=\"adhoc\" [checked]=\"routingMode() === 'adhoc'\" (change)=\"routingMode.set('adhoc')\"> Custom Steps\n </label>\n </div>\n }\n </div>\n\n <!-- Locked template: only when templateId set and no multi-choice -->\n @if (templateIds() && templateIds()!.length === 1 && routingMode() === 'template') {\n <div class=\"arv-template-select\">\n @if (loadingTemplate()) {\n <div class=\"arv-template-loading\">Loading template...</div>\n }\n @if (selectedTemplate() && !loadingTemplate()) {\n <div class=\"arv-locked-template\">\n <span class=\"arv-locked-label\">Template</span>\n <span class=\"arv-locked-name\">{{ selectedTemplate()!.name }}</span>\n </div>\n }\n </div>\n }\n <!-- Template selector: shown when no templateId, OR when templateIds has multiple choices -->\n @else if (routingMode() === 'template') {\n <div class=\"arv-template-select\">\n <label class=\"arv-label\">Select Template</label>\n <select class=\"arv-select\" (change)=\"onTemplateChange($event)\">\n <option value=\"\">-- Select a template --</option>\n @for (t of templates(); track t.id) {\n <option [value]=\"t.id\" [selected]=\"t.id === selectedTemplateId()\">{{ t.name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Step pickers (shared for both locked and free template) -->\n @if (routingMode() === 'template') {\n <div class=\"arv-template-select\">\n @if (!loadingTemplate() && selectedTemplate()) {\n <!-- arv-template-steps -->\n <div class=\"arv-steps\">\n @for (s of selectedTemplate()!.steps; track s.stepOrder; let i = $index) {\n <div class=\"arv-step\">\n <div class=\"arv-step-card-header\">\n <span class=\"arv-step-preview-num\">Step {{ s.stepOrder }}</span>\n <span class=\"arv-step-preview-name\">{{ s.stepName }}</span>\n @if(isStepsError()[i]) {\n <span class=\"arv-step-error\">Required (*)</span>\n }\n @if (s.roles && s.roles.length > 0) {\n <span class=\"arv-step-role-badge\">\n @for (r of s.roles; track r.id) {\n {{ r.positionLevel }}{{ r.orgName ? ' · ' + r.orgName : '' }}{{ r !== s.roles[s.roles.length - 1] ? ', ' : '' }}\n } \n </span>\n }\n </div>\n <!-- Selectable step: show approver picker -->\n @if (stepCandidates()[i]?.length > 1 || stepLoadingCandidates()[i]) {\n @if (stepLoadingCandidates()[i]) {\n <div class=\"arv-template-loading\">Loading candidates...</div>\n }\n @if (!stepLoadingCandidates()[i]) {\n <div class=\"arv-approvers\">\n <div class=\"arv-approver-tags\">\n @if (stepSelectedUsers()[i]) {\n <span class=\"arv-tag\">\n <ma-ux [userId]=\"stepSelectedUsers()[i]\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n <button class=\"arv-tag-remove\" (click)=\"onStepUserChangeInput(i, '')\">x</button>\n </span>\n }\n </div>\n @if (!stepSelectedUsers()[i]) {\n <div class=\"arv-user-search arv-step-picker\">\n <input class=\"arv-input arv-input-sm\" [value]=\"candidateSearchQuery()[i] || ''\"\n (input)=\"onCandidateSearchInput(i, $any($event.target).value)\"\n (focus)=\"onCandidateSearchInput(i, candidateSearchQuery()[i] || '')\"\n (blur)=\"clearCandidateResults(i)\"\n placeholder=\"Search approver...\" />\n @if (candidateSearchResults()[i]?.length) {\n <div class=\"arv-search-results\">\n @for (u of candidateSearchResults()[i]; track u.userId) {\n <div class=\"arv-search-item\" (mousedown)=\"onStepUserChangeInput(i, u.userId)\">\n <ma-ux [userId]=\"u.userId\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n }\n <!-- Single fixed-user step: show who is assigned -->\n @if (!stepLoadingCandidates()[i] && stepCandidates()[i]?.length === 1) {\n <div class=\"arv-step-fixed\">\n <ma-ux [userId]=\"stepCandidates()[i][0].userId\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n @if (selectedTemplate() && selectedTemplate()!.referenceUserIds.length > 0) {\n <div class=\"arv-step-preview arv-step-preview-cc\">\n <span class=\"arv-step-preview-num\">CC</span>\n <span class=\"arv-step-preview-name\">{{ selectedTemplate()!.referenceUserIds.length }} reference user(s) from template</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Ad-hoc steps -->\n @if (routingMode() === 'adhoc') {\n <div class=\"arv-steps\">\n @for (step of adHocSteps(); track step.stepOrder; let i = $index) {\n <div class=\"arv-step\">\n <div class=\"arv-step-header\">\n <span class=\"arv-step-num\">Step {{ i + 1 }}</span>\n @if (isStepsError()[i]) {\n <span class=\"arv-step-error\">Required (*)</span>\n }\n <input class=\"arv-input\" [value]=\"step.stepName\" (input)=\"updateStepName(i, $any($event.target).value)\" placeholder=\"Step name\" />\n <button class=\"arv-btn-icon arv-btn-danger\" (click)=\"removeStep(i)\" title=\"Remove step\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n <div class=\"arv-approvers\">\n <div class=\"arv-approver-tags\">\n @for (uid of step.approverUserIds; track uid; let j = $index) {\n <span class=\"arv-tag\">\n <ma-ux [userId]=\"uid\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n <button class=\"arv-tag-remove\" (click)=\"removeApprover(i, j)\">x</button>\n </span>\n }\n </div>\n @if (step.approverUserIds.length === 0) {\n <div class=\"arv-user-search\">\n <input class=\"arv-input arv-input-sm\" [value]=\"userSearchQuery()[i] || ''\"\n (input)=\"onUserSearchInput(i, $any($event.target).value)\"\n placeholder=\"Search approver...\" />\n @if (userSearchResults()[i]?.length) {\n <div class=\"arv-search-results\">\n @for (u of userSearchResults()[i]; track u.id) {\n <div class=\"arv-search-item\" (mousedown)=\"addApprover(i, u.id)\">\n <ma-ux [userId]=\"u.id\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <button class=\"arv-btn arv-btn-outline\" (click)=\"addStep()\">+ Add Step</button>\n </div>\n }\n </div>\n\n <!-- Reference / CC users -->\n <div class=\"arv-references\">\n <h4 class=\"arv-section-title\">CC / Reference</h4>\n <p class=\"arv-hint\">These users will be notified when the approval completes, but won't be asked to approve.</p>\n <div class=\"arv-approver-tags\">\n @for (uid of referenceUserIds(); track uid; let j = $index) {\n <span class=\"arv-tag\">\n <ma-ux [userId]=\"uid\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n <button class=\"arv-tag-remove\" (click)=\"removeReference(j)\">x</button>\n </span>\n }\n </div>\n <div class=\"arv-user-search\">\n <input class=\"arv-input arv-input-sm\" [value]=\"refSearchQuery()\"\n (input)=\"onRefSearchInput($any($event.target).value)\"\n placeholder=\"Search CC user...\" />\n @if (refSearchResults().length) {\n <div class=\"arv-search-results\">\n @for (u of refSearchResults(); track u.id) {\n <div class=\"arv-search-item\" (mousedown)=\"addReference(u.id)\">\n <ma-ux [userId]=\"u.id\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"arv-actions\">\n <button class=\"arv-btn arv-btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"arv-btn arv-btn-primary\" [disabled]=\"submitting() || isError()\" (click)=\"submit()\">\n @if (submitting()) {\n <span class=\"arv-spinner\"></span>\n }\n {{isError() ? 'Complete Form to Submit' : submitting() ? 'Submitting...' : 'Submit for Approval' }}\n </button>\n </div>\n\n @if (errorMessage() || submitResultError()) {\n <div class=\"arv-error\">{{ errorMessage() || submitResultError() }}</div>\n }\n </div>\n }\n </div>\n\n <!-- Success state -->\n @if (isSubmitted()) {\n <div class=\"arv-success\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#66bb6a\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n <p>Submitted for approval successfully.</p>\n </div>\n }\n</div>\n","import { inject } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { withXMaPerm } from './x-ma-perm.pipe';\n\nexport interface RequestConfig {\n url: string;\n params?: HttpParams | Record<string, string | string[]>;\n}\n\nexport function xMaResource<T>(request: () => RequestConfig) {\n const http = inject(HttpClient);\n\n return rxResource({\n params: () => request(),\n stream: ({ params: { url, params } }) =>\n http\n .get<T>(url, { observe: 'response', params })\n .pipe(withXMaPerm()),\n });\n}","import { Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * MaIconComponent\n * Renders an SVG icon from the server-hosted sprite.\n * The sprite URL is derived from the stylesheet link injected by MesAuthService,\n * so changing the sprite on the server updates icons without a package rebuild.\n *\n * Selector: <ma-icon name=\"bell\" [size]=\"20\" />\n *\n * When the sprite is not available, falls back to inline SVG definitions\n * for the icons used internally by the library (bell, check, close, etc.).\n *\n * This component is intentionally lightweight — it is the single place where\n * icon SVG is defined, replacing the repeated inline <svg> blocks that were\n * scattered across every component template.\n */\n@Component({\n selector: 'ma-icon',\n template: `<span class=\"ma-icon\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [innerHTML]=\"svgContent()\"></span>`,\n styles: [`\n :host { display: inline-flex; align-items: center; justify-content: center; }\n .ma-icon { display: flex; align-items: center; justify-content: center; }\n .ma-icon svg { display: block; }\n `]\n})\nexport class MaIconComponent {\n name = input('');\n size = input(18);\n stroke = input('currentColor');\n strokeWidth = input(2);\n\n private sanitizer = inject(DomSanitizer);\n\n svgContent = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.buildSvg())\n );\n\n private buildSvg(): string {\n const w = this.size();\n const h = this.size();\n const s = this.stroke();\n const sw = this.strokeWidth();\n const base = `xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${s}\" stroke-width=\"${sw}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`;\n\n switch (this.name()) {\n case 'bell':\n return `<svg ${base}><path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/></svg>`;\n case 'check':\n return `<svg ${base}><polyline points=\"20 6 9 17 4 12\"/></svg>`;\n case 'check-circle':\n return `<svg ${base}><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22 4 12 14.01 9 11.01\"/></svg>`;\n case 'close':\n return `<svg ${base}><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\n case 'alert-triangle':\n return `<svg ${base}><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>`;\n case 'x-circle':\n return `<svg ${base}><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`;\n case 'clipboard-check':\n return `<svg ${base}><path d=\"M9 11l3 3L22 4\"/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/></svg>`;\n case 'trash':\n return `<svg ${base}><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/><path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/></svg>`;\n case 'user':\n return `<svg ${base}><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`;\n case 'log-out':\n return `<svg ${base}><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>`;\n default:\n return `<svg ${base}><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`;\n }\n }\n}\n","import { Directive, HostBinding, inject } from '@angular/core';\nimport { ThemeService } from './theme.service';\n\n/**\n * MaThemeDirective\n * Apply `maTheme` to any element or component that needs automatic theme-class binding.\n * Adds `theme-light` or `theme-dark` to the host element's class list and keeps it\n * in sync with ThemeService, replacing the duplicated @HostBinding + subscription\n * pattern that was repeated in every component.\n *\n * Usage:\n * <div maTheme> ... </div>\n *\n * Or as a hostDirective in a component:\n * @Component({ hostDirectives: [MaThemeDirective], ... })\n */\n@Directive({\n selector: '[maTheme]'\n})\nexport class MaThemeDirective {\n private themeService = inject(ThemeService);\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n}\n","export enum MaUserMenuColor {\n Default = 'default',\n Primary = 'primary',\n Success = 'success',\n Warning = 'warning',\n Danger = 'danger',\n Info = 'info',\n}\n","import { Component, booleanAttribute, input, output } from '@angular/core';\nimport { MaUserMenuColor } from './ma-user-menu-color';\n\n@Component({\n selector: 'ma-user-menu',\n templateUrl: './ma-user-menu.component.html',\n styleUrl: './ma-user-menu.component.css',\n})\nexport class MaUserMenuComponent {\n name = input.required<string>();\n color = input<MaUserMenuColor>(MaUserMenuColor.Default);\n disabled = input(false, { transform: booleanAttribute }); \n\n itemClick = output<void>();\n\n onClick() {\n if (this.disabled()) return;\n this.itemClick.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"ma-user-menu-btn\"\n [class]=\"'ma-user-menu--' + color()\"\n [disabled]=\"disabled()\"\n (click)=\"onClick()\">\n <span class=\"ma-user-menu-icon\">\n <ng-content select=\"[maUserMenuIcon]\"></ng-content>\n </span>\n <span class=\"ma-user-menu-name\">{{ name() }}</span>\n</button>\n","import { firstValueFrom } from 'rxjs';\nimport { MesAuthService } from './mes-auth.service';\n\n/**\n * Invoked by the /sso/check page component on init.\n *\n * Flow:\n * 1. Verify the page is inside an iframe (window !== window.parent).\n * 2. Fetch the list of allowed peer origins from the backend.\n * 3. If the opener's origin is in the allow-list, get a short-lived SSO token\n * from this host's /auth/sso-token endpoint (uses the current session cookie).\n * 4. postMessage the result back to the opener.\n *\n * If the user is not logged in, /auth/sso-token returns 401 → post { ok: false }.\n */\nexport async function runSsoCheckHandshake(authService: MesAuthService): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const parentOrigin = document.referrer\n ? new URL(document.referrer).origin\n : null;\n\n const postResult = (ok: boolean, token?: string) => {\n if (!parentOrigin) return;\n window.parent.postMessage(\n { type: 'sso-check-result', ok, ...(token ? { token } : {}) },\n parentOrigin\n );\n };\n\n // Ensure we're inside an iframe\n if (window === window.parent) {\n // Direct navigation — nothing to do\n return;\n }\n\n if (!parentOrigin) {\n postResult(false);\n return;\n }\n\n try {\n // Check if the parent origin is allowed\n const peers = await firstValueFrom(authService.getSsoAllowedPeers());\n const allowed = peers.some(p => p.peerOrigin === parentOrigin);\n if (!allowed) {\n postResult(false);\n return;\n }\n\n // Get a short-lived SSO exchange token from the local backend\n const { token } = await firstValueFrom(authService.getSsoToken());\n postResult(true, token);\n } catch {\n // User not logged in (401) or network error — not an SSO session\n postResult(false);\n }\n}\n\n/**\n * Invoked by the login page component after a successful local login.\n *\n * If the URL contains `return_via=postMessage&target_origin=<url>`, this function\n * posts the newly issued SSO token back to the opener window and closes this popup.\n *\n * @returns true if it handled the return-via flow (caller should NOT do normal navigation).\n */\nexport async function runReturnViaPostMessageIfRequested(authService: MesAuthService): Promise<boolean> {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const returnVia = params.get('return_via');\n const targetOrigin = params.get('target_origin');\n\n if (returnVia !== 'postMessage' || !targetOrigin) return false;\n\n try {\n const { token } = await firstValueFrom(authService.getSsoToken());\n window.opener?.postMessage(\n { type: 'sso-check-result', ok: true, token },\n targetOrigin\n );\n } catch {\n window.opener?.postMessage(\n { type: 'sso-check-result', ok: false },\n targetOrigin\n );\n }\n\n // Close the popup after a short delay so the postMessage can be dispatched\n setTimeout(() => window.close(), 300);\n return true;\n}\n","// mesauth-angular — primary entry point (backward compatible)\n// Re-exports everything so existing imports from 'mesauth-angular' continue to work.\n// Prefer importing from 'mesauth-angular/core' or 'mesauth-angular/ui' for\n// better tree-shaking and to express which layer you depend on.\n\nexport * from './mes-auth.service';\nexport * from './mes-auth.interceptor';\nexport * from './mes-auth.module';\nexport * from './user-profile.component';\nexport * from './ma-user.component';\nexport * from './ma-ux.component';\nexport * from './notification-badge.component';\nexport * from './notification-panel.component';\nexport * from './toast-container.component';\nexport * from './toast.service';\nexport * from './theme.service';\nexport * from './approval.models';\nexport * from './approval.service';\nexport * from './ma-arv-container.component';\nexport * from './ma-approval-panel.component';\nexport * from './x-ma-perm.pipe';\nexport * from './x-ma-resource';\nexport * from './ma-ui-config.service';\nexport * from './ma-icon.component';\nexport * from './ma-theme.directive';\nexport * from './ma-avatar.component';\nexport * from './ma-user-menu.component';\nexport * from './ma-user-menu-color';\nexport * from './sso-handshake.helper';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError","switchMap"],"mappings":"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"}
1
+ {"version":3,"file":"mesauth-angular.mjs","sources":["../../src/ma-ui-config.service.ts","../../src/x-ma-perm.pipe.ts","../../src/mes-auth.service.ts","../../src/mes-auth.interceptor.ts","../../src/mes-auth.module.ts","../../src/theme.service.ts","../../src/ma-avatar.component.ts","../../src/ma-avatar.component.html","../../src/ai/ma-ai-config.ts","../../src/ai/ma-ai-button.component.ts","../../src/user-profile.component.ts","../../src/user-profile.component.html","../../src/toast.service.ts","../../src/toast-container.component.ts","../../src/toast-container.component.html","../../src/notification-panel.component.ts","../../src/notification-panel.component.html","../../src/approval.service.ts","../../src/approval.models.ts","../../src/ma-approval-panel.component.ts","../../src/ma-approval-panel.component.html","../../src/ai/ma-ai-tools.registry.ts","../../src/ai/ma-ai.service.ts","../../src/ai/ma-ai-markdown.pipe.ts","../../src/ai/ma-ai-chat-panel.component.ts","../../src/ai/ma-ai-chat-panel.component.html","../../src/ma-user.component.ts","../../src/ma-user.component.html","../../src/ma-ux.component.ts","../../src/ma-ux.component.html","../../src/notification-badge.component.ts","../../src/notification-badge.component.html","../../src/ma-arv-container.component.ts","../../src/ma-arv-container.component.html","../../src/x-ma-resource.ts","../../src/ma-icon.component.ts","../../src/ma-theme.directive.ts","../../src/ma-user-menu-color.ts","../../src/ma-user-menu.component.ts","../../src/ma-user-menu.component.html","../../src/sso-handshake.helper.ts","../../src/ai/ma-ai.models.ts","../../src/ai/index.ts","../../src/index.ts","../../src/mesauth-angular.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, of } from 'rxjs';\n\nexport interface MaUiManifest {\n /** Version of the package that created this manifest. */\n version: string;\n /** Latest published package version — library logs a warning if installed version is older. */\n latestPackageVersion?: string;\n /** Set true to show an upgrade banner inside components. */\n updateRequired?: boolean;\n /** URL override for the theme CSS (defaults to themes/default.css relative to assetsUrl). */\n themeUrl?: string;\n /** URL override for the SVG icon sprite. */\n iconSpriteUrl?: string;\n /** UI string overrides — keys match component label identifiers. */\n labels?: Record<string, string>;\n /** Feature flags read by components at runtime. */\n features?: Record<string, boolean>;\n /** Suggested prompts shown in the AI panel empty state. Overrides the library default. */\n quickPrompts?: string[];\n}\n\n/** Current installed package version — keep in sync with package.json. */\nexport const PACKAGE_VERSION = '1.19.0';\n\n/**\n * Provides server-driven UI configuration loaded from the hosted manifest.\n * Components read `labels()` and `features()` signals instead of hardcoded strings.\n * Update manifest.json on the server to change labels or toggle features without\n * republishing the npm package.\n */\n@Injectable({ providedIn: 'root' })\nexport class MaUiConfigService {\n private _labels = signal<Record<string, string>>({});\n private _features = signal<Record<string, boolean>>({\n showApprovalPanel: true,\n showNotificationPanel: true\n });\n private _updateRequired = signal(false);\n private _manifestVersion = signal<string | null>(null);\n private _quickPrompts = signal<string[]>([]);\n\n /** Reactive map of UI string overrides from the server manifest. */\n readonly labels = this._labels.asReadonly();\n /** Reactive map of feature flags from the server manifest. */\n readonly features = this._features.asReadonly();\n /** True when the server signals that a package upgrade is needed. */\n readonly updateRequired = this._updateRequired.asReadonly();\n /** The manifest version string loaded from the server, or null if not yet loaded. */\n readonly manifestVersion = this._manifestVersion.asReadonly();\n /** AI panel \"quick prompts\" — populated from the manifest if provided, else empty. */\n readonly quickPrompts = this._quickPrompts.asReadonly();\n\n /**\n * Returns a label by key, falling back to `defaultValue` when the server\n * manifest has not provided an override.\n */\n label(key: string, defaultValue: string): string {\n return this._labels()[key] ?? defaultValue;\n }\n\n /**\n * Returns a feature flag by key, falling back to `defaultValue`.\n */\n feature(key: string, defaultValue = true): boolean {\n const val = this._features()[key];\n return val !== undefined ? val : defaultValue;\n }\n\n /**\n * Called by MesAuthService.init() — fetches the manifest and applies any\n * label/feature overrides. Failures are silently ignored so the library\n * works without a manifest endpoint.\n */\n loadManifest(assetsUrl: string, http: HttpClient): void {\n http.get<MaUiManifest>(`${assetsUrl}/manifest.json`).pipe(\n catchError(() => of(null))\n ).subscribe(manifest => {\n if (!manifest) return;\n\n if (manifest.labels) this._labels.set(manifest.labels);\n if (manifest.features) this._features.update(f => ({ ...f, ...manifest.features }));\n if (manifest.updateRequired) this._updateRequired.set(true);\n if (manifest.version) this._manifestVersion.set(manifest.version);\n if (manifest.quickPrompts) this._quickPrompts.set(manifest.quickPrompts);\n\n // Version-check: warn dev team when a newer package is available\n const latest = manifest.latestPackageVersion;\n if (latest && latest !== PACKAGE_VERSION) {\n console.warn(\n `[mesauth-angular] A newer version (${latest}) is available. ` +\n `Installed: ${PACKAGE_VERSION}. Please update the package.`\n );\n }\n });\n }\n}\n","import { HttpResponse } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\nimport { OperatorFunction } from 'rxjs';\n\nexport interface PermissionHeader {\n resource: string;\n allowedActions: string[];\n}\n// ─── Utility: extract allowedActions from x-ma-perm header ───\n \nexport const ALL_ACTIONS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'WEBSOCKET'] as const;\n\nexport function extractXMaPerm(response: HttpResponse<unknown>): string[] {\n const raw = response.headers.get('x-ma-perm');\n if (!raw) return [];\n \n try {\n const parsed = JSON.parse(raw) as PermissionHeader;\n const actions = parsed?.allowedActions ?? [];\n // Wildcard means all actions are allowed\n if (actions.includes('*')) return [...ALL_ACTIONS];\n return actions;\n } catch {\n return [];\n }\n}\n \n// ─── RxJS operator: pipe it on any HttpClient call ───\n \nexport function withXMaPerm<T>(): OperatorFunction<\n HttpResponse<T>,\n { data: T; allowedActions: string[] }\n> {\n return map((response: HttpResponse<T>) => ({\n data: response.body as T,\n allowedActions: extractXMaPerm(response),\n }));\n}","import { inject, Injectable, InjectionToken, EnvironmentProviders, makeEnvironmentProviders, provideAppInitializer, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { MaUiConfigService, PACKAGE_VERSION } from './ma-ui-config.service';\nimport { HttpClient } from '@angular/common/http';\nimport { HubConnection, HubConnectionBuilder, LogLevel } from '@microsoft/signalr';\nimport { Subject, Observable, of, EMPTY } from 'rxjs';\nimport { tap, catchError, map } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { withXMaPerm } from './x-ma-perm.pipe';\n\nexport interface MesAuthConfig {\n apiBaseUrl: string;\n withCredentials?: boolean;\n userBaseUrl?: string;\n /**\n * Base URL for hosted UI assets (CSS themes, icons, manifest).\n * Defaults to `{apiBaseUrl}/mesauth-angular/v1` when omitted.\n * Allows updating themes, icons, and labels without republishing the npm package.\n */\n uiAssetsUrl?: string;\n /**\n * Hostnames of backend services that run MesAuth.Authorizer middleware.\n * The interceptor will attach Bearer + X-Refresh-Token headers to requests\n * going to any of these hosts so the authorizer can silently refresh tokens.\n * Example: [\"mes.kefico.vn\", \"api.kefico.vn\"]\n */\n trustedHosts?: string[];\n /**\n * Called after a successful sign-in (login, externalLogin, or notifySignedIn).\n * Use this to persist tokens to localStorage or sessionStorage for cross-origin requests.\n */\n onSignedIn?: (accessToken: string, refreshToken?: string) => void;\n /**\n * Called during sign-out (before the logout HTTP request completes).\n * Use this to clear any persisted tokens from localStorage or sessionStorage.\n */\n onSigningOut?: () => void;\n}\n\n/** Injection token for MesAuth configuration */\nexport const MES_AUTH_CONFIG = new InjectionToken<MesAuthConfig>('MES_AUTH_CONFIG');\n\n/**\n * Provides MesAuth with configuration.\n * This is the recommended way to set up mesauth-angular in standalone apps.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(withInterceptors([mesAuthInterceptor])),\n * provideMesAuth({\n * apiBaseUrl: 'https://auth.example.com',\n * userBaseUrl: 'https://app.example.com'\n * })\n * ]\n * };\n * ```\n */\nexport function provideMesAuth(config: MesAuthConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MES_AUTH_CONFIG, useValue: config },\n MesAuthService,\n provideAppInitializer(() => {\n const mesAuthService = inject(MesAuthService);\n const httpClient = inject(HttpClient);\n const router = inject(Router);\n mesAuthService.init(config, httpClient, router);\n })\n ]);\n}\n\nexport interface IUser {\n id?: string;\n userId?: string;\n userName?: string;\n fullName?: string;\n gender?: string;\n email?: string;\n phoneNumber?: string;\n department?: string;\n position?: string;\n givenTitle?: string | null;\n givenColor?: string | null;\n tokenVersion?: string;\n permEndpoint?: string;\n perms?: Set<string>;\n employeeCode?: string;\n avatarPath?: string;\n avatarShape?: 'circle' | 'rounded' | 'rectangle' | 'portrait';\n avatarFrame?: string | null;\n avatarSize?: 'sm' | 'md' | 'lg';\n avatarRatio?: 'ar-11' | 'ar-43' | 'ar-169';\n avatarStyleAllowed?: boolean;\n loginMethod?: number;\n hrFullNameVn?: string;\n hrFullNameEn?: string;\n hrPosition?: string;\n hrJobTitle?: string;\n hrGender?: string;\n hrMobile?: string;\n hrEmail?: string;\n hrJoinDate?: string;\n hrBirthDate?: string;\n hrWorkStatus?: string;\n hrDoiTuong?: string;\n hrTeamCode?: string;\n hrLineCode?: string;\n}\n\nexport enum NotificationType {\n Info = 'Info',\n Warning = 'Warning',\n Error = 'Error',\n Success = 'Success'\n}\n\nexport interface NotificationDto {\n id: string;\n title: string;\n message: string;\n messageHtml?: string;\n url?: string;\n type: NotificationType;\n isRead: boolean;\n createdAt: string;\n sourceAppName: string;\n sourceAppIconUrl?: string;\n}\n\nexport interface FrontEndRoute {\n id: number;\n roleId: string;\n roleName: string;\n routePath: string;\n routeName: string;\n description?: string;\n icon?: string;\n cssClass?: string;\n parentId?: number | null;\n sortOrder: number;\n isLabel: boolean;\n isActive: boolean;\n createdAt: string;\n updatedAt?: string;\n children: FrontEndRoute[];\n}\n\nexport interface UserFrontEndRoutesGrouped {\n appId: string;\n appName: string;\n feUrl?: string;\n routes: FrontEndRoute[];\n}\n\nexport interface PagedList<T> {\n items: T[];\n totalCount: number;\n page: number;\n pageSize: number;\n totalPages: number;\n hasNext: boolean;\n hasPrevious: boolean;\n}\n\nexport interface RealTimeNotificationDto {\n id: string;\n title: string;\n message: string;\n messageHtml?: string;\n url?: string;\n type: NotificationType;\n createdAt: string;\n sourceAppName: string;\n sourceAppIconUrl?: string;\n}\n\n@Injectable()\nexport class MesAuthService {\n private hubConnection: HubConnection | null = null;\n private readonly _currentUser = signal<IUser | null>(null);\n /** Observable for components that prefer RxJS - backed by the signal. */\n public readonly currentUser$: Observable<IUser | null> = toObservable(this._currentUser);\n private readonly _notifications = new Subject<any>();\n public readonly notifications$: Observable<any> = this._notifications.asObservable();\n private readonly _approvalEvents = new Subject<any>();\n public readonly approvalEvents$: Observable<any> = this._approvalEvents.asObservable(); \n\n private apiBase = '';\n private config: MesAuthConfig | null = null;\n private http!: HttpClient;\n private router?: Router; \n\n constructor() {\n // Empty constructor - all dependencies passed to init()\n }\n\n /** _ngZone accepted but ignored - not needed in zoneless apps. */\n init(config: MesAuthConfig, httpClient: HttpClient, router?: Router, _ngZone?: unknown) {\n this.config = config;\n this.http = httpClient;\n this.router = router;\n this.apiBase = config.apiBaseUrl.replace(/\\/$/, '');\n\n // Server-hosted theme CSS and manifest are best-effort: if the MesAuth API is\n // unreachable the consumer app must keep working (unstyled library components\n // are acceptable). Any failure here is logged and swallowed so bootstrap\n // never fails because of a missing stylesheet or manifest.\n const assetsUrl = config.uiAssetsUrl || `${this.apiBase}/mesauth-angular/v1`;\n try {\n const uiConfig = inject(MaUiConfigService);\n this.injectThemeStylesheet(assetsUrl);\n uiConfig.loadManifest(assetsUrl, httpClient);\n // After manifest loads, refresh CSS URL if server version differs from package version.\n // This forces a re-fetch when default.css is updated on the server independently of the npm package.\n const manifestSub = toObservable(uiConfig.manifestVersion).subscribe({\n next: ver => {\n if (ver && ver !== PACKAGE_VERSION) {\n this.updateThemeStylesheetVersion(assetsUrl, ver);\n manifestSub.unsubscribe();\n }\n },\n error: err => console.warn('[mesauth-angular] manifest version stream failed:', err)\n });\n } catch (err) {\n console.warn('[mesauth-angular] hot UI asset loading skipped:', err);\n }\n\n // Fetch user once on init. Route changes do NOT re-fetch the user.\n // Auth state is maintained via cookies; 401 errors are handled by HTTP interceptors.\n // SignalR handles real-time notification delivery without polling.\n this.fetchCurrentUser().subscribe();\n }\n\n private injectThemeStylesheet(assetsUrl: string) {\n const id = 'ma-theme-css';\n if (typeof document === 'undefined' || document.getElementById(id)) return;\n try {\n const link = document.createElement('link');\n link.id = id;\n link.rel = 'stylesheet';\n link.href = `${assetsUrl}/themes/default.css?v=${PACKAGE_VERSION}`;\n // If the CSS cannot be fetched (server down, 404, CORS) detach the link so\n // the browser stops reporting it and the consumer app renders unstyled\n // library components instead of a broken one.\n link.onerror = () => {\n console.warn(`[mesauth-angular] theme stylesheet failed to load from ${link.href} — continuing without hosted theme`);\n link.remove();\n };\n document.head.appendChild(link);\n } catch (err) {\n console.warn('[mesauth-angular] could not inject theme stylesheet:', err);\n }\n }\n\n private updateThemeStylesheetVersion(assetsUrl: string, manifestVersion: string) {\n if (typeof document === 'undefined') return;\n try {\n const existing = document.getElementById('ma-theme-css') as HTMLLinkElement | null;\n if (existing) {\n existing.href = `${assetsUrl}/themes/default.css?v=${manifestVersion}`;\n return;\n }\n // Original link was removed by an earlier load failure — retry with the\n // server-reported version; it may now be reachable.\n this.injectThemeStylesheet(`${assetsUrl}`);\n const retry = document.getElementById('ma-theme-css') as HTMLLinkElement | null;\n if (retry) retry.href = `${assetsUrl}/themes/default.css?v=${manifestVersion}`;\n } catch (err) {\n console.warn('[mesauth-angular] could not update theme stylesheet version:', err);\n }\n }\n\n getConfig(): MesAuthConfig | null {\n return this.config;\n }\n\n private fetchCurrentUser(): Observable<any> {\n if (!this.apiBase) return EMPTY;\n const url = `${this.apiBase}/auth/me`;\n return this.http.get(url, { withCredentials: this.config?.withCredentials ?? true }).pipe(\n tap((u) => {\n this._currentUser.set(u as IUser);\n if (u && this.config) {\n this.startConnection(this.config);\n }\n }),\n catchError((err) => {\n // Silently handle auth errors (401/403) - user is not logged in\n if (err.status === 401 || err.status === 403) {\n this._currentUser.set(null);\n }\n return of(null);\n })\n );\n }\n\n public getUnreadCount(): Observable<any> {\n return this.http.get(`${this.apiBase}/notif/me/unread-count`, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public getNotifications(page: number = 1, pageSize: number = 20, includeRead: boolean = false, type?: string): Observable<any> {\n let url = `${this.apiBase}/notif/me?page=${page}&pageSize=${pageSize}&includeRead=${includeRead}`;\n if (type) {\n url += `&type=${type}`;\n }\n return this.http.get(url, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public markAsRead(notificationId: string): Observable<any> {\n return this.http.patch(`${this.apiBase}/notif/${notificationId}/read`, {}, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public markAllAsRead(): Observable<any> {\n return this.http.patch(`${this.apiBase}/notif/me/read-all`, {}, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n public deleteNotification(notificationId: string): Observable<any> {\n return this.http.delete(`${this.apiBase}/notif/${notificationId}`, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n /**\n * Get frontend routes assigned to the current user\n * Returns routes grouped by application\n */\n public getFrontEndRoutes(): Observable<UserFrontEndRoutesGrouped[]> {\n if (!this.apiBase) throw new Error('MesAuth not initialized');\n return this.http.get<UserFrontEndRoutesGrouped[]>(`${this.apiBase}/fe-routes/me`, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n private startConnection(config: MesAuthConfig) {\n if (this.hubConnection) return;\n const signalrUrl = config.apiBaseUrl.replace(/\\/$/, '') + '/hub/notification';\n const builder = new HubConnectionBuilder()\n .withUrl(signalrUrl, { withCredentials: config.withCredentials ?? true })\n .withAutomaticReconnect()\n .configureLogging(LogLevel.Warning);\n\n this.hubConnection = builder.build();\n\n // No NgZone.run() needed - signal mutations and toSignal() in consumers\n // schedule Angular change detection correctly in zoneless apps.\n this.hubConnection.on('ReceiveNotification', (n: any) => {\n this._notifications.next(n);\n });\n\n this.hubConnection.on('ApprovalCompleted', (e: any) => {\n this._approvalEvents.next({ type: 'ApprovalCompleted', ...e });\n });\n\n this.hubConnection.on('ApprovalStepChanged', (e: any) => {\n this._approvalEvents.next({ type: 'ApprovalStepChanged', ...e });\n });\n\n this.hubConnection.start().then(() => {}).catch((err) => {});\n\n this.hubConnection.onclose(() => {});\n this.hubConnection.onreconnecting(() => {});\n this.hubConnection.onreconnected(() => {});\n }\n\n public stop() {\n if (!this.hubConnection) return;\n this.hubConnection.stop().catch(() => {});\n this.hubConnection = null;\n }\n\n public logout(): Observable<any> {\n const url = `${this.apiBase}/auth/logout`;\n this.config?.onSigningOut?.();\n return this.http.post(url, {}, { withCredentials: this.config?.withCredentials ?? true }).pipe(\n tap(() => {\n this._currentUser.set(null);\n this.stop();\n })\n );\n }\n\n /**\n * Call this after a successful local login to trigger the `onSignedIn` lifecycle hook.\n * This allows the config's `onSignedIn` callback (e.g. localStorage persistence) to\n * run consistently for both normal login and external/SSO login flows.\n */\n public notifySignedIn(accessToken: string, refreshToken?: string): void {\n this.config?.onSignedIn?.(accessToken, refreshToken);\n }\n\n public get currentUser(): IUser | null {\n return this._currentUser();\n }\n\n public get isAuthenticated(): boolean {\n return this._currentUser() !== null;\n }\n\n /**\n * Refreshes the current user from the server.\n * Returns an Observable that completes when the user data is loaded.\n * Callers can subscribe to wait for completion before proceeding (e.g., navigating after login).\n */\n public refreshUser(): Observable<any> {\n return this.fetchCurrentUser();\n }\n\n public getAvatarStyle(): Observable<{data: string; allowedActions: string[]}> {\n const userId = this._currentUser()?.userId;\n if (!userId) throw new Error('Not authenticated');\n const url = `${this.apiBase}/auth/${userId}/avatar-style`;\n return this.http.get(\n url,\n { withCredentials: this.config?.withCredentials ?? true, observe: 'response' }\n ).pipe(\n withXMaPerm(), \n map((res) => ({ \n data: (res.data as string) ?? '', \n allowedActions: res.allowedActions \n }))\n );\n }\n\n\n public updateAvatarStyle(\n avatarShape: string | null,\n avatarFrame: string | null,\n avatarSize: string | null,\n avatarRatio: string | null\n ): Observable<{avatarShape: string | null; avatarFrame: string | null; avatarSize: string | null; avatarRatio: string | null }> {\n const userId = this._currentUser()?.userId;\n if (!userId) throw new Error('Not authenticated');\n const url = `${this.apiBase}/auth/${userId}/avatar-style`;\n return this.http.put<{ avatarShape: string | null; avatarFrame: string | null; avatarSize: string | null; avatarRatio: string | null }>(\n url,\n { avatarShape, avatarFrame, avatarSize, avatarRatio },\n { withCredentials: this.config?.withCredentials ?? true }\n ).pipe(\n tap((result) => {\n const cur = this._currentUser();\n if (cur) {\n this._currentUser.set({ ...cur, avatarShape: (result.avatarShape ?? undefined) as IUser['avatarShape'], avatarFrame: result.avatarFrame, avatarSize: (result.avatarSize ?? undefined) as IUser['avatarSize'], avatarRatio: (result.avatarRatio ?? undefined) as IUser['avatarRatio'] }); \n }\n })\n );\n }\n\n public getUserX(userId: string): Observable<IUser | null> {\n const url = `${this.apiBase}/urs/users/${userId}`;\n return this.http.get<IUser | null>(url, { withCredentials: this.config?.withCredentials ?? true });\n }\n\n // ── Federation / SSO ──────────────────────────────────────────────────\n\n /** POST a peer-issued JWT to the local /auth/external-login, returning local tokens. */\n public externalLogin(peerToken: string): Observable<{ accessToken: string; refreshToken: string }> {\n return this.http.post<{ accessToken: string; refreshToken: string }>(\n `${this.apiBase}/auth/external-login`,\n { token: peerToken },\n { withCredentials: this.config?.withCredentials ?? true }\n ).pipe(\n tap(res => this.config?.onSignedIn?.(res.accessToken, res.refreshToken))\n );\n }\n\n /** List active trusted issuers (public, no auth required). */\n public getTrustedIssuers(): Observable<{ issuer: string; origin: string; displayName: string; priority: number }[]> {\n return this.http.get<any[]>(`${this.apiBase}/external-issuers/public`);\n }\n\n /** List origins that are allowed to silent-SSO from this host (public, no auth required). */\n public getSsoAllowedPeers(): Observable<{ peerOrigin: string }[]> {\n return this.http.get<any[]>(`${this.apiBase}/sso/allowed-peers`);\n }\n\n /**\n * Get a short-lived SSO exchange token from this host (requires active session cookie).\n * Used by the /sso/check page before postMessaging the token to a peer's iframe.\n */\n public getSsoToken(): Observable<{ token: string }> {\n return this.http.get<{ token: string }>(\n `${this.apiBase}/auth/sso-token`,\n { withCredentials: this.config?.withCredentials ?? true }\n );\n }\n\n /**\n * Open a hidden iframe to `${issuerOrigin}/sso/check` and wait for a postMessage reply.\n * Returns the peer's short-lived SSO token, or null if the peer has no active session\n * or does not respond within `timeoutMs` milliseconds.\n */\n public trySilentSsoFromPeer(issuerOrigin: string, timeoutMs = 4000): Promise<string | null> {\n return new Promise(resolve => {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n resolve(null);\n return;\n }\n\n const iframe = document.createElement('iframe');\n iframe.src = `${issuerOrigin}/sso/check`;\n iframe.style.cssText = 'display:none;width:0;height:0;border:0;position:absolute;';\n document.body.appendChild(iframe);\n\n let settled = false;\n const cleanup = (token: string | null) => {\n if (settled) return;\n settled = true;\n window.removeEventListener('message', handler);\n clearTimeout(timer);\n try { document.body.removeChild(iframe); } catch { /* already removed */ }\n resolve(token);\n };\n\n const handler = (event: MessageEvent) => {\n // Pin origin to prevent cross-origin spoofing\n if (event.origin !== issuerOrigin) return;\n const data = event.data as { type?: string; ok?: boolean; token?: string };\n if (data?.type !== 'sso-check-result') return;\n cleanup(data.ok && data.token ? data.token : null);\n };\n\n window.addEventListener('message', handler);\n const timer = setTimeout(() => cleanup(null), timeoutMs);\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { throwError, timer } from 'rxjs';\nimport { catchError, switchMap, tap } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { MesAuthService } from './mes-auth.service';\n\n// Track if we're currently redirecting to prevent loopback\nlet isRedirecting = false;\n\ninterface PermissionHeader {\n resource: string;\n allowedActions: string[];\n}\n/**\n * Functional HTTP interceptor for handling 401/403 auth errors.\n * Redirects to login page on 401, and to 403 page on 403.\n * Includes loopback prevention to avoid infinite redirects.\n */\nexport const mesAuthInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(MesAuthService);\n const router = inject(Router);\n\n // Attach access + refresh tokens from localStorage to requests going to the auth server\n // or any backend host running MesAuth.Authorizer (trustedHosts). This lets the authorizer\n // middleware silently refresh tokens and emit X-Refreshed-Token response headers.\n // Relative URLs are always considered trusted (same origin).\n const config = authService.getConfig();\n const apiBase = config?.apiBaseUrl ?? '';\n const trustedHosts = config?.trustedHosts ?? [];\n\n function isTrusted(url: string): boolean {\n if (apiBase && url.startsWith(apiBase)) return true;\n try {\n return trustedHosts.includes(new URL(url).hostname);\n } catch {\n return true; // relative URL — same origin\n }\n }\n\n let authReq = req;\n if (typeof localStorage !== 'undefined' && isTrusted(req.url)) {\n let headers = req.headers;\n if (!headers.has('Authorization')) {\n const accessToken = localStorage.getItem('mes_auth_token');\n if (accessToken) headers = headers.set('Authorization', `Bearer ${accessToken}`);\n }\n if (!headers.has('X-Refresh-Token')) {\n const refreshToken = localStorage.getItem('mes_refresh_token');\n if (refreshToken) headers = headers.set('X-Refresh-Token', refreshToken);\n }\n if (headers !== req.headers) authReq = req.clone({ headers });\n }\n\n return next(authReq).pipe(\n tap(event => {\n if (event instanceof HttpResponse) {\n const newAccessToken = event.headers.get('X-Refreshed-Token');\n if (newAccessToken) {\n const newRefreshToken = event.headers.get('X-Refreshed-Refresh-Token') ?? undefined;\n authService.notifySignedIn(newAccessToken, newRefreshToken);\n }\n }\n }),\n catchError((error: HttpErrorResponse) => {\n const status = error.status;\n\n // Check if we should handle this error and prevent loopback\n if ((status === 401 || status === 403) && !isRedirecting) {\n const config = authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n\n const currentUrl = router.url + (window.location.hash || '');\n const returnUrl = encodeURIComponent(currentUrl);\n\n // Avoid loops if already on auth/unauth pages\n const isLoginPage = currentUrl.includes('/login');\n const is403Page = currentUrl.includes('/403');\n const isAuthPage = currentUrl.includes('/auth');\n // Public pages that should never trigger a 401 redirect (e.g., register, password reset)\n const isPublicPage = currentUrl.includes('/register')\n || currentUrl.includes('/forgot-password')\n || currentUrl.includes('/reset-password');\n // Skip redirect for the initial /auth/me check (app startup when not logged in)\n const isMeAuthPage = req.url.includes('/auth/me');\n\n if (status === 401 && !isLoginPage && !isAuthPage && !isMeAuthPage && !isPublicPage) {\n // Wait 1.5s for the concurrent refresh's Set-Cookie to be processed, then retry once.\n // If retry also gets 401, redirect to login.\n return timer(1500).pipe(\n switchMap(() => next(req)),\n catchError((retryError: HttpErrorResponse) => {\n if (retryError.status === 401) {\n isRedirecting = true;\n setTimeout(() => { isRedirecting = false; }, 5000);\n window.location.href = `${baseUrl}/login?returnUrl=${returnUrl}`;\n }\n return throwError(() => retryError);\n })\n );\n } else if (status === 403 && !is403Page) {\n isRedirecting = true;\n setTimeout(() => { isRedirecting = false; }, 5000);\n let redirectUrl = `${baseUrl}/403?returnUrl=${returnUrl}`;\n if (error.error && error.error.required) {\n redirectUrl += `&required=${encodeURIComponent(error.error.required)}`;\n }\n window.location.href = redirectUrl;\n }\n }\n return throwError(() => error);\n })\n );\n};\n\n\nfunction appendPermissions(body: unknown, allowedActions: string[]): unknown {\n if (body === null || body === undefined) {\n return { 'x-ma-perms': allowedActions };\n }\n\n if (Array.isArray(body)) {\n return { data: body, 'x-ma-perms': allowedActions };\n }\n\n if (typeof body === 'object') {\n return { ...(body as object), 'x-ma-perms': allowedActions };\n }\n\n // Primitive (string, number, boolean)\n return { data: body, 'x-ma-perms': allowedActions };\n}","import { NgModule } from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\n\n@NgModule({\n providers: [\n MesAuthService\n ]\n})\nexport class MesAuthModule {}\n","import { afterNextRender, Injectable, OnDestroy, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\nexport type Theme = 'light' | 'dark';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService implements OnDestroy {\n private readonly _currentTheme = signal<Theme>('light');\n readonly currentTheme = this._currentTheme.asReadonly();\n /** Observable kept for backward compatibility */\n readonly currentTheme$: Observable<Theme> = toObservable(this._currentTheme);\n\n private observer: MutationObserver | null = null;\n private _settedTheme = signal<Theme | null>(null); \n\n constructor() {\n afterNextRender(() => { // ✅ guarantees DOM is ready\n this.detectTheme();\n this.startWatching();\n });\n // this.detectTheme();\n // this.startWatching();\n }\n\n ngOnDestroy(): void {\n this.stopWatching();\n }\n\n private detectTheme(): void {\n const fixed = this._settedTheme();\n if (fixed !== null) {\n this._currentTheme.set(fixed);\n return;\n }\n const html = document.documentElement;\n const body = document.body;\n const isDark = html.classList.contains('dark') ||\n html.getAttribute('data-theme') === 'dark' ||\n html.getAttribute('theme') === 'dark' ||\n html.getAttribute('data-coreui-theme') === 'dark' ||\n body.classList.contains('dark') ||\n body.getAttribute('data-theme') === 'dark' ||\n body.getAttribute('theme') === 'dark' ||\n body.getAttribute('data-coreui-theme') === 'dark';\n this._currentTheme.set(isDark ? 'dark' : 'light');\n }\n\n private startWatching(): void {\n if (typeof MutationObserver === 'undefined') {\n setInterval(() => this.detectTheme(), 1000);\n return;\n }\n const config = {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'theme', 'data-coreui-theme']\n };\n\n this.observer = new MutationObserver(() => this.detectTheme());\n this.observer.observe(document.documentElement, config);\n this.observer.observe(document.body, config); \n }\n\n private stopWatching(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n }\n\n get currentThemeValue(): Theme {\n return this._currentTheme();\n }\n\n setTheme(theme: Theme): void {\n this._currentTheme.set(theme);\n }\n\n setFixTheme(theme: Theme): void { \n this._settedTheme.set(theme);\n this._currentTheme.set(theme);\n }\n\n refreshTheme(): void {\n this.detectTheme();\n }\n}\n","import { Component, booleanAttribute, computed, HostBinding, inject, input } from '@angular/core';\nimport { ThemeService } from './theme.service';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\nexport type AvatarShape = 'circle' | 'rounded' | 'rectangle' | 'portrait';\n\nexport interface AvatarFrameDef {\n id: string;\n label: string;\n}\n\nexport const AVATAR_FRAMES: ReadonlyArray<AvatarFrameDef> = [\n { id: 'none', label: 'None' },\n { id: 'gold-ring', label: 'Gold Ring' },\n { id: 'neon-glow', label: 'Neon Glow' },\n { id: 'dashed', label: 'Dashed' },\n { id: 'double-border', label: 'Double Border' },\n { id: 'gradient-ring', label: 'Gradient Ring' },\n { id: 'notched', label: 'Notched' },\n];\n\n@Component({\n selector: 'ma-avatar',\n imports: [],\n templateUrl: './ma-avatar.component.html',\n styleUrl: './ma-avatar.component.css'\n})\nexport class MaAvatarComponent {\n src = input<string>('');\n alt = input<string>('');\n initials = input<string>('');\n size = input<AvatarSize>('md');\n shape = input<AvatarShape>('circle');\n frame = input<string | null>(null);\n ratio = input<string | null>(null);\n scale = input<number>(1);\n ring = input(false, { transform: booleanAttribute });\n ringActive = input(false, { transform: booleanAttribute });\n\n private themeService = inject(ThemeService);\n @HostBinding('class') get themeClass(): string { return `theme-${this.themeService.currentTheme()}`; }\n\n readonly wrapperClass = computed(() => {\n const f = this.frame() && this.frame() !== 'none' ? `ma-avatar--frame-${this.frame()}` : '';\n const r = this.ratio() ? `ma-avatar--ratio-${this.ratio()}` : '';\n return [\n 'ma-avatar',\n `ma-avatar--${this.shape()}`,\n `ma-avatar--${this.size()}`,\n f,\n r,\n this.ring() ? 'ma-avatar--ring' : '',\n this.ringActive() ? 'ma-avatar--ring-active' : '',\n ].filter(Boolean).join(' ');\n });\n\n readonly wrapperStyle = computed(() => ({\n '--avatar-scale': this.scale()\n }));\n\n readonly showImage = computed(() => !!this.src());\n}\n","<div [class]=\"wrapperClass()\" [style]=\"wrapperStyle()\">\n @if (showImage()) {\n <img [src]=\"src()\" [alt]=\"alt()\" class=\"ma-avatar__img\" />\n } @else {\n <span class=\"ma-avatar__initial\">{{ initials() }}</span>\n }\n</div>\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { ClientTool } from './ma-ai.models';\n\nexport interface MesAuthAiConfig {\n /** Master switch — when false the Ask-AI button hides and the panel never opens. */\n enabled?: boolean;\n /**\n * Extra client-side tools the AI can invoke. The handler runs in the browser.\n * The library always exposes a set of built-in client tools (navigate, toggle theme, etc.)\n * — these are merged in addition.\n */\n tools?: ClientTool[];\n /**\n * Optional extra paragraphs appended to the backend system prompt for this app.\n * Use to tell the AI what domain the consumer app handles (e.g. \"You are inside the SPC app\").\n */\n systemPromptExtensions?: string[];\n /**\n * Optional friendly name of the host app; sent to the backend each turn.\n */\n appName?: string;\n}\n\nexport const MES_AUTH_AI_CONFIG = new InjectionToken<MesAuthAiConfig>('MES_AUTH_AI_CONFIG');\n\n/** Default configuration when the consumer doesn't call provideMesAuthAi(). */\nexport const DEFAULT_AI_CONFIG: MesAuthAiConfig = {\n enabled: true,\n tools: [],\n systemPromptExtensions: [],\n appName: undefined\n};\n\n/**\n * Provide AI assistant configuration to mesauth-angular.\n *\n * @example\n * ```ts\n * providers: [\n * provideMesAuth(...),\n * provideMesAuthAi({\n * enabled: true,\n * appName: 'MesExtensionSite',\n * tools: [\n * {\n * name: 'spc_open_chart',\n * description: 'Open the SPC chart for a given product line',\n * parameters: {\n * type: 'object',\n * properties: { lineId: { type: 'string' } },\n * required: ['lineId']\n * },\n * readOnly: true,\n * handler: (args) => inject(Router).navigateByUrl(`/spc/${args.lineId}`)\n * }\n * ]\n * })\n * ]\n * ```\n */\nexport function provideMesAuthAi(config: MesAuthAiConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MES_AUTH_AI_CONFIG, useValue: { ...DEFAULT_AI_CONFIG, ...config } }\n ]);\n}\n","import { Component, computed, inject, output } from '@angular/core';\nimport { MES_AUTH_AI_CONFIG, DEFAULT_AI_CONFIG } from './ma-ai-config';\n\n@Component({\n selector: 'ma-ai-button',\n template: `\n @if (enabled()) {\n <button class=\"ai-btn\" (click)=\"clicked.emit()\" title=\"Ask AI\" aria-label=\"Ask AI\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 2 L13.5 7.5 L19 9 L13.5 10.5 L12 16 L10.5 10.5 L5 9 L10.5 7.5 Z\"/>\n <path d=\"M19 16 L19.8 18.2 L22 19 L19.8 19.8 L19 22 L18.2 19.8 L16 19 L18.2 18.2 Z\"/>\n </svg>\n </button>\n }\n `,\n styles: [`\n :host { display: inline-flex; }\n .ai-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--cui-body-color, #6e6e9a);\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s, color 0.15s;\n }\n .ai-btn:hover {\n background: var(--cui-tertiary-bg, rgba(120,120,200,0.12));\n color: #7c3aed;\n }\n `]\n})\nexport class MaAiButtonComponent {\n private readonly config = inject(MES_AUTH_AI_CONFIG, { optional: true }) ?? DEFAULT_AI_CONFIG;\n readonly enabled = computed(() => this.config.enabled !== false);\n clicked = output<void>();\n}\n","import { Component, HostBinding, HostListener, inject, output, signal, effect, computed, input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport { MesAuthService, IUser } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { MaAvatarComponent, AvatarSize } from './ma-avatar.component';\nimport { MaAiButtonComponent } from './ai/ma-ai-button.component';\n\n@Component({\n selector: 'ma-user-profile',\n imports: [MaAvatarComponent, MaAiButtonComponent],\n templateUrl: './user-profile.component.html',\n styleUrl: './user-profile.component.css'\n})\nexport class UserProfileComponent { \n inputAvatarShape = input<'rectangle' | 'circle' | 'rounded'>('circle'); \n showBell = input(true);\n showApproval = input(true); \n showName = input(false);\n showAi = input(true);\n showSignature = input<boolean[]>([false, false]);\n signatureHeight = input<number>(40);\n notificationClick = output<void>();\n approvalClick = output<void>();\n aiClick = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly currentUser = signal<IUser | null>(null);\n readonly unreadCount = signal(0);\n readonly pendingApprovalCount = signal(0);\n readonly dropdownOpen = signal(false);\n readonly avatarRefresh = signal<number>(Date.now());\n \n\n // Avatar style derived from per-user preferences\n readonly navAvatarSize = computed<AvatarSize>(() => (this.currentUser()?.avatarSize as AvatarSize) ?? 'md');\n // Dropdown is always one step larger than the nav avatar\n readonly dropAvatarSize = computed<AvatarSize>(() => {\n const s = this.navAvatarSize();\n return s === 'sm' ? 'md' : s === 'md' ? 'lg' : 'xl';\n });\n readonly avatarShape = computed(() => this.currentUser()?.avatarShape ?? this.inputAvatarShape());\n readonly avatarFrame = computed(() => this.currentUser()?.avatarFrame ?? null);\n readonly avatarRatio = computed(() => this.currentUser()?.avatarRatio ?? 'ar-11');\n\n readonly givenStyle = computed(() => this.currentUser()?.givenColor || 'indigo'); \n\n readonly signatureBroken = signal<boolean>(false);\n readonly signatureUrl = computed(() => {\n if (!this.showSignature().some(s => s) || this.signatureBroken()) return null;\n const baseRaw = this.authService.getConfig()?.apiBaseUrl ?? '';\n const base = baseRaw.replace(/\\/$/, '');\n \n const u = this.currentUser();\n const id = u?.userId ?? u?.id;\n if (!id || !base) return null;\n return `${base}/auth/${id}/signature`; \n })\n\n private readonly authService = inject(MesAuthService);\n private readonly router = inject(Router);\n private readonly themeService = inject(ThemeService);\n private readonly http = inject(HttpClient);\n\n constructor() {\n const currentUserSig = toSignal(this.authService.currentUser$, { initialValue: null });\n const approvalEvent = toSignal(this.authService.approvalEvents$);\n const notification = toSignal(this.authService.notifications$);\n\n effect(() => {\n const user = currentUserSig();\n this.currentUser.set(user);\n this.avatarRefresh.set(Date.now());\n if (!user) {\n this.unreadCount.set(0);\n this.pendingApprovalCount.set(0);\n return;\n }\n this.loadUnreadCount();\n this.loadPendingApprovalCount();\n });\n\n effect(() => {\n approvalEvent(); // track SignalR approval events\n if (currentUserSig()) this.loadPendingApprovalCount();\n });\n\n effect(() => {\n notification(); // track SignalR notification events\n if (currentUserSig()) this.loadUnreadCount();\n });\n }\n\n loadUnreadCount() {\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => this.unreadCount.set(response.unreadCount || 0),\n error: () => {}\n });\n }\n\n loadPendingApprovalCount() {\n const config = this.authService.getConfig();\n if (!config) return;\n const url = `${config.apiBaseUrl.replace(/\\/$/, '')}/approval/dashboard`;\n this.http.get(url, { withCredentials: config.withCredentials ?? true }).subscribe({\n next: (r: any) => this.pendingApprovalCount.set(r?.pendingCount ?? 0),\n error: () => {}\n });\n }\n\n onApprovalClick() {\n this.approvalClick.emit();\n }\n\n onAiClick() {\n this.aiClick.emit();\n }\n\n getAvatarUrl(user: IUser): string {\n // Use the refresh signal to force update\n const refresh = this.avatarRefresh();\n const config = this.authService.getConfig();\n const baseUrl = config?.apiBaseUrl || '';\n\n if (user.avatarPath) {\n if (user.avatarPath.startsWith('http://') || user.avatarPath.startsWith('https://')) {\n return user.avatarPath;\n }\n return `${baseUrl.replace(/\\/$/, '')}${user.avatarPath}?t=${refresh}`;\n }\n\n const userId = user.userId;\n if (userId && baseUrl) {\n return `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatar?t=${refresh}`;\n }\n\n const displayName = user.userName || user.userId || 'User';\n return `https://ui-avatars.com/api/?name=${encodeURIComponent(displayName)}&background=1976d2&color=fff`;\n }\n\n getLastNameInitial(user: IUser): string {\n const fullName = user.fullName || user.userName || 'U';\n const parts = fullName.split(' ');\n const lastPart = parts[parts.length - 1];\n return lastPart.charAt(0).toUpperCase();\n }\n\n toggleDropdown() {\n this.dropdownOpen.set(!this.dropdownOpen());\n }\n\n closeDropdown() {\n this.dropdownOpen.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event) {\n const target = event.target as HTMLElement;\n const clickedInside = target.closest('.user-menu-wrapper');\n if (!clickedInside) {\n this.dropdownOpen.set(false);\n return;\n }\n if (target.closest('.ma-user-menu-btn')) {\n this.dropdownOpen.set(false);\n }\n }\n\n onLogin() {\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n const returnUrl = encodeURIComponent(this.router.url);\n window.location.href = `${baseUrl}/login?returnUrl=${returnUrl}`;\n }\n\n onViewProfile() {\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n const currentUrl = window.location.href;\n \n this.openInNewTabIfSameOrigin(currentUrl, `${baseUrl}/profile`);\n this.dropdownOpen.set(false);\n }\n\n private openInNewTabIfSameOrigin(currentUrl: string, destinationUrl: string) {\n // Check if current page URL starts with the destination URL\n if (!destinationUrl.startsWith(currentUrl)) {\n window.open(destinationUrl, \"_blank\", \"noopener,noreferrer\");\n \n } else { \n // Optional: redirect in same tab\n window.location.href = destinationUrl;\n }\n}\n\n onLogout() {\n this.authService.logout().subscribe({\n next: () => {\n this.dropdownOpen.set(false);\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n const returnUrl = encodeURIComponent(window.location.href);\n window.location.href = `${baseUrl}/login?returnUrl=${returnUrl}`;\n },\n error: () => {\n const config = this.authService.getConfig();\n const baseUrl = config?.userBaseUrl || '';\n window.location.href = `${baseUrl}/login`;\n }\n });\n }\n\n onNotificationClick() {\n this.notificationClick.emit();\n }\n\n onSigErr(_ev: Event): void {\n this.signatureBroken.set(true);\n }\n}\n","<div class=\"user-profile-container\">\n @if (!currentUser()) {\n <!-- Not logged in -->\n <button class=\"login-btn\" (click)=\"onLogin()\">Login</button>\n } @else {\n <!-- Logged in -->\n <div class=\"user-header\">\n <!-- Ask AI -->\n @if (showAi()) {\n <ma-ai-button (clicked)=\"onAiClick()\"></ma-ai-button>\n }\n\n <!-- Notification Bell -->\n @if (showBell()) {\n <button class=\"notification-btn\" [class.has-unread]=\"unreadCount() > 0\" (click)=\"onNotificationClick()\" title=\"Notifications\" aria-label=\"Notifications\">\n <svg class=\"bell-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n @if (unreadCount() > 0) {\n <span class=\"badge\">{{ unreadCount() > 99 ? '99+' : unreadCount() }}</span>\n }\n </button>\n }\n \n\n <!-- Approval Button -->\n @if (showApproval()) {\n <button class=\"notification-btn\" [class.has-unread]=\"pendingApprovalCount() > 0\" (click)=\"onApprovalClick()\" title=\"Approvals\" aria-label=\"Approvals\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 11l3 3L22 4\"/>\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/>\n </svg>\n @if (pendingApprovalCount() > 0) {\n <span class=\"badge\">{{ pendingApprovalCount() > 99 ? '99+' : pendingApprovalCount() }}</span>\n }\n </button>\n } \n\n <!-- User Avatar + Dropdown -->\n <div class=\"user-menu-wrapper\">\n <button class=\"user-menu-btn\" (click)=\"toggleDropdown()\" [attr.aria-label]=\"'User menu for ' + (currentUser().fullName || currentUser().userName)\" aria-haspopup=\"true\" [attr.aria-expanded]=\"dropdownOpen()\">\n <ma-avatar\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName || ''\"\n [initials]=\"getLastNameInitial(currentUser())\"\n [size]=\"navAvatarSize()\"\n [shape]=\"avatarShape()\"\n [ratio]=\"avatarRatio()\"\n [frame]=\"avatarFrame()\" \n [ring]=\"true\"\n [ringActive]=\"dropdownOpen()\" /> \n </button>\n\n @if (dropdownOpen()) {\n <div class=\"mes-dropdown-menu\">\n <!-- User info header -->\n <div class=\"mes-dropdown-header\">\n <div class=\"dropdown-avatar-wrap\">\n <ma-avatar\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName || ''\"\n [initials]=\"getLastNameInitial(currentUser())\"\n [size]=\"dropAvatarSize()\"\n [shape]=\"avatarShape()\"\n [ratio]=\"avatarRatio()\"\n [frame]=\"avatarFrame()\"\n [scale]=\"1.5\" /> \n </div> \n <div class=\"dropdown-info-col\">\n <div class=\"dropdown-user-info\">\n <span class=\"dropdown-user-name\">{{ currentUser().fullName || currentUser().userName }}</span> \n <span class=\"dropdown-user-sub\">\n @if (currentUser().position || currentUser().department) {\n {{ currentUser().position || currentUser().department }} \n }\n @if (currentUser().givenTitle) {\n <span class=\"given-title-badge given-title\"\n [class]=\"'given-color-' + givenStyle()\">{{ currentUser().givenTitle }}</span>\n }\n </span>\n </div>\n <div class=\"dropdown-user-actions\">\n @if (showSignature()[1] && signatureUrl(); as sigUrl) {\n <img class=\"ma-ux-signature\"\n [src]=\"sigUrl\"\n [style.height.px]=\"signatureHeight()\"\n (error)=\"onSigErr($event)\"\n alt=\"signature\" />\n }\n <button class=\"icon-action profile-link\" (click)=\"onViewProfile()\" title=\"View Profile\" aria-label=\"View Profile\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </button>\n <button class=\"icon-action logout-item\" (click)=\"onLogout()\" title=\"Logout\" aria-label=\"Logout\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mes-dropdown-items\">\n <ng-content></ng-content>\n </div>\n </div>\n }\n </div>\n\n @if (showName()){\n <div class=\"mes-user-header\">\n {{currentUser().fullName || currentUser().userName}}\n </div>\n }\n @if (showSignature()[0] && signatureUrl(); as sigUrl) {\n <img class=\"ma-ux-signature\"\n [src]=\"sigUrl\"\n [style.height.px]=\"signatureHeight()\"\n (error)=\"onSigErr($event)\"\n alt=\"signature\" />\n }\n </div>\n }\n</div>\n","import { Injectable, signal } from '@angular/core';\n\nexport interface Toast {\n id: string;\n message: string;\n title?: string;\n type: 'info' | 'success' | 'warning' | 'error';\n duration?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private readonly _toasts = signal<Toast[]>([]);\n readonly toasts = this._toasts.asReadonly();\n\n show(message: string, title?: string, type: 'info' | 'success' | 'warning' | 'error' = 'info', duration: number = 5000) {\n const id = Math.random().toString(36).substr(2, 9);\n const toast: Toast = { id, message, title, type, duration };\n this._toasts.update(t => [...t, toast]);\n\n if (duration > 0) {\n setTimeout(() => this.remove(id), duration);\n }\n\n return id;\n }\n\n remove(id: string) {\n this._toasts.update(t => t.filter(toast => toast.id !== id));\n }\n\n clear() {\n this._toasts.set([]);\n }\n}\n","import { Component, HostBinding, inject } from '@angular/core';\nimport { ToastService } from './toast.service';\nimport { ThemeService } from './theme.service';\n\n@Component({\n selector: 'ma-toast-container',\n imports: [],\n templateUrl: './toast-container.component.html',\n styleUrl: './toast-container.component.css'\n})\nexport class ToastContainerComponent {\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n private readonly toastService = inject(ToastService);\n private readonly themeService = inject(ThemeService);\n\n protected readonly toasts = this.toastService.toasts;\n\n close(id: string) {\n this.toastService.remove(id);\n }\n}\n","<div class=\"toast-container\">\n @for (toast of toasts(); track toast.id) {\n <div class=\"toast toast-{{ toast.type }}\">\n\n <!-- Type icon -->\n <div class=\"toast-icon\">\n @if (toast.type === 'info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n }\n @if (toast.type === 'success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n @if (toast.type === 'warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n }\n @if (toast.type === 'error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n </div>\n\n <!-- Content -->\n <div class=\"toast-content\">\n @if (toast.title) {\n <div class=\"toast-title\">{{ toast.title }}</div>\n }\n <div class=\"toast-message\" [innerHTML]=\"toast.message\"></div>\n </div>\n\n <!-- Close -->\n <button class=\"toast-close\" (click)=\"close(toast.id)\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n\n <!-- Auto-dismiss progress bar — hidden when duration <= 0 (persistent toast) -->\n @if (toast.duration == null || toast.duration > 0) {\n <div class=\"toast-progress\" [style.animation-duration]=\"(toast.duration ?? 5000) + 'ms'\"></div>\n }\n </div>\n }\n</div>\n","import { Component, HostBinding, inject, output, signal, computed, effect } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MesAuthService, NotificationDto, PagedList, RealTimeNotificationDto } from './mes-auth.service';\nimport { ToastService } from './toast.service';\nimport { ThemeService } from './theme.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n selector: 'ma-notification-panel',\n imports: [],\n templateUrl: './notification-panel.component.html',\n styleUrls: ['./panel-shared.css', './notification-panel.component.css'],\n})\nexport class NotificationPanelComponent {\n notificationRead = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly isOpen = signal(false);\n readonly activeTab = signal<'unread' | 'read'>('unread');\n readonly notifications = signal<NotificationDto[]>([]);\n readonly selectedNotification = signal<NotificationDto | null>(null);\n readonly selectedNotificationHtml = signal<SafeHtml | null>(null);\n readonly selectedNotificationDate = signal('');\n // Stable time-ago strings keyed by notification id - refreshed every 30s via signal\n readonly dateLabels = signal<Map<string, string>>(new Map());\n\n readonly unreadNotifications = computed(() => this.notifications().filter(n => !n.isRead));\n readonly readNotifications = computed(() => this.notifications().filter(n => n.isRead));\n readonly currentNotifications = computed(() =>\n this.activeTab() === 'unread' ? this.unreadNotifications() : this.readNotifications()\n );\n\n private dateTimer: ReturnType<typeof setInterval> | null = null;\n\n // Normalize type to string - API may return integer or string\n // Backend enum: Info=0, Success=1, Warning=2, Error=3\n typeOf(notification: { type: any }): 'Info' | 'Success' | 'Warning' | 'Error' {\n const t = notification.type;\n if (t === 0 || t === 'Info') return 'Info';\n if (t === 1 || t === 'Success') return 'Success';\n if (t === 2 || t === 'Warning') return 'Warning';\n if (t === 3 || t === 'Error') return 'Error';\n return 'Info';\n }\n\n private toastType(type: any): 'info' | 'warning' | 'error' | 'success' {\n const t = this.typeOf({ type });\n return t.toLowerCase() as 'info' | 'warning' | 'error' | 'success';\n }\n\n private readonly sanitizer = inject(DomSanitizer);\n private readonly authService = inject(MesAuthService);\n private readonly toastService = inject(ToastService);\n private readonly themeService = inject(ThemeService);\n\n constructor() {\n this.loadNotifications();\n\n // Refresh time-ago labels every 30s - signal mutation triggers CD in zoneless\n this.dateTimer = setInterval(() => this.refreshDateLabels(), 30000);\n\n const latestNotification = toSignal(this.authService.notifications$);\n\n effect(() => {\n const notification = latestNotification() as RealTimeNotificationDto | undefined;\n if (!notification) return;\n this.toastService.show(\n notification.message || '',\n notification.title,\n this.toastType(notification.type),\n 5000\n );\n this.loadNotifications();\n });\n }\n\n ngOnDestroy() {\n if (this.dateTimer !== null) {\n clearInterval(this.dateTimer);\n this.dateTimer = null;\n }\n }\n\n private loadNotifications() {\n this.authService.getNotifications(1, 50, true).subscribe({\n next: (response: PagedList<NotificationDto>) => {\n this.notifications.set(response.items || []);\n this.refreshDateLabels();\n },\n error: () => {}\n });\n }\n\n open() {\n this.isOpen.set(true);\n this.activeTab.set('unread');\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n switchTab(tab: 'unread' | 'read') {\n this.activeTab.set(tab);\n }\n\n openDetails(notification: NotificationDto) {\n this.selectedNotification.set(notification);\n const html = notification.messageHtml || notification.message || '';\n this.selectedNotificationHtml.set(this.sanitizer.bypassSecurityTrustHtml(html));\n this.selectedNotificationDate.set(this.formatDate(notification.createdAt));\n if (!notification.isRead) {\n this.authService.markAsRead(notification.id).subscribe({\n next: () => {\n this.notifications.update(notifs =>\n notifs.map(n => n.id === notification.id ? { ...n, isRead: true } : n)\n );\n this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n }\n\n closeDetails() {\n this.selectedNotification.set(null);\n this.selectedNotificationHtml.set(null);\n this.selectedNotificationDate.set('');\n }\n\n openUrl() {\n const url = this.selectedNotification()?.url?.trim();\n if (url) {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }\n\n markAsRead(notificationId: string, event?: Event) {\n if (event) event.stopPropagation();\n this.authService.markAsRead(notificationId).subscribe({\n next: () => {\n this.notifications.update(notifs =>\n notifs.map(n => n.id === notificationId ? { ...n, isRead: true } : n)\n );\n this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n\n markAllAsRead() {\n this.authService.markAllAsRead().subscribe({\n next: () => {\n this.notifications.update(notifs => notifs.map(n => ({ ...n, isRead: true })));\n this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n\n deleteAllRead() {\n const readIds = this.notifications().filter(n => n.isRead).map(n => n.id);\n const deletePromises = readIds.map(id => firstValueFrom(this.authService.deleteNotification(id)));\n Promise.all(deletePromises).then(() => {\n this.notifications.update(notifs => notifs.filter(n => !n.isRead));\n }).catch(() => {\n this.loadNotifications();\n });\n }\n\n deleteAllUnread() {\n const unreadIds = this.notifications().filter(n => !n.isRead).map(n => n.id);\n const deletePromises = unreadIds.map(id => firstValueFrom(this.authService.deleteNotification(id)));\n Promise.all(deletePromises).then(() => {\n this.notifications.update(notifs => notifs.filter(n => n.isRead));\n this.notificationRead.emit();\n }).catch(() => {\n this.loadNotifications();\n });\n }\n\n delete(notificationId: string, event: Event) {\n event.stopPropagation();\n const wasUnread = this.notifications().some(n => n.id === notificationId && !n.isRead);\n this.authService.deleteNotification(notificationId).subscribe({\n next: () => {\n this.notifications.update(notifs => notifs.filter(n => n.id !== notificationId));\n if (wasUnread) this.notificationRead.emit();\n },\n error: () => {}\n });\n }\n\n formatDate(dateString: string): string {\n return this.computeTimeAgo(dateString, new Date());\n }\n\n // Pure computation - takes now as param so it never calls new Date() internally\n private computeTimeAgo(dateString: string, now: Date): string {\n const normalizedDateString = this.parseUtcDate(dateString);\n const date = new Date(normalizedDateString);\n\n if (isNaN(date.getTime())) return 'Invalid date';\n\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return date.toLocaleDateString();\n }\n\n // Rebuild dateLabels map and store as a new signal value so CD is triggered\n private refreshDateLabels(): void {\n const now = new Date();\n const newLabels = new Map<string, string>();\n for (const n of this.notifications()) {\n newLabels.set(n.id, this.computeTimeAgo(n.createdAt, now));\n }\n this.dateLabels.set(newLabels);\n }\n\n // Parse date string from server (stored in UTC but without 'Z' suffix or 'T' separator)\n private parseUtcDate(dateStr: string): string {\n let normalized = dateStr.includes('T') ? dateStr : dateStr.replace(' ', 'T');\n if (!normalized.endsWith('Z') && !normalized.includes('+') && !normalized.includes('-', 10)) {\n normalized += 'Z';\n }\n return normalized;\n }\n}\n","<div class=\"notification-panel\" [class.open]=\"isOpen()\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-header-left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n <h3>Notifications</h3>\n </div>\n <button class=\"close-btn\" (click)=\"close()\" title=\"Close\" aria-label=\"Close notifications\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'unread'\" (click)=\"switchTab('unread')\">\n Unread\n @if (unreadNotifications().length > 0) {\n <span class=\"tab-badge\">{{ unreadNotifications().length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'read'\" (click)=\"switchTab('read')\">\n Read\n @if (readNotifications().length > 0) {\n <span class=\"tab-badge read-badge\">{{ readNotifications().length }}</span>\n }\n </button>\n </div>\n\n <!-- Notifications List -->\n <div class=\"notifications-list\">\n @if (currentNotifications().length > 0) {\n @for (notification of currentNotifications(); track notification.id) {\n <div\n class=\"notification-item\"\n [class.unread]=\"!notification.isRead\"\n (click)=\"openDetails(notification)\"\n >\n @let t = typeOf(notification);\n <div class=\"notif-accent\"\n [class.type-info]=\"t === 'Info'\"\n [class.type-success]=\"t === 'Success'\"\n [class.type-warning]=\"t === 'Warning'\"\n [class.type-error]=\"t === 'Error'\"></div>\n <div class=\"notif-type-icon\"\n [class.type-info]=\"t === 'Info'\"\n [class.type-success]=\"t === 'Success'\"\n [class.type-warning]=\"t === 'Warning'\"\n [class.type-error]=\"t === 'Error'\">\n @if (t === 'Info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n }\n @if (t === 'Success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n }\n @if (t === 'Warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n }\n @if (t === 'Error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n </div>\n <div class=\"notification-content\">\n <div class=\"notification-title\">{{ notification.title }}</div>\n <div class=\"notification-message\">{{ notification.message }}</div>\n <div class=\"notification-meta\">\n <span class=\"app-name\">{{ notification.sourceAppName }}</span>\n <span class=\"time\">{{ dateLabels().get(notification.id) }}</span>\n </div>\n </div>\n @if (!notification.isRead) {\n <button class=\"icon-btn read-btn\" (click)=\"markAsRead(notification.id, $event)\" title=\"Mark as read\" aria-label=\"Mark as read\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n </button>\n }\n @if (notification.isRead) {\n <button class=\"icon-btn delete-btn\" (click)=\"delete(notification.id, $event)\" title=\"Delete\" aria-label=\"Delete notification\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/><path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/>\n </svg>\n </button>\n }\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <svg class=\"empty-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n <p>No {{ activeTab() }} notifications</p>\n </div>\n }\n </div>\n\n <!-- Footer Actions -->\n @if (currentNotifications().length > 0) {\n <div class=\"panel-footer\">\n @if (activeTab() === 'unread') {\n <div class=\"footer-actions\">\n @if (unreadNotifications().length > 0) {\n <button class=\"action-btn\" (click)=\"markAllAsRead()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>\n Mark all read\n </button>\n <button class=\"action-btn delete-all-btn\" (click)=\"deleteAllUnread()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/></svg>\n Delete all\n </button>\n }\n </div>\n }\n @if (activeTab() === 'read' && readNotifications().length > 0) {\n <button class=\"action-btn delete-all-btn\" (click)=\"deleteAllRead()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/></svg>\n Delete all\n </button>\n }\n </div>\n }\n</div>\n\n<!-- Details Modal -->\n@if (selectedNotification()) {\n <div class=\"modal-overlay\" (click)=\"closeDetails()\">\n <div class=\"modal-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\"\n [class.modal-type-info]=\"typeOf(selectedNotification()!) === 'Info'\"\n [class.modal-type-success]=\"typeOf(selectedNotification()!) === 'Success'\"\n [class.modal-type-warning]=\"typeOf(selectedNotification()!) === 'Warning'\"\n [class.modal-type-error]=\"typeOf(selectedNotification()!) === 'Error'\">\n <div class=\"modal-header-left\">\n <div class=\"modal-type-icon\">\n @if (typeOf(selectedNotification()!) === 'Info') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>\n </svg>\n }\n @if (typeOf(selectedNotification()!) === 'Success') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n }\n @if (typeOf(selectedNotification()!) === 'Warning') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/>\n </svg>\n }\n @if (typeOf(selectedNotification()!) === 'Error') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n }\n </div>\n <h3>{{ selectedNotification()!.title }}</h3>\n </div>\n <button class=\"close-btn\" (click)=\"closeDetails()\" title=\"Close\" aria-label=\"Close notification detail\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n <div class=\"modal-meta\">\n <span class=\"app-name\">{{ selectedNotification()!.sourceAppName }}</span>\n <span class=\"time\">{{ selectedNotificationDate() }}</span>\n </div>\n <div class=\"modal-body\" [innerHTML]=\"selectedNotificationHtml()\"></div>\n <div class=\"modal-footer\">\n @if (selectedNotification()?.url?.trim()) {\n <button class=\"action-btn see-details-btn\" (click)=\"openUrl()\">See Details</button>\n }\n <button class=\"action-btn\" (click)=\"closeDetails()\">Close</button>\n </div>\n </div>\n </div>\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { MesAuthConfig, PagedList } from './mes-auth.service';\nimport {\n ApprovalDocumentDto,\n ApprovalDocumentSummaryDto,\n ApprovalDocumentStatus,\n ApprovalDashboardDto,\n ApprovalHistoryDto,\n ApprovalTemplateSummaryDto,\n ApprovalTemplateDto,\n RolePreviewUserDto,\n CreateApprovalRequest,\n CreateApprovalResponseDto,\n CreateApprovalTemplateRequest,\n UpdateApprovalTemplateRequest,\n ApproveRejectRequest,\n DelegateRequest\n} from './approval.models';\n\n@Injectable()\nexport class MaApprovalService {\n private apiBase = '';\n private http!: HttpClient;\n private config: MesAuthConfig | null = null;\n\n constructor() {}\n\n init(config: MesAuthConfig, httpClient: HttpClient) {\n this.config = config;\n this.http = httpClient;\n this.apiBase = config.apiBaseUrl.replace(/\\/$/, '');\n }\n\n private get opts() {\n return { withCredentials: this.config?.withCredentials ?? true };\n }\n\n // ====================== Dashboard ======================\n\n getDashboard(): Observable<ApprovalDashboardDto> {\n return this.http.get<ApprovalDashboardDto>(`${this.apiBase}/approval/dashboard`, this.opts);\n }\n\n // ====================== Pending & My Requests ======================\n\n getPendingApprovals(page = 1, pageSize = 20): Observable<PagedList<ApprovalDocumentSummaryDto>> {\n return this.http.get<PagedList<ApprovalDocumentSummaryDto>>(\n `${this.apiBase}/approval/pending?page=${page}&pageSize=${pageSize}`,\n this.opts\n );\n }\n\n getMyRequests(page = 1, pageSize = 20, status?: ApprovalDocumentStatus): Observable<PagedList<ApprovalDocumentSummaryDto>> {\n let url = `${this.apiBase}/approval/my-requests?page=${page}&pageSize=${pageSize}`;\n if (status !== undefined) url += `&status=${status}`;\n return this.http.get<PagedList<ApprovalDocumentSummaryDto>>(url, this.opts);\n }\n\n // ====================== Document ======================\n\n getDocument(id: string): Observable<ApprovalDocumentDto> {\n return this.http.get<ApprovalDocumentDto>(`${this.apiBase}/approval/documents/${id}`, this.opts);\n }\n\n getDocumentHistory(id: string): Observable<ApprovalHistoryDto[]> {\n return this.http.get<ApprovalHistoryDto[]>(`${this.apiBase}/approval/documents/${id}/history`, this.opts);\n }\n\n getDocumentContentUrl(id: string): string {\n return `${this.apiBase}/approval/documents/${id}/content`;\n }\n\n getDocumentThumbnailUrl(id: string): string {\n return `${this.apiBase}/approval/documents/${id}/thumbnail`;\n }\n\n // ====================== Actions ======================\n\n approve(documentId: string, comment?: string): Observable<void> {\n const body: ApproveRejectRequest = { comment };\n return this.http.post<void>(`${this.apiBase}/approval/documents/${documentId}/approve`, body, this.opts);\n }\n\n reject(documentId: string, comment: string): Observable<void> {\n const body: ApproveRejectRequest = { comment };\n return this.http.post<void>(`${this.apiBase}/approval/documents/${documentId}/reject`, body, this.opts);\n }\n\n delegate(documentId: string, toUserId: string, reason?: string): Observable<void> {\n const body: DelegateRequest = { toUserId, reason };\n return this.http.post<void>(`${this.apiBase}/approval/documents/${documentId}/delegate`, body, this.opts);\n }\n\n cancel(documentId: string, reason?: string): Observable<void> {\n let url = `${this.apiBase}/approval/documents/${documentId}`;\n if (reason) url += `?reason=${encodeURIComponent(reason)}`;\n return this.http.delete<void>(url, this.opts);\n }\n\n // ====================== Templates ======================\n\n getTemplates(appId?: string): Observable<ApprovalTemplateSummaryDto[]> {\n let url = `${this.apiBase}/approval/templates`;\n if (appId) url += `?appId=${encodeURIComponent(appId)}`;\n return this.http.get<ApprovalTemplateSummaryDto[]>(url, this.opts);\n }\n\n getTemplate(id: number): Observable<ApprovalTemplateDto> {\n return this.http.get<ApprovalTemplateDto>(`${this.apiBase}/approval/templates/${id}`, this.opts);\n }\n\n createTemplate(request: CreateApprovalTemplateRequest): Observable<ApprovalTemplateDto> {\n return this.http.post<ApprovalTemplateDto>(`${this.apiBase}/approval/templates`, request, this.opts);\n }\n\n updateTemplate(id: number, request: UpdateApprovalTemplateRequest): Observable<ApprovalTemplateDto> {\n return this.http.put<ApprovalTemplateDto>(`${this.apiBase}/approval/templates/${id}`, request, this.opts);\n }\n\n deleteTemplate(id: number): Observable<void> {\n return this.http.delete<void>(`${this.apiBase}/approval/templates/${id}`, this.opts);\n }\n\n previewRole(orgCode: string, level: string): Observable<RolePreviewUserDto[]> {\n return this.http.get<RolePreviewUserDto[]>(\n `${this.apiBase}/approval/roles/preview?orgCode=${encodeURIComponent(orgCode)}&level=${encodeURIComponent(level)}`,\n this.opts\n );\n }\n\n // ====================== Create (used by ma-arv-container) ======================\n\n createApproval(request: CreateApprovalRequest): Observable<CreateApprovalResponseDto> {\n return this.http.post<CreateApprovalResponseDto>(`${this.apiBase}/approval/documents`, request, this.opts);\n }\n}\n","// ====================== Enums ======================\n\nexport enum ApprovalStepMode {\n Sequential = 0,\n Parallel = 1\n}\n\nexport enum ApprovalDocumentStatus {\n Draft = 0,\n Pending = 1,\n Approved = 2,\n Rejected = 3,\n Cancelled = 4,\n Expired = 5\n}\n\nexport enum ApprovalStepStatus {\n Waiting = 0,\n Active = 1,\n Approved = 2,\n Rejected = 3,\n Delegated = 4,\n Expired = 5,\n Skipped = 6\n}\n\nexport enum ApprovalActionType {\n Created = 0,\n Submitted = 1,\n Approved = 2,\n Rejected = 3,\n Delegated = 4,\n Cancelled = 5,\n Commented = 6,\n Expired = 7,\n StepAdvanced = 8\n}\n\n// ====================== DTOs ======================\n\nexport interface ApprovalDocumentSummaryDto {\n id: string;\n title: string;\n description?: string;\n thumbnailPath?: string;\n sourceAppId: string;\n referenceId: string;\n requestedByUserName: string;\n status: ApprovalDocumentStatus;\n currentStepOrder: number;\n totalSteps: number;\n currentStepName?: string;\n createdAt: string;\n completedAt?: string;\n}\n\nexport interface ApprovalStepDto {\n id: number;\n stepOrder: number;\n stepName: string;\n mode: ApprovalStepMode;\n assignedUserId: string;\n assignedUserName: string;\n delegatedToUserId?: string;\n delegatedToUserName?: string;\n status: ApprovalStepStatus;\n comment?: string;\n decidedAt?: string;\n deadlineAt?: string;\n}\n\nexport interface ApprovalReferenceDto {\n userId: string;\n userName: string;\n addedAt: string;\n}\n\nexport interface ApprovalDocumentDto {\n id: string;\n title: string;\n description?: string;\n contentPath: string;\n thumbnailPath?: string;\n sourceAppId: string;\n referenceId: string;\n templateId?: number;\n requestedByUserId: string;\n requestedByUserName: string;\n status: ApprovalDocumentStatus;\n currentStepOrder: number;\n callbackUrl?: string;\n createdAt: string;\n updatedAt: string;\n completedAt?: string;\n deadlineAt?: string;\n steps: ApprovalStepDto[];\n references: ApprovalReferenceDto[];\n}\n\nexport interface ApprovalHistoryDto {\n id: number;\n documentId: string;\n stepId?: number;\n action: ApprovalActionType;\n actorUserId: string;\n actorUserName: string;\n comment?: string;\n details?: string;\n timestamp: string;\n signatureUrl?: string | null;\n}\n\nexport interface ApprovalTemplateSummaryDto {\n id: number;\n name: string;\n description?: string;\n sourceAppId: string;\n stepCount: number;\n referenceCount: number;\n isActive: boolean;\n createdAt: string;\n}\n\nexport interface StepRoleDto {\n id: number;\n orgCode: string;\n positionLevel: string;\n orgName?: string;\n}\n\nexport interface RolePreviewUserDto {\n userId: string; \n fullName?: string;\n position?: string;\n department?: string;\n employeeCode?: string;\n}\n\nexport interface ApprovalTemplateStepDto {\n id: number;\n stepOrder: number;\n stepName: string;\n mode: ApprovalStepMode;\n deadlineHours?: number;\n assigneeUserIds: string[];\n roles: StepRoleDto[];\n}\n\nexport interface ApprovalTemplateDto {\n id: number;\n name: string;\n description?: string;\n sourceAppId: string;\n createdByUserId: string;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n steps: ApprovalTemplateStepDto[];\n referenceUserIds: string[];\n}\n\nexport interface ApprovalDashboardDto {\n pendingCount: number;\n approvedTodayCount: number;\n rejectedTodayCount: number;\n recentActivity: ApprovalDocumentSummaryDto[];\n}\n\nexport interface CreateApprovalResponseDto {\n documentId: string;\n message: string;\n}\n\n// ====================== Requests ======================\n\nexport interface ApprovalStepRequest {\n stepOrder: number;\n stepName: string;\n mode?: ApprovalStepMode;\n approverUserIds: string[];\n deadlineHours?: number;\n}\n\nexport interface CreateApprovalRequest {\n title: string;\n description?: string;\n contentHtml: string;\n thumbnailBase64?: string;\n referenceId: string;\n templateId?: number;\n requestedByUserId?: string;\n callbackUrl?: string;\n deadlineHours?: number;\n steps?: ApprovalStepRequest[];\n referenceUserIds?: string[];\n}\n\nexport interface ApproveRejectRequest {\n comment?: string;\n}\n\nexport interface DelegateRequest {\n toUserId: string;\n reason?: string;\n}\n\nexport interface CreateApprovalTemplateRequest {\n name: string;\n description?: string;\n sourceAppId: string;\n steps: ApprovalStepRequest[];\n referenceUserIds?: string[];\n}\n\nexport interface UpdateApprovalTemplateRequest {\n name: string;\n description?: string;\n steps: ApprovalStepRequest[];\n referenceUserIds?: string[];\n}\n\n// ====================== Submit Result ======================\n\nexport interface ApprovalSubmitResult {\n documentId: string;\n message: string;\n}\n","import {\n Component, inject, output, signal, effect\n} from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { MesAuthService } from './mes-auth.service';\nimport { MaApprovalService } from './approval.service';\nimport { ApprovalDocumentSummaryDto, ApprovalDocumentStatus } from './approval.models';\nimport { HttpClient } from '@angular/common/http';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\ntype PanelTab = 'processing' | 'approved' | 'rejected';\n\n@Component({\n selector: 'ma-approval-panel',\n imports: [DatePipe],\n templateUrl: './ma-approval-panel.component.html',\n styleUrls: ['./panel-shared.css', './ma-approval-panel.component.css']\n})\nexport class MaApprovalPanelComponent {\n approvalActioned = output<void>();\n\n readonly isOpen = signal(false);\n readonly loading = signal(false);\n readonly activeTab = signal<PanelTab>('processing');\n readonly processingItems = signal<ApprovalDocumentSummaryDto[]>([]);\n readonly approvedItems = signal<ApprovalDocumentSummaryDto[]>([]);\n readonly rejectedItems = signal<ApprovalDocumentSummaryDto[]>([]);\n\n private readonly mesAuth = inject(MesAuthService);\n private readonly http = inject(HttpClient);\n private readonly router = inject(Router);\n private approvalSvc: MaApprovalService | null = null;\n\n constructor() {\n const config = this.mesAuth.getConfig();\n if (config) {\n this.approvalSvc = new MaApprovalService();\n this.approvalSvc.init(config, this.http);\n }\n\n const approvalEvent = toSignal(this.mesAuth.approvalEvents$);\n\n effect(() => {\n approvalEvent(); // track SignalR approval events\n if (this.isOpen()) this.loadCurrentTab();\n });\n }\n\n open() {\n this.isOpen.set(true);\n this.loadAllTabs();\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n toggle() {\n if (this.isOpen()) this.close();\n else this.open();\n }\n\n switchTab(tab: PanelTab) {\n this.activeTab.set(tab);\n this.loadCurrentTab();\n }\n\n private loadAllTabs() {\n this.loading.set(true);\n if (!this.approvalSvc) { this.loading.set(false); return; }\n\n let pending = 3;\n const done = () => { if (--pending === 0) this.loading.set(false); };\n\n this.approvalSvc.getPendingApprovals(1, 100).subscribe({\n next: r => { this.processingItems.set(r.items); done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Approved).subscribe({\n next: r => { this.approvedItems.set(r.items); done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => { this.rejectedItems.set(r.items); done(); },\n error: () => done()\n });\n }\n\n private loadCurrentTab() {\n if (!this.approvalSvc) return;\n\n if (this.activeTab() === 'processing') {\n this.approvalSvc.getPendingApprovals(1, 100).subscribe({\n next: r => this.processingItems.set(r.items),\n error: () => {}\n });\n } else if (this.activeTab() === 'approved') {\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Approved).subscribe({\n next: r => this.approvedItems.set(r.items),\n error: () => {}\n });\n } else {\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => this.rejectedItems.set(r.items),\n error: () => {}\n });\n }\n }\n\n navigateToDetail(id: string) {\n this.close();\n this.router.navigate(['/auth/approval/detail', id]);\n this.approvalActioned.emit();\n }\n\n showMore(status: 'approved' | 'rejected') {\n this.close();\n this.router.navigate(['/auth/approval/my-requests'], { queryParams: { status } });\n }\n}\n","<div class=\"approval-backdrop\" [class.open]=\"isOpen()\" (click)=\"close()\"></div>\n<div class=\"approval-panel\" [class.open]=\"isOpen()\">\n\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-header-left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 11l3 3L22 4\"/>\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/>\n </svg>\n <h3>Approvals</h3>\n </div>\n <button class=\"close-btn\" (click)=\"close()\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'processing'\" (click)=\"switchTab('processing')\">\n Processing\n @if (processingItems().length > 0) {\n <span class=\"tab-badge\">{{ processingItems().length }}</span>\n }\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'approved'\" (click)=\"switchTab('approved')\">\n Approved\n </button>\n <button class=\"tab-btn\" [class.active]=\"activeTab() === 'rejected'\" (click)=\"switchTab('rejected')\">\n Rejected\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Loading -->\n @if (loading()) {\n <div class=\"loading-state\">\n <div class=\"spinner\"></div>\n <span>Loading...</span>\n </div>\n }\n\n <!-- Processing tab -->\n @if (!loading() && activeTab() === 'processing') {\n @if (processingItems().length === 0) {\n <div class=\"empty-state\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.4\"><path d=\"M9 11l3 3L22 4\"/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/></svg>\n <p>No pending approvals</p>\n </div>\n }\n @for (item of processingItems(); track item.id) {\n <div class=\"approval-item\" (click)=\"navigateToDetail(item.id)\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div class=\"item-meta\">\n <span class=\"item-requester\">By {{ item.requestedByUserName }}</span>\n @if (item.currentStepName) {\n <span class=\"item-step\">· {{ item.currentStepName }}</span>\n }\n </div>\n <div class=\"item-footer\">\n <span class=\"item-time\">{{ item.createdAt | date:'shortDate' }}</span>\n <span class=\"item-link\">View &rarr;</span>\n </div>\n </div>\n }\n }\n\n <!-- Approved tab -->\n @if (!loading() && activeTab() === 'approved') {\n @if (approvedItems().length === 0) {\n <div class=\"empty-state\">\n <p>No approved documents</p>\n </div>\n }\n @for (item of approvedItems(); track item.id) {\n <div class=\"approval-item approved\" (click)=\"navigateToDetail(item.id)\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div class=\"item-meta\">\n <span class=\"item-requester\">By {{ item.requestedByUserName }}</span>\n </div>\n <div class=\"item-footer\">\n <span class=\"status-badge approved-badge\">Approved</span>\n <span class=\"item-time\">{{ item.completedAt | date:'shortDate' }}</span>\n <span class=\"item-link\">View &rarr;</span>\n </div>\n </div>\n }\n @if (approvedItems().length >= 10) {\n <div class=\"show-more\" (click)=\"showMore('approved')\">Show more &rarr;</div>\n }\n }\n\n <!-- Rejected tab -->\n @if (!loading() && activeTab() === 'rejected') {\n @if (rejectedItems().length === 0) {\n <div class=\"empty-state\">\n <p>No rejected documents</p>\n </div>\n }\n @for (item of rejectedItems(); track item.id) {\n <div class=\"approval-item rejected\" (click)=\"navigateToDetail(item.id)\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div class=\"item-meta\">\n <span class=\"item-requester\">By {{ item.requestedByUserName }}</span>\n </div>\n <div class=\"item-footer\">\n <span class=\"status-badge rejected-badge\">Rejected</span>\n <span class=\"item-time\">{{ item.completedAt | date:'shortDate' }}</span>\n <span class=\"item-link\">View &rarr;</span>\n </div>\n </div>\n }\n @if (rejectedItems().length >= 10) {\n <div class=\"show-more\" (click)=\"showMore('rejected')\">Show more &rarr;</div>\n }\n }\n </div>\n</div>\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { MES_AUTH_AI_CONFIG, DEFAULT_AI_CONFIG } from './ma-ai-config';\nimport { ClientTool } from './ma-ai.models';\nimport { ThemeService } from '../theme.service';\nimport { ToastService } from '../toast.service';\nimport { MesAuthService } from '../mes-auth.service';\n\n/**\n * Resolves the full set of client tools available to the AI: built-ins + consumer-registered.\n * Handlers are invoked through `runTool(name, args)` which automatically threads the Injector\n * so consumer handlers can use inject() patterns.\n */\n@Injectable({ providedIn: 'root' })\nexport class MaAiToolsRegistry {\n private readonly config = inject(MES_AUTH_AI_CONFIG, { optional: true }) ?? DEFAULT_AI_CONFIG;\n private readonly injector = inject(Injector);\n\n /** Built-in client tools shipped by the library. */\n private readonly builtIn: ClientTool[] = [\n {\n name: 'navigate',\n description: 'Navigate the user to a path within the application. Use relative paths starting with /.',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Path to navigate to, e.g. \"/auth/users\"' }\n },\n required: ['path']\n },\n readOnly: true,\n handler: (args: { path: string }) => {\n const router = this.injector.get(Router, null);\n if (!router) return 'Router is not available in this app.';\n router.navigateByUrl(args.path);\n return `Navigated to ${args.path}`;\n }\n },\n {\n name: 'toggle_theme',\n description: 'Toggle between light and dark theme.',\n parameters: { type: 'object', properties: {} },\n readOnly: true,\n handler: () => {\n const theme = this.injector.get(ThemeService);\n const next = theme.currentTheme() === 'light' ? 'dark' : 'light';\n theme.setFixTheme(next);\n return `Theme switched to ${next}.`;\n }\n },\n {\n name: 'show_toast',\n description: 'Show a small toast notification at the top of the screen.',\n parameters: {\n type: 'object',\n properties: {\n message: { type: 'string', description: 'Toast body text' },\n title: { type: 'string', description: 'Optional title' },\n severity: { type: 'string', enum: ['info', 'success', 'warning', 'error'], description: 'Toast severity' }\n },\n required: ['message']\n },\n readOnly: true,\n handler: (args: { message: string; title?: string; severity?: 'info' | 'success' | 'warning' | 'error' }) => {\n const toast = this.injector.get(ToastService);\n toast.show(args.message, args.title, args.severity ?? 'info');\n return 'Toast shown.';\n }\n },\n {\n name: 'who_am_i_client',\n description: 'Get the currently signed-in user as seen by the browser (id, name, roles loaded so far).',\n parameters: { type: 'object', properties: {} },\n readOnly: true,\n handler: () => {\n const auth = this.injector.get(MesAuthService);\n const u = auth.currentUser;\n if (!u) return 'No user signed in.';\n return JSON.stringify({\n id: u.userId ?? u.id,\n userName: u.userName,\n fullName: u.fullName,\n department: u.department,\n position: u.position,\n email: u.email\n });\n }\n },\n {\n name: 'reload_page',\n description: 'Reload the current browser page. Use as a last resort if state seems stuck.',\n parameters: { type: 'object', properties: {} },\n readOnly: false,\n handler: () => {\n window.location.reload();\n return 'Reloading page…';\n }\n }\n ];\n\n /** All tools, deduplicated by name (consumer wins on conflict). */\n list(): ClientTool[] {\n const fromConfig = this.config.tools ?? [];\n const byName = new Map<string, ClientTool>();\n for (const t of this.builtIn) byName.set(t.name, t);\n for (const t of fromConfig) byName.set(t.name, t);\n return Array.from(byName.values());\n }\n\n resolve(name: string): ClientTool | undefined {\n return this.list().find(t => t.name === name);\n }\n\n /** Run a registered client tool and serialize its result for posting back to the agent loop. */\n async runTool(name: string, args: any): Promise<{ ok: boolean; result: string }> {\n const tool = this.resolve(name);\n if (!tool) return { ok: false, result: `Unknown client tool: ${name}` };\n try {\n const raw = await Promise.resolve(tool.handler(args ?? {}));\n const result = typeof raw === 'string' ? raw : JSON.stringify(raw ?? null);\n return { ok: true, result };\n } catch (err: any) {\n return { ok: false, result: err?.message ?? String(err) };\n }\n }\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { MesAuthService } from '../mes-auth.service';\nimport { MES_AUTH_AI_CONFIG, DEFAULT_AI_CONFIG } from './ma-ai-config';\nimport { MaAiToolsRegistry } from './ma-ai-tools.registry';\nimport { AiSseEvent, ChatBubble, ChatToolEvent } from './ma-ai.models';\n\nexport interface PendingApproval {\n callId: string;\n name: string;\n args: any;\n side: 'client';\n}\n\n/**\n * Drives the chat panel.\n *\n * Uses `fetch` + `ReadableStream` (not `EventSource`, which can't POST a body) to talk to\n * `/ai/chat` SSE. State lives in signals so the panel can re-render reactively.\n */\n@Injectable({ providedIn: 'root' })\nexport class MaAiService {\n private readonly auth = inject(MesAuthService);\n private readonly aiConfig = inject(MES_AUTH_AI_CONFIG, { optional: true }) ?? DEFAULT_AI_CONFIG;\n private readonly tools = inject(MaAiToolsRegistry);\n\n readonly messages = signal<ChatBubble[]>([]);\n readonly streaming = signal(false);\n /** When non-null, a write-class client tool is awaiting user confirmation. */\n readonly pendingApproval = signal<PendingApproval | null>(null);\n readonly lastError = signal<string | null>(null);\n\n private sessionId: string | null = null;\n /** Verbs the user already chose \"always approve\" for in this session. */\n private alwaysApproved = new Set<string>();\n private abortController: AbortController | null = null;\n /** ID of the current assistant bubble we're streaming tokens into. */\n private currentAssistantId: string | null = null;\n\n get enabled(): boolean {\n return this.aiConfig.enabled !== false;\n }\n\n /** Start a brand-new conversation. */\n resetSession() {\n this.cancel();\n this.sessionId = null;\n this.messages.set([]);\n this.pendingApproval.set(null);\n this.lastError.set(null);\n this.alwaysApproved.clear();\n }\n\n /** Cancel the in-flight stream (if any). The session id is preserved so the user can resume. */\n cancel() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.streaming.set(false);\n this.currentAssistantId = null;\n // If a client-tool call was awaiting the user, clearing it lets them start over.\n this.pendingApproval.set(null);\n }\n\n /** User typed and submitted a message. */\n async send(text: string, currentRoute?: string) {\n if (!text.trim()) return;\n this.lastError.set(null);\n this.appendBubble({ id: this.uid(), role: 'user', text });\n await this.runStream({ message: text }, currentRoute);\n }\n\n /**\n * Approve (or decline) a pending client tool call. If approved (and alwaysApprove),\n * remember the verb so we skip the prompt next time in this session.\n */\n async resolvePendingApproval(decision: 'approve' | 'always' | 'decline') {\n const pending = this.pendingApproval();\n if (!pending) return;\n this.pendingApproval.set(null);\n\n if (decision === 'decline') {\n await this.continueWithToolResult(pending.callId, false, 'User declined this tool call.');\n this.markToolStatus(pending.callId, 'declined');\n return;\n }\n\n if (decision === 'always') {\n this.alwaysApproved.add(this.verbOf(pending.name));\n }\n await this.executeClientTool(pending.callId, pending.name, pending.args);\n }\n\n // ── private ────────────────────────────────────────────────────────────────\n\n private async runStream(payload: { message?: string; toolResult?: { callId: string; ok: boolean; result: string } }, currentRoute?: string) {\n if (!this.enabled) {\n this.lastError.set('AI assistant is disabled.');\n return;\n }\n const config = this.auth.getConfig();\n const base = config?.apiBaseUrl?.replace(/\\/$/, '') ?? '';\n if (!base) {\n this.lastError.set('MesAuth is not configured.');\n return;\n }\n\n // Start a fresh assistant bubble that we stream tokens into.\n const assistantId = this.uid();\n this.currentAssistantId = assistantId;\n this.appendBubble({ id: assistantId, role: 'assistant', text: '', pending: true, toolEvents: [] });\n\n this.streaming.set(true);\n this.abortController = new AbortController();\n\n try {\n const res = await fetch(`${base}/ai/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'text/event-stream' },\n credentials: config?.withCredentials !== false ? 'include' : 'same-origin',\n body: JSON.stringify({\n sessionId: this.sessionId,\n message: payload.message,\n toolResult: payload.toolResult,\n clientTools: this.tools.list().map(t => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n readOnly: t.readOnly === true\n })),\n context: { currentRoute, appName: this.aiConfig.appName }\n }),\n signal: this.abortController.signal\n });\n\n if (!res.ok || !res.body) {\n const detail = await res.text().catch(() => '');\n throw new Error(`AI request failed (${res.status}). ${detail}`);\n }\n\n await this.readSse(res.body);\n } catch (err: any) {\n if (err?.name === 'AbortError') {\n // user cancelled\n } else {\n this.lastError.set(err?.message ?? String(err));\n this.finalizeAssistant(`[error: ${err?.message ?? err}]`);\n }\n } finally {\n this.streaming.set(false);\n this.abortController = null;\n }\n }\n\n private async readSse(body: ReadableStream<Uint8Array>) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // SSE events are separated by a blank line.\n let idx: number;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const rawEvent = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const dataLine = rawEvent.split('\\n').find(l => l.startsWith('data:'));\n if (!dataLine) continue;\n const json = dataLine.slice(5).trim();\n if (!json) continue;\n let ev: AiSseEvent;\n try { ev = JSON.parse(json) as AiSseEvent; }\n catch { continue; }\n await this.handleEvent(ev);\n }\n }\n }\n\n private async handleEvent(ev: AiSseEvent) {\n switch (ev.type) {\n case 'session':\n this.sessionId = ev.sessionId;\n break;\n case 'token':\n this.appendToken(ev.text);\n break;\n case 'tool_call_started':\n this.appendToolEvent({\n id: ev.id,\n name: ev.name,\n side: ev.side,\n status: 'running',\n args: ev.args,\n readOnly: ev.readOnly\n });\n break;\n case 'tool_call_completed':\n this.markToolStatus(ev.id, ev.ok ? 'ok' : 'error', ev.summary);\n break;\n case 'client_tool_call':\n this.appendToolEvent({\n id: ev.id,\n name: ev.name,\n side: 'client',\n status: ev.readOnly ? 'running' : 'awaiting-approval',\n args: ev.args,\n readOnly: ev.readOnly\n });\n if (ev.readOnly || this.alwaysApproved.has(this.verbOf(ev.name))) {\n // Auto-run; the next /ai/chat call will deliver the result.\n await this.executeClientTool(ev.id, ev.name, ev.args);\n } else {\n this.pendingApproval.set({ callId: ev.id, name: ev.name, args: ev.args, side: 'client' });\n }\n break;\n case 'error':\n this.lastError.set(ev.message);\n this.finalizeAssistant(`[error: ${ev.message}]`);\n break;\n case 'done':\n this.finalizeAssistant();\n break;\n }\n }\n\n private async executeClientTool(callId: string, name: string, args: any) {\n this.markToolStatus(callId, 'running');\n const { ok, result } = await this.tools.runTool(name, args);\n this.markToolStatus(callId, ok ? 'ok' : 'error', this.summarize(result));\n await this.continueWithToolResult(callId, ok, result);\n }\n\n private async continueWithToolResult(callId: string, ok: boolean, result: string) {\n // Open a new SSE stream that delivers the tool result.\n await this.runStream({ toolResult: { callId, ok, result } });\n }\n\n // ── bubble helpers ────────────────────────────────────────────────────────\n\n private appendBubble(b: ChatBubble) {\n this.messages.update(arr => [...arr, b]);\n }\n\n private appendToken(text: string) {\n if (!this.currentAssistantId) {\n const id = this.uid();\n this.currentAssistantId = id;\n this.appendBubble({ id, role: 'assistant', text, pending: true, toolEvents: [] });\n return;\n }\n const id = this.currentAssistantId;\n this.messages.update(arr => arr.map(m => m.id === id ? { ...m, text: m.text + text } : m));\n }\n\n private appendToolEvent(ev: ChatToolEvent) {\n if (!this.currentAssistantId) {\n const id = this.uid();\n this.currentAssistantId = id;\n this.appendBubble({ id, role: 'assistant', text: '', pending: true, toolEvents: [ev] });\n return;\n }\n const id = this.currentAssistantId;\n this.messages.update(arr => arr.map(m =>\n m.id === id\n ? { ...m, toolEvents: [...(m.toolEvents ?? []), ev] }\n : m));\n }\n\n private markToolStatus(callId: string, status: ChatToolEvent['status'], summary?: string) {\n this.messages.update(arr => arr.map(m => ({\n ...m,\n toolEvents: m.toolEvents?.map(t =>\n t.id === callId ? { ...t, status, summary: summary ?? t.summary } : t)\n })));\n }\n\n private finalizeAssistant(extra?: string) {\n const id = this.currentAssistantId;\n if (!id) return;\n this.messages.update(arr => arr.map(m =>\n m.id === id\n ? { ...m, pending: false, text: extra ? (m.text + (m.text ? '\\n' : '') + extra) : m.text }\n : m));\n this.currentAssistantId = null;\n }\n\n private verbOf(name: string): string {\n return name.split('_')[0] ?? name;\n }\n\n private summarize(s: string): string {\n const flat = s.replace(/\\s+/g, ' ').trim();\n return flat.length <= 80 ? flat : flat.slice(0, 80) + '…';\n }\n\n private uid(): string {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * Tiny hand-rolled GitHub-flavoured Markdown renderer for AI chat bubbles.\n *\n * Supports: headings, paragraphs (with single-newline → <br>), pipe tables,\n * fenced + inline code, bullet/ordered lists (flat), blockquotes, bold, italic,\n * autolinks via [text](url). All input is HTML-escaped before any markup\n * is added, so the only HTML that reaches the DOM is what this pipe emits.\n * Wrapped in `bypassSecurityTrustHtml` so [innerHTML] doesn't re-sanitize and\n * strip the markup we explicitly want.\n *\n * Not supported (intentionally — keeps the renderer tiny and safe):\n * nested lists, images, raw HTML, strikethrough, task lists, footnotes.\n * If the model emits any of those, they appear as literal text.\n */\n@Pipe({ name: 'maAiMarkdown' })\nexport class MaAiMarkdownPipe implements PipeTransform {\n private readonly sanitizer = inject(DomSanitizer);\n\n transform(value: string | null | undefined): SafeHtml {\n const html = renderMarkdown(value ?? '');\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n}\n\n// ── Renderer ────────────────────────────────────────────────────────────────\n\n// Sentinel format that survives escapeHtml AND won't collide with markdown\n// tokens (no `*`, `_`, `[`, `]`, `(`, `)`, `>`, `#`, `-`, `|` at boundaries).\nconst TOKEN_PREFIX = 'MAAIMD_TOKEN_';\nconst TOKEN_SUFFIX = '_END';\nconst tokenRe = new RegExp(`${TOKEN_PREFIX}(\\\\d+)${TOKEN_SUFFIX}`, 'g');\n\nfunction makeToken(i: number) { return `${TOKEN_PREFIX}${i}${TOKEN_SUFFIX}`; }\n\nexport function renderMarkdown(src: string): string {\n if (!src) return '';\n const blocks: string[] = [];\n\n // 1. Extract fenced code blocks (raw content preserved literally, content escaped).\n let text = src.replace(/```(\\w+)?\\n([\\s\\S]*?)```/g, (_m, lang: string | undefined, body: string) => {\n const langClass = lang ? ` class=\"lang-${escapeAttr(lang)}\"` : '';\n blocks.push(`<pre class=\"md-pre\"><code${langClass}>${escapeHtml(body.replace(/\\n$/, ''))}</code></pre>`);\n return makeToken(blocks.length - 1);\n });\n // 2. Extract inline `code` spans.\n text = text.replace(/`([^`\\n]+)`/g, (_m, body: string) => {\n blocks.push(`<code class=\"md-code\">${escapeHtml(body)}</code>`);\n return makeToken(blocks.length - 1);\n });\n\n // 3. Now escape the entire remaining content. Markdown tokens (`*`, `_`, `|`,\n // `[`, `]`, `(`, `)`, `>`, `#`, `-`) are not HTML-special, so they pass through\n // escapeHtml untouched and remain parseable in the block/inline stage below.\n text = escapeHtml(text);\n\n // 4. Block-level pass — split on blank lines, classify each block.\n const parts = text.split(/\\n{2,}/);\n const out: string[] = [];\n for (const raw of parts) {\n const trimmed = raw.replace(/^\\n+|\\n+$/g, '');\n if (!trimmed) continue;\n out.push(renderBlock(trimmed));\n }\n\n // 5. Restore code placeholders.\n let html = out.join('\\n');\n html = html.replace(tokenRe, (_m, n) => blocks[Number(n)] ?? '');\n return html;\n}\n\nfunction renderBlock(block: string): string {\n const lines = block.split('\\n');\n\n // Heading: `# foo` … `###### foo` (single-line only).\n if (lines.length === 1) {\n const h = lines[0].match(/^(#{1,6})\\s+(.+)$/);\n if (h) {\n const level = h[1].length;\n return `<h${level} class=\"md-h${level}\">${inline(h[2])}</h${level}>`;\n }\n }\n\n // Table: header line + separator line + body lines.\n if (lines.length >= 2 && isTableLine(lines[0]) && isTableSeparator(lines[1])) {\n return renderTable(lines);\n }\n\n // Blockquote: every line starts with `> ` (or `>`).\n if (lines.every(l => /^>\\s?/.test(l))) {\n const inner = lines.map(l => l.replace(/^>\\s?/, '')).join('\\n');\n return `<blockquote class=\"md-quote\">${inline(inner.replace(/\\n/g, '<br>'))}</blockquote>`;\n }\n\n // Ordered list: every line `1. `, `2. `, …\n if (lines.every(l => /^\\d+\\.\\s+/.test(l))) {\n const items = lines.map(l => `<li>${inline(l.replace(/^\\d+\\.\\s+/, ''))}</li>`).join('');\n return `<ol class=\"md-list\">${items}</ol>`;\n }\n\n // Unordered list: every line `- ` or `* `.\n if (lines.every(l => /^[-*]\\s+/.test(l))) {\n const items = lines.map(l => `<li>${inline(l.replace(/^[-*]\\s+/, ''))}</li>`).join('');\n return `<ul class=\"md-list\">${items}</ul>`;\n }\n\n // Paragraph fallback. Single newlines become <br> for fidelity to what the AI typed.\n return `<p class=\"md-p\">${inline(block.replace(/\\n/g, '<br>'))}</p>`;\n}\n\nfunction isTableLine(s: string): boolean {\n const t = s.trim();\n return t.startsWith('|') && t.endsWith('|') && t.split('|').length >= 3;\n}\n\nfunction isTableSeparator(s: string): boolean {\n if (!isTableLine(s)) return false;\n const cells = splitCells(s);\n return cells.length > 0 && cells.every(c => /^:?-{1,}:?$/.test(c.trim()));\n}\n\nfunction splitCells(line: string): string[] {\n const inner = line.trim().replace(/^\\|/, '').replace(/\\|$/, '');\n return inner.split('|').map(c => c.trim());\n}\n\nfunction renderTable(lines: string[]): string {\n const headerCells = splitCells(lines[0]);\n const aligns = splitCells(lines[1]).map(c => {\n const t = c.trim();\n if (t.startsWith(':') && t.endsWith(':')) return 'center';\n if (t.endsWith(':')) return 'right';\n if (t.startsWith(':')) return 'left';\n return '';\n });\n const bodyLines = lines.slice(2).filter(l => isTableLine(l));\n\n const renderRow = (cells: string[], tag: 'th' | 'td') =>\n cells.map((c, i) => {\n const align = aligns[i] ? ` style=\"text-align:${aligns[i]}\"` : '';\n return `<${tag}${align}>${inline(c)}</${tag}>`;\n }).join('');\n\n const thead = `<thead><tr>${renderRow(headerCells, 'th')}</tr></thead>`;\n const tbody = bodyLines.length\n ? `<tbody>${bodyLines.map(l => `<tr>${renderRow(splitCells(l), 'td')}</tr>`).join('')}</tbody>`\n : '';\n return `<div class=\"md-table-wrap\"><table class=\"md-table\">${thead}${tbody}</table></div>`;\n}\n\n// Inline pass: links, bold, italic. Operates on already-escaped text so markdown\n// tokens are unambiguous (no HTML entities to confuse the regexes).\nfunction inline(text: string): string {\n let s = text;\n // Links: [label](url) — sanitize URL scheme.\n s = s.replace(/\\[([^\\]\\n]+)\\]\\(([^)\\s]+)\\)/g, (_m, label, url) => {\n const safeUrl = sanitizeUrl(url);\n if (!safeUrl) return label;\n return `<a class=\"md-link\" href=\"${escapeAttr(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${label}</a>`;\n });\n // Bold: **text** or __text__\n s = s.replace(/\\*\\*([^*\\n]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/(^|[\\s(])__([^_\\n]+)__(?=[\\s.,;:)!?]|$)/g, '$1<strong>$2</strong>');\n // Italic: *text* or _text_ (boundary-aware to avoid mid-word matches).\n s = s.replace(/(^|[\\s(])\\*([^*\\n]+)\\*(?=[\\s.,;:)!?]|$)/g, '$1<em>$2</em>');\n s = s.replace(/(^|[\\s(])_([^_\\n]+)_(?=[\\s.,;:)!?]|$)/g, '$1<em>$2</em>');\n return s;\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n}\n\nfunction sanitizeUrl(url: string): string | null {\n const trimmed = url.trim();\n // Allow http(s), mailto, root-relative, and fragments. Reject javascript:, data:, vbscript: etc.\n if (/^(https?:|mailto:)/i.test(trimmed)) return trimmed;\n if (trimmed.startsWith('/') || trimmed.startsWith('#')) return trimmed;\n return null;\n}\n","import {\n AfterViewInit, Component, ElementRef, HostBinding, computed, effect, inject,\n signal, viewChild\n} from '@angular/core';\nimport { JsonPipe } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { MaAiService } from './ma-ai.service';\nimport { MaAiMarkdownPipe } from './ma-ai-markdown.pipe';\nimport { MaUiConfigService } from '../ma-ui-config.service';\nimport { ThemeService } from '../theme.service';\n\nconst STORAGE_KEY = 'ma-ai-panel-width';\nconst MIN_WIDTH = 320;\nconst MAX_WIDTH = 800;\nconst DEFAULT_WIDTH = 420;\n\n/**\n * Right-side, resizable chat drawer. Open/close via the public open/close/toggle methods.\n * Uses panel-shared.css for the header/empty-state styling so it looks like the approval\n * and notification panels.\n */\n@Component({\n selector: 'ma-ai-chat-panel',\n imports: [JsonPipe, MaAiMarkdownPipe],\n templateUrl: './ma-ai-chat-panel.component.html',\n styleUrls: ['../panel-shared.css', './ma-ai-chat-panel.component.css']\n})\nexport class MaAiChatPanelComponent implements AfterViewInit {\n readonly isOpen = signal(false);\n readonly width = signal<number>(this.loadWidth());\n readonly draft = signal<string>('');\n\n readonly ai = inject(MaAiService);\n private readonly router = inject(Router, { optional: true });\n private readonly themeService = inject(ThemeService);\n private readonly uiConfig = inject(MaUiConfigService);\n\n /** Suggested prompts shown in the empty state — manifest overridable. */\n readonly quickPrompts = computed<string[]>(() => {\n const fromManifest = this.uiConfig.quickPrompts();\n if (fromManifest && fromManifest.length > 0) return fromManifest;\n return [\n 'Who am I?',\n 'List my pending approvals',\n 'What unread notifications do I have?'\n ];\n });\n\n private readonly scrollContainer = viewChild<ElementRef<HTMLDivElement>>('scrollContainer');\n private readonly textArea = viewChild<ElementRef<HTMLTextAreaElement>>('textArea');\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly messages = this.ai.messages;\n readonly streaming = this.ai.streaming;\n readonly pendingApproval = this.ai.pendingApproval;\n readonly lastError = this.ai.lastError;\n readonly hasMessages = computed(() => this.messages().length > 0);\n\n // Resize state\n private isDragging = false;\n private dragStartX = 0;\n private dragStartWidth = 0;\n\n constructor() {\n // Auto-scroll on new content\n effect(() => {\n this.messages(); // dep\n this.streaming();\n queueMicrotask(() => this.scrollToBottom());\n });\n }\n\n ngAfterViewInit(): void {\n // pointer listeners attached on demand during drag\n }\n\n open() {\n this.isOpen.set(true);\n queueMicrotask(() => this.textArea()?.nativeElement.focus());\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n toggle() {\n if (this.isOpen()) this.close(); else this.open();\n }\n\n newConversation() {\n this.ai.resetSession();\n }\n\n send() {\n const text = this.draft().trim();\n if (!text || this.streaming()) return;\n this.draft.set('');\n const route = this.router?.url;\n this.ai.send(text, route);\n }\n\n cancel() {\n this.ai.cancel();\n }\n\n onTextareaKey(ev: KeyboardEvent) {\n if (ev.key === 'Enter' && !ev.shiftKey) {\n ev.preventDefault();\n this.send();\n }\n }\n\n onTextareaInput(ev: Event) {\n const t = ev.target as HTMLTextAreaElement;\n this.draft.set(t.value);\n // auto-grow\n t.style.height = 'auto';\n t.style.height = Math.min(t.scrollHeight, 160) + 'px';\n }\n\n approve() { this.ai.resolvePendingApproval('approve'); }\n alwaysApprove() { this.ai.resolvePendingApproval('always'); }\n decline() { this.ai.resolvePendingApproval('decline'); }\n\n // ── resize handle ─────────────────────────────────────────────────────────\n\n startResize(ev: PointerEvent) {\n this.isDragging = true;\n this.dragStartX = ev.clientX;\n this.dragStartWidth = this.width();\n (ev.target as HTMLElement).setPointerCapture(ev.pointerId);\n ev.preventDefault();\n }\n\n onResizeMove(ev: PointerEvent) {\n if (!this.isDragging) return;\n const dx = this.dragStartX - ev.clientX; // drag-left = wider\n const next = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, this.dragStartWidth + dx));\n this.width.set(next);\n }\n\n endResize(ev: PointerEvent) {\n if (!this.isDragging) return;\n this.isDragging = false;\n try { (ev.target as HTMLElement).releasePointerCapture(ev.pointerId); } catch {}\n try { localStorage.setItem(STORAGE_KEY, String(this.width())); } catch {}\n }\n\n // ── helpers ───────────────────────────────────────────────────────────────\n\n private loadWidth(): number {\n try {\n const raw = typeof localStorage !== 'undefined' ? localStorage.getItem(STORAGE_KEY) : null;\n const n = raw ? parseInt(raw, 10) : NaN;\n return isFinite(n) ? Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, n)) : DEFAULT_WIDTH;\n } catch {\n return DEFAULT_WIDTH;\n }\n }\n\n private scrollToBottom() {\n const el = this.scrollContainer()?.nativeElement;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n }\n}\n","<div class=\"ai-panel\" [class.open]=\"isOpen()\" [style.width.px]=\"width()\">\n\n <!-- Resize handle (left edge) -->\n <div class=\"ai-resize-handle\"\n (pointerdown)=\"startResize($event)\"\n (pointermove)=\"onResizeMove($event)\"\n (pointerup)=\"endResize($event)\"\n (pointercancel)=\"endResize($event)\"\n aria-label=\"Resize panel\"\n title=\"Drag to resize\"></div>\n\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-header-left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 2 L13.5 7.5 L19 9 L13.5 10.5 L12 16 L10.5 10.5 L5 9 L10.5 7.5 Z\"/>\n <path d=\"M19 16 L19.8 18.2 L22 19 L19.8 19.8 L19 22 L18.2 19.8 L16 19 L18.2 18.2 Z\"/>\n </svg>\n <h3>AI Assistant</h3>\n </div>\n <div class=\"header-actions\">\n <button class=\"icon-btn\" (click)=\"newConversation()\" title=\"New conversation\" aria-label=\"New conversation\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 12a9 9 0 1 1-3-6.7L21 8\"/><path d=\"M21 3v5h-5\"/>\n </svg>\n </button>\n <button class=\"close-btn\" (click)=\"close()\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Conversation -->\n <div class=\"panel-content\" #scrollContainer>\n @if (!hasMessages()) {\n <div class=\"empty-state\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"36\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.5\">\n <path d=\"M12 2 L13.5 7.5 L19 9 L13.5 10.5 L12 16 L10.5 10.5 L5 9 L10.5 7.5 Z\"/>\n </svg>\n <p>Ask anything about your account, approvals, notifications, or how to use the app.</p>\n <div class=\"quick-prompts\">\n @for (q of quickPrompts(); track q) {\n <button class=\"quick-prompt\" (click)=\"draft.set(q)\">{{ q }}</button>\n }\n </div>\n </div>\n }\n\n @for (m of messages(); track m.id) {\n <div class=\"bubble\" [class.user]=\"m.role === 'user'\" [class.assistant]=\"m.role === 'assistant'\">\n @if (m.role === 'assistant' && m.toolEvents && m.toolEvents.length > 0) {\n <div class=\"tool-strip\">\n @for (t of m.toolEvents; track t.id) {\n <div class=\"tool-chip\" [class.ok]=\"t.status === 'ok'\" [class.err]=\"t.status === 'error'\"\n [class.running]=\"t.status === 'running'\" [class.await]=\"t.status === 'awaiting-approval'\"\n [class.declined]=\"t.status === 'declined'\"\n [title]=\"t.summary ?? ''\">\n <span class=\"dot\"></span>\n <span class=\"tool-name\">{{ t.side === 'server' ? '⚙' : '⌘' }} {{ t.name }}</span>\n @if (t.status === 'running') { <span class=\"muted\">…</span> }\n @if (t.status === 'ok' && t.summary) { <span class=\"muted\">· {{ t.summary }}</span> }\n @if (t.status === 'error') { <span class=\"muted\">· failed</span> }\n @if (t.status === 'awaiting-approval') { <span class=\"muted\">· awaiting approval</span> }\n @if (t.status === 'declined') { <span class=\"muted\">· declined</span> }\n </div>\n }\n </div>\n }\n @if (m.text) {\n @if (m.role === 'assistant') {\n <div class=\"bubble-text md-body\" [innerHTML]=\"m.text | maAiMarkdown\"></div>\n } @else {\n <div class=\"bubble-text\">{{ m.text }}</div>\n }\n }\n @if (m.pending && !m.text) {\n <div class=\"thinking\"><span class=\"spinner-small\"></span> Thinking…</div>\n }\n </div>\n }\n </div>\n\n <!-- Pending approval card -->\n @if (pendingApproval(); as p) {\n <div class=\"approval-card\">\n <div class=\"approval-card-head\">\n <strong>Approve action?</strong>\n <code class=\"tool-name\">{{ p.name }}</code>\n </div>\n @if (p.args && (p.args | json) !== '{}') {\n <pre class=\"approval-args\">{{ p.args | json }}</pre>\n }\n <div class=\"approval-actions\">\n <button class=\"btn primary\" (click)=\"approve()\">Approve</button>\n <button class=\"btn\" (click)=\"alwaysApprove()\">Always</button>\n <button class=\"btn danger\" (click)=\"decline()\">Decline</button>\n </div>\n </div>\n }\n\n <!-- Composer -->\n <div class=\"composer\">\n @if (lastError()) {\n <div class=\"composer-error\">{{ lastError() }}</div>\n }\n <div class=\"composer-row\">\n <textarea #textArea\n rows=\"1\"\n placeholder=\"Ask the AI…\"\n [value]=\"draft()\"\n (input)=\"onTextareaInput($event)\"\n (keydown)=\"onTextareaKey($event)\"\n [disabled]=\"streaming()\"></textarea>\n @if (streaming()) {\n <button class=\"send-btn cancel\" (click)=\"cancel()\" title=\"Cancel\" aria-label=\"Cancel\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\"/></svg>\n </button>\n } @else {\n <button class=\"send-btn\" (click)=\"send()\" [disabled]=\"!draft().trim()\" title=\"Send\" aria-label=\"Send\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>\n </button>\n }\n </div>\n </div>\n</div>\n","import { Component, ViewChild, AfterViewInit, input, inject, effect } from '@angular/core';\nimport { ToastContainerComponent } from './toast-container.component';\nimport { UserProfileComponent } from './user-profile.component';\nimport { NotificationPanelComponent } from './notification-panel.component';\nimport { MaApprovalPanelComponent } from './ma-approval-panel.component';\nimport { MaAiChatPanelComponent } from './ai/ma-ai-chat-panel.component';\nimport { ThemeService } from './theme.service';\n\n@Component({\n selector: 'ma-user',\n imports: [ToastContainerComponent, UserProfileComponent, NotificationPanelComponent, MaApprovalPanelComponent, MaAiChatPanelComponent],\n templateUrl: './ma-user.component.html',\n styleUrl: './ma-user.component.css'\n})\nexport class MaUserComponent implements AfterViewInit {\n @ViewChild(UserProfileComponent) userProfile?: UserProfileComponent;\n @ViewChild(MaApprovalPanelComponent) approvalPanel!: MaApprovalPanelComponent;\n @ViewChild(MaAiChatPanelComponent) aiPanel?: MaAiChatPanelComponent;\n\n avatarShape = input<'rectangle' | 'circle' | 'rounded'>('rounded');\n showBell = input(true);\n showApproval = input(true);\n showAi = input(true);\n showName = input(false);\n showSignature = input<boolean[]>([false, true]);\n theme = input<'light' | 'dark' | null>(null);\n\n themeService = inject(ThemeService);\n constructor() {\n effect(() => {\n const t = this.theme();\n if (t) {\n this.themeService.setFixTheme(t);\n }\n });\n }\n\n ngAfterViewInit() {\n if (this.userProfile) {\n this.userProfile.loadUnreadCount();\n this.userProfile.loadPendingApprovalCount();\n } \n }\n\n onNotificationRead() {\n if (this.userProfile) {\n this.userProfile.loadUnreadCount();\n }\n }\n\n onApprovalActioned() {\n if (this.userProfile) {\n this.userProfile.loadPendingApprovalCount();\n }\n }\n}\n","<ma-toast-container></ma-toast-container>\n<div class=\"user-header\">\n <ma-user-profile\n (notificationClick)=\"notificationPanel.open()\"\n (approvalClick)=\"approvalPanel.open()\"\n (aiClick)=\"aiPanel?.open()\"\n [inputAvatarShape]=\"avatarShape()\"\n [showBell]=\"showBell()\"\n [showApproval]=\"showApproval()\"\n [showAi]=\"showAi()\"\n [showName]=\"showName()\"\n [showSignature]=\"showSignature()\">\n <ng-content></ng-content>\n </ma-user-profile>\n</div>\n<ma-notification-panel #notificationPanel (notificationRead)=\"onNotificationRead()\"></ma-notification-panel>\n<ma-approval-panel #approvalPanel (approvalActioned)=\"onApprovalActioned()\"></ma-approval-panel>\n<ma-ai-chat-panel #aiPanel></ma-ai-chat-panel>\n","import { Component, input, inject, effect, computed, signal, HostBinding, HostListener, ElementRef } from '@angular/core';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ThemeService } from './theme.service';\nimport { IUser, MesAuthService } from './mes-auth.service';\nimport { AvatarSize, MaAvatarComponent } from './ma-avatar.component';\nimport { distinctUntilChanged, of, switchMap } from 'rxjs';\n\n@Component({\n selector: 'ma-ux',\n imports: [MaAvatarComponent],\n templateUrl: './ma-ux.component.html',\n styleUrl: './ma-ux.component.css'\n})\nexport class MaUserXComponent { \n userId = input<string | null>(null); \n showName = input<'short' | 'full' | 'none'>('full');\n showTitle = input<boolean>(true); \n scale = input<number>(0.5);\n shape = input<'circle' | 'rounded' | 'rectangle' | null>(null);\n ratio = input<'ar-11' | 'ar-43' | 'ar-169'>('ar-11');\n user = input<IUser | null>(null);\n useDefault = input<boolean>(false);\n showTooltip = input<boolean>(true);\n\n // === Signature ===\n showSignature = input<boolean>(false);\n // Optional explicit signature URL (e.g. an approval-history snapshot path).\n // When omitted and showSignature=true, falls back to the live user signature: /auth/{userId}/signature\n signatureUrl = input<string | null>(null);\n signatureHeight = input<number>(40);\n signatureOnly = input<boolean>(false);\n\n theme = input<'light' | 'dark' | null>(null);\n\n themeService = inject(ThemeService);\n authService = inject(MesAuthService);\n private hostEl = inject(ElementRef<HTMLElement>);\n\n xUser = signal<IUser | null>(null);\n readonly avatarRefresh = signal<number>(Date.now());\n\n readonly tooltipOpen = signal<boolean>(false);\n readonly tooltipTop = signal<number>(0);\n readonly tooltipLeft = signal<number>(0);\n\n readonly avatarShape = computed(() => this.shape() ?? this.xUser()?.avatarShape ?? 'circle');\n readonly avatarFrame = computed(() => this.xUser()?.avatarFrame ?? null);\n readonly avatarRatio = computed(() => this.ratio() ?? this.xUser()?.avatarRatio);\n readonly avatarSize = computed<AvatarSize>(() => (this.xUser()?.avatarSize as AvatarSize) ?? 'md');\n\n readonly signatureBroken = signal<boolean>(false);\n readonly resolvedSignatureUrl = computed<string | null>(() => {\n if (!this.showSignature() || this.signatureBroken()) return null;\n const baseRaw = this.authService.getConfig()?.apiBaseUrl ?? '';\n const base = baseRaw.replace(/\\/$/, '');\n const explicit = this.signatureUrl();\n if (explicit) {\n if (/^https?:\\/\\//i.test(explicit)) return explicit;\n return `${base}${explicit.startsWith('/') ? '' : '/'}${explicit}`;\n }\n const u = this.xUser();\n const id = u?.userId ?? u?.id;\n if (!id || !base) return null;\n return `${base}/auth/${id}/signature`;\n });\n\n @HostBinding('class') get themeClass(): string { return `theme-${this.themeService.currentTheme()}`; }\n constructor() {\n effect(() => {\n const t = this.theme();\n if (t) {\n this.themeService.setFixTheme(t);\n }\n });\n\n effect(() => {\n const user = this.user();\n if (user) this.xUser.set(user);\n });\n\n effect(() => {\n // Reset broken flag whenever the signature source changes\n this.signatureUrl();\n this.userId();\n this.xUser();\n this.signatureBroken.set(false);\n });\n\n toObservable(this.userId).pipe(\n distinctUntilChanged(),\n switchMap(id => {\n if (this.user()) return of(null);\n if (!id) {\n this.xUser.set(null);\n return of(null);\n }\n return this.authService.getUserX(id);\n }),\n takeUntilDestroyed()\n ).subscribe({\n next: (u) => { if (u) this.xUser.set(u); },\n error: () => this.xUser.set(null)\n });\n } \n\n name = computed(() => {\n const fullname = this.xUser()?.fullName ?? '';\n if (this.showName() == 'none') return '';\n else if (this.showName() == 'short') {\n const parts = fullname?.split(' ');\n return parts[parts.length - 1];\n }\n\n return fullname;\n });\n\n getAvatarUrl(user?: IUser): string {\n // Use the refresh signal to force update\n //const refresh = this.avatarRefresh();\n const config = this.authService.getConfig();\n const baseUrl = config?.apiBaseUrl || '';\n\n // if (user.avatarPath) {\n // if (user.avatarPath.startsWith('http://') || user.avatarPath.startsWith('https://')) {\n // return user.avatarPath;\n // }\n // return `${baseUrl.replace(/\\/$/, '')}${user.avatarPath}?t=${refresh}`;\n // }\n\n const userId = user?.userId ?? user?.id;\n if (userId && baseUrl) {\n return this.useDefault() ? `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatars/__default__` //?t=${refresh}\n : `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatar`; //?t=${refresh}\n }\n\n const displayName = user?.userName || user?.userId || 'User';\n return `https://ui-avatars.com/api/?name=${encodeURIComponent(displayName)}&background=1976d2&color=fff`;\n }\n\n getLastNameInitial(user: IUser): string {\n const fullName = user.fullName || user.userName || 'U';\n const parts = fullName.split(' ');\n const lastPart = parts[parts.length - 1];\n return lastPart.charAt(0).toUpperCase();\n }\n\n @HostListener('mouseenter')\n onHostMouseEnter(): void {\n if (!this.showTooltip() || !this.xUser()) return;\n const rect = (this.hostEl.nativeElement as HTMLElement).getBoundingClientRect();\n this.tooltipTop.set(rect.top - 8);\n this.tooltipLeft.set(rect.left);\n this.tooltipOpen.set(true);\n }\n\n @HostListener('mouseleave')\n onHostMouseLeave(): void {\n this.tooltipOpen.set(false);\n }\n\n @HostListener('window:scroll')\n @HostListener('window:resize')\n onViewportChange(): void {\n if (this.tooltipOpen()) this.tooltipOpen.set(false);\n }\n\n onSigErr(_ev: Event): void {\n this.signatureBroken.set(true);\n }\n}\n","<ng-container>\n @if (xUser()){\n @if (!signatureOnly()) {\n <ma-avatar\n [src]=\"getAvatarUrl(xUser())\"\n [alt]=\"xUser()?.fullName || xUser()?.userName || ''\"\n [initials]=\"getLastNameInitial(xUser())\"\n [size]=\"avatarSize()\"\n [shape]=\"avatarShape()\"\n [ratio]=\"avatarRatio()\"\n [frame]=\"avatarFrame()\"\n [scale]=\"scale()\" />\n <span class=\"user-name\">{{ name() }}</span>\n @if (showTitle() && xUser()?.givenTitle){\n <span class=\"given-title-cell given-title-badge\" [class]=\"'given-color-' + xUser()?.givenColor\">{{xUser()?.givenTitle }}</span>\n }\n }\n @if (showSignature() && resolvedSignatureUrl(); as sigUrl) {\n <img class=\"ma-ux-signature\"\n [src]=\"sigUrl\"\n [style.height.px]=\"signatureHeight()\"\n (error)=\"onSigErr($event)\"\n alt=\"signature\" />\n }\n @if (showTooltip() && xUser(); as u) {\n <div class=\"ma-ux-tooltip\"\n [class.open]=\"tooltipOpen()\"\n [style.top.px]=\"tooltipTop()\"\n [style.left.px]=\"tooltipLeft()\"\n role=\"tooltip\">\n <ma-avatar\n [src]=\"getAvatarUrl(u)\"\n [alt]=\"u.fullName || u.userName || ''\"\n [initials]=\"getLastNameInitial(u)\"\n [size]=\"avatarSize()\"\n [frame]=\"avatarFrame()\"\n [shape]=\"avatarShape()\"\n [scale]=\"1\" />\n <div class=\"ma-ux-tooltip-info\">\n <div class=\"ma-ux-tooltip-name\">{{ u.fullName || u.userName }}</div>\n <div class=\"ma-ux-tooltip-meta\"> \n <span>{{ u.department || '-' }}</span>\n <span class=\"sep\">·</span>\n <span>{{ u.position || '-' }}</span>\n @if (showTitle() && xUser()?.givenTitle){ \n <span class=\"given-title-cell given-title-badge\" [class]=\"'given-color-' + xUser()?.givenColor\">{{xUser()?.givenTitle }}</span> \n }\n </div>\n </div>\n </div>\n }\n }\n @else {\n <span>User | UserId is not config!</span>\n }\n \n</ng-container>\n","import { Component, HostBinding, inject, signal, output, effect } from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ma-notification-badge',\n imports: [],\n templateUrl: './notification-badge.component.html',\n styleUrl: './notification-badge.component.css'\n})\nexport class NotificationBadgeComponent {\n notificationClick = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n readonly unreadCount = signal(0);\n\n private readonly authService = inject(MesAuthService);\n private readonly themeService = inject(ThemeService);\n\n constructor() {\n const currentUser = toSignal(this.authService.currentUser$, { initialValue: null });\n const latestNotification = toSignal(this.authService.notifications$);\n\n effect(() => {\n if (!currentUser()) {\n this.unreadCount.set(0);\n return;\n }\n this.loadUnreadCount();\n });\n\n effect(() => {\n latestNotification(); // track SignalR notification events\n if (currentUser()) this.loadUnreadCount();\n });\n }\n\n private loadUnreadCount() {\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => this.unreadCount.set(response.unreadCount || 0),\n error: () => {}\n });\n }\n\n onNotificationClick() {\n this.notificationClick.emit();\n }\n}\n","<button class=\"notification-btn\" (click)=\"onNotificationClick()\" title=\"Notifications\">\n <span class=\"icon\">🔔</span>\n @if (unreadCount() > 0) {\n <span class=\"badge\">{{ unreadCount() }}</span>\n }\n</button>\n","import {\n Component, ElementRef, ViewChild, HostBinding, inject, input, output, DestroyRef,\n signal,\n computed\n} from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { MaApprovalService } from './approval.service';\nimport {\n ApprovalTemplateSummaryDto,\n ApprovalTemplateDto,\n ApprovalTemplateStepDto,\n RolePreviewUserDto,\n ApprovalStepRequest,\n ApprovalStepMode,\n CreateApprovalRequest,\n ApprovalSubmitResult \n} from './approval.models';\nimport { forkJoin, of, firstValueFrom } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient } from '@angular/common/http';\nimport { MaUserXComponent } from './ma-ux.component';\n\n@Component({\n selector: 'ma-arv-container',\n imports: [MaUserXComponent],\n templateUrl: './ma-arv-container.component.html',\n styleUrl: './ma-arv-container.component.css'\n})\nexport class MaArvContainerComponent {\n title = input('');\n description = input<string | undefined>(undefined);\n referenceId = input('');\n templateIds = input<number[] | undefined>(undefined);\n callbackUrl = input<string | undefined>(undefined);\n deadlineHours = input<number | undefined>(undefined);\n\n approvalSubmitted = output<ApprovalSubmitResult>();\n approvalSubmitting = output<void>();\n cancelled = output<void>();\n\n @ViewChild('contentBody', { static: true }) contentBody!: ElementRef<HTMLElement>;\n\n @HostBinding('class') get themeClass(): string { return `theme-${this.themeService.currentTheme()}`; }\n\n readonly routingMode = signal<'template' | 'adhoc'>('template');\n templates = signal<ApprovalTemplateSummaryDto[]>([]);\n selectedTemplateId = signal<number | null>(null);\n selectedTemplate = signal<ApprovalTemplateDto | null>(null);\n loadingTemplate = signal(false);\n\n // Per-step role candidates and selected user\n stepCandidates = signal<RolePreviewUserDto[][]>([]);\n stepLoadingCandidates = signal<boolean[]>([]);\n stepSelectedUsers = signal<string[]>([]);\n readonly adHocSteps = signal<ApprovalStepRequest[]>([]);\n\n readonly referenceUserIds = signal<string[]>([]);\n readonly refSearchQuery = signal('');\n readonly refSearchResults = signal<any[]>([]);\n\n readonly userSearchQuery = signal<string[]>([]);\n readonly userSearchResults = signal<any[][]>([]);\n\n readonly candidateSearchQuery = signal<string[]>([]);\n readonly candidateSearchResults = signal<any[][]>([]);\n\n submitting = signal(false);\n isSubmitted = signal(false);\n errorMessage = computed(() => {\n if (!this.approvalSvc) { return 'Approval service not initialized. Ensure provideMesAuth() is configured.'; }\n if (!this.referenceId()) { return 'ReferenceId is required.'; }\n if (!this.title()) { return 'Title is required.'; }\n\n if (this.routingMode() === 'template' && !this.selectedTemplateId()) {\n return 'Please select a template or switch to Custom Steps.';\n }\n if (this.routingMode() === 'adhoc' && this.adHocSteps().length === 0) {\n return 'Please add at least one approval step.';\n }\n if (this.routingMode() === 'adhoc') {\n for (const step of this.adHocSteps()) {\n if (step.approverUserIds.length === 0) {\n return `Step \"${step.stepName}\" needs at least one approver.`;\n }\n }\n }\n // Validate selectable steps (role-based or multi-assignee) have a selected approver\n if (this.routingMode() === 'template' && this.selectedTemplate()) {\n for (let i = 0; i < this.selectedTemplate().steps.length; i++) {\n const step = this.selectedTemplate().steps[i];\n const isSelectable = (this.stepCandidates()[i]?.length ?? 0) > 1;\n if (isSelectable && !this.stepSelectedUsers()[i]) {\n return `Please select an approver for step \"${step.stepName}\".`;\n }\n }\n }\n return '';\n });\n isError = computed(() => !!this.errorMessage());\n isStepsError = computed(() => {\n const stepsError: Record<number, boolean> = {};\n if (this.routingMode() === 'template' && this.selectedTemplate()) {\n for (let i = 0; i < this.selectedTemplate().steps.length; i++) {\n const isSelectable = (this.stepCandidates()[i]?.length ?? 0) > 1;\n stepsError[i] = isSelectable && !this.stepSelectedUsers()[i];\n }\n }\n if (this.routingMode() === 'adhoc') {\n for (let i = 0; i < this.adHocSteps().length; i++) {\n stepsError[i] = this.adHocSteps()[i].approverUserIds.length === 0;\n }\n }\n return stepsError;\n });\n submitResultError = signal<string | null>(null);\n\n private mesAuth = inject(MesAuthService);\n private themeService = inject(ThemeService);\n private approvalSvc: MaApprovalService | null = null;\n private http = inject(HttpClient);\n private destroyRef = inject(DestroyRef);\n\n constructor() {\n const config = this.mesAuth.getConfig();\n if (config) {\n this.approvalSvc = new MaApprovalService();\n this.approvalSvc.init(config, this.http);\n \n this.loadTemplates();\n }\n this.addStep();\n }\n\n private loadTemplates() {\n this.approvalSvc!.getTemplates().pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (t) => {\n const ids = this.templateIds();\n if (ids && ids.length > 0)\n t = t.filter(temp => ids.includes(temp.id));\n\n this.templates.set(t);\n if (ids && ids.length > 0) {\n this.selectedTemplateId.set(ids[0]);\n this.loadTemplateDetail(this.selectedTemplateId()!);\n }\n },\n error: () => {}\n });\n }\n\n private loadTemplateDetail(id: number) {\n this.loadingTemplate.set(true);\n this.selectedTemplate.set(null);\n this.stepCandidates.set([]);\n this.stepLoadingCandidates.set([]);\n this.stepSelectedUsers.set([]);\n this.candidateSearchQuery.set([]);\n this.candidateSearchResults.set([]);\n this.approvalSvc!.getTemplate(id).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (t) => {\n this.selectedTemplate.set(t);\n this.loadingTemplate.set(false);\n this.loadStepCandidates(t.steps);\n },\n error: () => { this.loadingTemplate.set(false); }\n });\n }\n\n private loadStepCandidates(steps: ApprovalTemplateStepDto[]) {\n this.stepCandidates.set(steps.map(() => []));\n this.stepLoadingCandidates.set(steps.map(() => false));\n this.stepSelectedUsers.set(steps.map(() => ''));\n this.candidateSearchQuery.set(steps.map(() => ''));\n this.candidateSearchResults.set(steps.map(() => []));\n\n const config = this.mesAuth.getConfig();\n\n steps.forEach((step, i) => {\n if (step.roles && step.roles.length > 0) {\n // Role-based: fetch candidates via role preview\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = true; return next;\n });\n const calls = step.roles.map(r => this.approvalSvc!.previewRole(r.orgCode, r.positionLevel));\n const source$ = calls.length > 0\n ? forkJoin(calls)\n : of([] as RolePreviewUserDto[][]);\n\n source$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (results: RolePreviewUserDto[][]) => {\n const merged = new Map<string, RolePreviewUserDto>();\n \n // results is already a flat array of all candidates across all roles\n results.forEach(roleList => roleList.forEach(u => merged.set(u.userId, u)));\n\n const candidates = Array.from(merged.values());\n\n this.stepCandidates.update(c => {\n const next = [...c]; next[i] = candidates; return next;\n });\n\n if (candidates.length === 1) {\n this.stepSelectedUsers.update(u => {\n const next = [...u]; next[i] = candidates[0].userId; return next;\n });\n }\n\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n },\n error: () => {\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n }\n });\n } else if (step.assigneeUserIds && step.assigneeUserIds.length > 0 && config) {\n // Search-selected employees: resolve IDs to display names\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = true; return next;\n });\n const base = config.apiBaseUrl.replace(/\\/$/, '');\n const opts = { withCredentials: config.withCredentials ?? true };\n const calls = step.assigneeUserIds.map(uid =>\n this.http.get<any>(`${base}/urs/users/${encodeURIComponent(uid)}`, opts)\n );\n forkJoin(calls)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: results => {\n this.stepCandidates.update(c => {\n const next = [...c]; \n next[i] = results.map((u: any) => ({\n userId: u.id || u.Id, \n fullName: u.fullName || u.FullName || u.userName || u.UserName,\n department: u.department || u.Department,\n position: u.position || u.Position,\n employeeCode: u.employeeCode || u.EmployeeCode\n } as RolePreviewUserDto)); \n return next;\n });\n \n // Single assignee - pre-select automatically\n if (this.stepCandidates()[i].length === 1) {\n this.stepSelectedUsers.update(u => {\n const next = [...u]; next[i] = this.stepCandidates()[i][0].userId; return next;\n });\n }\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n },\n error: () => {\n this.stepLoadingCandidates.update(c => {\n const next = [...c]; next[i] = false; return next;\n });\n }\n });\n }\n });\n }\n\n onStepUserChange(stepIndex: number, event: Event) {\n this.stepSelectedUsers.update(u => { \n const next = [...u]; next[stepIndex] = (event.target as HTMLSelectElement).value; return next;\n });\n }\n\n onStepUserChangeInput(stepIndex: number, userId: string) {\n this.stepSelectedUsers.update(u => {\n const next = [...u]; next[stepIndex] = userId; return next;\n });\n this.candidateSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = ''; return copy; });\n this.candidateSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n }\n\n private normalize(str: string | undefined): string {\n if (!str) return '';\n return str\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/đ/g, 'd')\n .replace(/Đ/g, 'D')\n .toLowerCase();\n }\n onCandidateSearchInput(stepIndex: number, query: string) {\n this.candidateSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = query; return copy; });\n if (!query || query.length < 2) {\n this.candidateSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = this.stepCandidates()[stepIndex]; return copy; });\n return;\n }\n const q = this.normalize(query);\n this.candidateSearchResults.update(r => {\n const copy = [...r];\n copy[stepIndex] = this.stepCandidates()[stepIndex].filter(u =>\n this.normalize(u.fullName).includes(q)\n || this.normalize(u.employeeCode).includes(q)\n || this.normalize(u.department).includes(q)\n || this.normalize(u.position).includes(q)\n );\n return copy;\n });\n }\n\n clearCandidateResults(stepIndex: number) {\n this.candidateSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n }\n\n onTemplateChange(event: Event) {\n const val = (event.target as HTMLSelectElement).value;\n this.selectedTemplateId.set(val ? parseInt(val, 10) : null);\n this.selectedTemplate.set(null);\n if (this.selectedTemplateId()) {\n this.loadTemplateDetail(this.selectedTemplateId()!);\n }\n }\n\n addStep() {\n this.adHocSteps.update(steps => {\n const order = steps.length + 1;\n return [...steps, { stepOrder: order, stepName: `Step ${order}`, approverUserIds: [] }];\n });\n this.userSearchQuery.update(q => [...q, '']);\n this.userSearchResults.update(r => [...r, []]);\n }\n\n removeStep(i: number) {\n this.adHocSteps.update(steps => {\n const copy = steps.filter((_, idx) => idx !== i);\n copy.forEach((s, idx) => s.stepOrder = idx + 1);\n return copy;\n });\n this.userSearchQuery.update(q => q.filter((_, idx) => idx !== i));\n this.userSearchResults.update(r => r.filter((_, idx) => idx !== i));\n }\n\n updateStepName(stepIndex: number, name: string) {\n this.adHocSteps.update(steps => {\n const copy = [...steps];\n copy[stepIndex] = { ...copy[stepIndex], stepName: name };\n return copy;\n });\n }\n\n addApprover(stepIndex: number, userId: string) {\n this.adHocSteps.update(steps => {\n const copy = [...steps];\n const step = copy[stepIndex];\n if (!step.approverUserIds.includes(userId)) {\n copy[stepIndex] = { ...step, approverUserIds: [...step.approverUserIds, userId] };\n }\n return copy;\n });\n this.userSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = ''; return copy; });\n this.userSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n }\n\n removeApprover(stepIndex: number, approverIndex: number) {\n this.adHocSteps.update(steps => {\n const copy = [...steps];\n const step = copy[stepIndex];\n const newApprovers = [...step.approverUserIds];\n newApprovers.splice(approverIndex, 1);\n copy[stepIndex] = { ...step, approverUserIds: newApprovers };\n return copy;\n });\n }\n\n addReference(userId: string) {\n if (!this.referenceUserIds().includes(userId)) {\n this.referenceUserIds.update(ids => [...ids, userId]);\n }\n this.refSearchQuery.set('');\n this.refSearchResults.set([]);\n }\n\n removeReference(j: number) {\n this.referenceUserIds.update(ids => ids.filter((_, idx) => idx !== j));\n }\n\n onUserSearchInput(stepIndex: number, query: string) {\n this.userSearchQuery.update(q => { const copy = [...q]; copy[stepIndex] = query; return copy; });\n if (!query || query.length < 2) {\n this.userSearchResults.update(r => { const copy = [...r]; copy[stepIndex] = []; return copy; });\n return;\n }\n this.searchUsers(query).then(r => {\n this.userSearchResults.update(results => { const copy = [...results]; copy[stepIndex] = r; return copy; });\n });\n }\n\n onRefSearchInput(query: string) {\n this.refSearchQuery.set(query);\n if (!query || query.length < 2) { this.refSearchResults.set([]); return; }\n this.searchUsers(query).then(r => this.refSearchResults.set(r));\n }\n\n private searchUsers(query: string): Promise<any[]> {\n const config = this.mesAuth.getConfig();\n if (!config) return Promise.resolve([]);\n const url = `${config.apiBaseUrl.replace(/\\/$/, '')}/urs/users?search=${encodeURIComponent(query)}&page=1&pageSize=20`;\n return firstValueFrom(\n this.http.get<any>(url, { withCredentials: config.withCredentials ?? true })\n ).then((r: any) => {\n const items = r?.data || r?.Data || r?.items || r || [];\n return (Array.isArray(items) ? items : []).map((u: any) => ({\n id: u.id || u.Id,\n userName: u.userName || u.UserName,\n fullName: u.fullName || u.FullName,\n email: u.email || u.Email,\n department: u.department || u.Department,\n position: u.position || u.Position,\n employeeCode: u.employeeCode || u.EmployeeCode\n }));\n }).catch(() => []);\n }\n\n async submit() {\n if (this.submitting()) return;\n\n if (this.errorMessage()) return;\n\n // Emit before capture so parent can hide edit controls (inputs, buttons)\n // then wait one tick for Angular CD to update the DOM before snapshotting\n this.approvalSubmitting.emit();\n await new Promise(resolve => setTimeout(resolve));\n\n this.submitting.set(true);\n\n try {\n const contentHtml = await this.captureContent();\n const thumbnailBase64 = await this.captureThumbnail().catch(() => undefined);\n\n const request: CreateApprovalRequest = {\n title: this.title(),\n description: this.description(),\n contentHtml,\n thumbnailBase64,\n referenceId: this.referenceId(),\n callbackUrl: this.callbackUrl(),\n deadlineHours: this.deadlineHours(),\n referenceUserIds: this.referenceUserIds().length > 0 ? this.referenceUserIds() : undefined\n };\n\n if (this.routingMode() === 'template') {\n request.templateId = this.selectedTemplateId() ?? this.templateIds()?.[0];\n // If template has role-based steps with selected approvers, pass explicit steps\n if (this.selectedTemplate()) {\n const hasSelectableSteps = this.selectedTemplate()!.steps.some(\n (s, i) => (this.stepCandidates()[i]?.length ?? 0) > 0\n );\n if (hasSelectableSteps) {\n request.steps = this.selectedTemplate()!.steps.map((s, i) => ({\n stepOrder: s.stepOrder,\n stepName: s.stepName,\n mode: s.mode,\n approverUserIds: this.stepSelectedUsers()[i]\n ? [this.stepSelectedUsers()[i]]\n : (this.stepCandidates()[i] && this.stepCandidates()[i].length > 0\n ? this.stepCandidates()[i].map(u => u.userId)\n : s.assigneeUserIds) // fallback to original assignees if no selection made\n }));\n }\n }\n } else {\n request.steps = this.adHocSteps().map((s, i) => ({\n stepOrder: i + 1,\n stepName: s.stepName,\n mode: ApprovalStepMode.Sequential,\n approverUserIds: s.approverUserIds\n }));\n }\n\n this.approvalSvc!.createApproval(request).subscribe({\n next: (result) => {\n this.isSubmitted.set(true);\n this.submitting.set(false);\n this.approvalSubmitted.emit({ documentId: result.documentId, message: result.message });\n },\n error: (err) => {\n this.submitting.set(false);\n this.submitResultError.set(err?.error?.message || 'Failed to submit approval. Please try again.');\n }\n });\n } catch (err: any) {\n this.submitting.set(false);\n this.submitResultError.set(err?.message || 'Failed to capture content.');\n }\n }\n\n onCancel() {\n this.cancelled.emit();\n }\n\n // ====================== Content Capture ======================\n\n async captureContent(): Promise<string> {\n const host = this.contentBody.nativeElement;\n\n // Step 1: Build canvas -> img map from the live DOM\n const canvasMap = new Map<Element, HTMLImageElement>();\n host.querySelectorAll('canvas').forEach((canvas) => {\n try {\n const img = document.createElement('img');\n img.src = (canvas as HTMLCanvasElement).toDataURL('image/png');\n img.style.width = canvas.offsetWidth + 'px';\n img.style.height = canvas.offsetHeight + 'px';\n canvasMap.set(canvas, img);\n } catch {}\n });\n\n // Step 2: Deep clone\n const clone = host.cloneNode(true) as HTMLElement;\n\n // Step 3: Replace canvas nodes in clone with img snapshots\n const originalCanvases = Array.from(host.querySelectorAll('canvas'));\n clone.querySelectorAll('canvas').forEach((cloneCanvas, idx) => {\n const img = canvasMap.get(originalCanvases[idx]);\n if (img) cloneCanvas.replaceWith(img.cloneNode(true));\n });\n\n // Step 4: Inline all <img> sources as base64 data URIs for content integrity\n const imgElements = Array.from(clone.querySelectorAll('img')) as HTMLImageElement[];\n await Promise.all(imgElements.map(async (img) => {\n const src = img.getAttribute('src');\n if (!src || src.startsWith('data:')) return;\n try {\n const resp = await fetch(src, { mode: 'cors', credentials: 'same-origin' });\n if (!resp.ok) return;\n const blob = await resp.blob();\n const dataUri = await new Promise<string>((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n img.setAttribute('src', dataUri);\n } catch { /* keep original src if fetch fails */ }\n }));\n\n // Step 5: Inline only essential layout styles (skip colors, widths, cursors)\n const liveElements = Array.from(host.querySelectorAll('*'));\n const cloneElements = Array.from(clone.querySelectorAll('*'));\n const styleProps = this.getStyleProperties();\n\n liveElements.forEach((liveEl, i) => {\n const cloneEl = cloneElements[i] as HTMLElement;\n if (!cloneEl || typeof cloneEl.setAttribute !== 'function') return;\n try {\n const computed = window.getComputedStyle(liveEl as Element);\n const styles: string[] = [];\n styleProps.forEach(prop => {\n const val = computed.getPropertyValue(prop);\n if (val && val !== '' && val !== 'initial' && val !== 'normal' && val !== 'none' && val !== 'auto') {\n styles.push(`${prop}:${val}`);\n }\n });\n if (styles.length) cloneEl.setAttribute('style', styles.join(';'));\n } catch {}\n });\n\n // Step 6: Strip scripts, Angular attributes, style/link tags, and form elements\n clone.querySelectorAll('script, link, style').forEach(el => el.remove());\n clone.querySelectorAll('*').forEach(el => {\n Array.from(el.attributes).forEach(attr => {\n if (attr.name.startsWith('_ngcontent-') ||\n attr.name.startsWith('_nghost-') ||\n attr.name.startsWith('ng-reflect-') ||\n attr.name.startsWith('ng-version') ||\n attr.name.startsWith('on') ||\n attr.name === 'cformcontrol' ||\n attr.name === 'clabel') {\n el.removeAttribute(attr.name);\n }\n });\n el.removeAttribute('class');\n });\n\n // Step 7: Wrap in a clean, print-friendly HTML document\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n margin: 0; padding: 24px;\n color: #212121; background: #fff;\n font-size: 14px; line-height: 1.6;\n max-width: 210mm;\n }\n h1, h2, h3, h4, h5, h6 { color: #1565c0; margin: 0 0 12px; }\n p { margin: 0 0 8px; }\n img { max-width: 100%; }\n table { border-collapse: collapse; width: 100%; }\n td, th { padding: 8px 12px; border: 1px solid #ddd; text-align: left; vertical-align: top; }\n input, textarea, select {\n border: 1px solid #ccc; border-radius: 4px; padding: 6px 10px;\n font-size: 14px; width: 100%; background: #fafafa; color: #333;\n }\n label { font-weight: 500; display: block; margin-bottom: 4px; color: #333; }\n div { max-width: 100%; }\n </style>\n</head>\n<body>\n${clone.outerHTML}\n</body>\n</html>`;\n }\n\n private async captureThumbnail(): Promise<string | undefined> {\n const html2canvas = (window as any)['html2canvas'];\n if (!html2canvas) return undefined;\n\n const canvas: HTMLCanvasElement = await html2canvas(this.contentBody.nativeElement, {\n scale: 1, useCORS: true, logging: false, width: 600, height: 400\n });\n return canvas.toDataURL('image/png').split(',')[1];\n }\n\n private getStyleProperties(): string[] {\n return [\n 'font-size', 'font-weight', 'font-style', 'line-height', 'text-align', 'text-decoration',\n 'border', 'border-top', 'border-right', 'border-bottom', 'border-left',\n 'border-width', 'border-style', 'border-radius',\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'display', 'flex-direction', 'flex-wrap', 'justify-content', 'align-items', 'gap',\n 'vertical-align', 'table-layout', 'border-collapse', 'border-spacing',\n 'text-transform', 'letter-spacing', 'white-space', 'word-break'\n ];\n }\n}\n","<div class=\"arv-container\">\n <!-- Content Area -->\n <div class=\"arv-content-body\" #contentBody>\n <ng-content></ng-content>\n </div>\n\n <!-- Approval Footer -->\n <div class=\"arv-footer\">\n @if (!isSubmitted()) {\n <div class=\"arv-footer-inner\">\n\n <!-- Routing mode -->\n <div class=\"arv-routing\">\n <div class=\"arv-routing-header\">\n <h4 class=\"arv-section-title\">Approval Routing</h4>\n <!-- Show routing toggle only when templateId is NOT locked to a single template -->\n @if (!templateIds() || templateIds()!.length <= 0) {\n <div class=\"arv-routing-mode\">\n <label class=\"arv-radio\">\n <input type=\"radio\" name=\"routingMode\" value=\"template\" [checked]=\"routingMode() === 'template'\" (change)=\"routingMode.set('template')\"> Use Template\n </label>\n <label class=\"arv-radio\">\n <input type=\"radio\" name=\"routingMode\" value=\"adhoc\" [checked]=\"routingMode() === 'adhoc'\" (change)=\"routingMode.set('adhoc')\"> Custom Steps\n </label>\n </div>\n }\n </div>\n\n <!-- Locked template: only when templateId set and no multi-choice -->\n @if (templateIds() && templateIds()!.length === 1 && routingMode() === 'template') {\n <div class=\"arv-template-select\">\n @if (loadingTemplate()) {\n <div class=\"arv-template-loading\">Loading template...</div>\n }\n @if (selectedTemplate() && !loadingTemplate()) {\n <div class=\"arv-locked-template\">\n <span class=\"arv-locked-label\">Template</span>\n <span class=\"arv-locked-name\">{{ selectedTemplate()!.name }}</span>\n </div>\n }\n </div>\n }\n <!-- Template selector: shown when no templateId, OR when templateIds has multiple choices -->\n @else if (routingMode() === 'template') {\n <div class=\"arv-template-select\">\n <label class=\"arv-label\">Select Template</label>\n <select class=\"arv-select\" (change)=\"onTemplateChange($event)\">\n <option value=\"\">-- Select a template --</option>\n @for (t of templates(); track t.id) {\n <option [value]=\"t.id\" [selected]=\"t.id === selectedTemplateId()\">{{ t.name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Step pickers (shared for both locked and free template) -->\n @if (routingMode() === 'template') {\n <div class=\"arv-template-select\">\n @if (!loadingTemplate() && selectedTemplate()) {\n <!-- arv-template-steps -->\n <div class=\"arv-steps\">\n @for (s of selectedTemplate()!.steps; track s.stepOrder; let i = $index) {\n <div class=\"arv-step\">\n <div class=\"arv-step-card-header\">\n <span class=\"arv-step-preview-num\">Step {{ s.stepOrder }}</span>\n <span class=\"arv-step-preview-name\">{{ s.stepName }}</span>\n @if(isStepsError()[i]) {\n <span class=\"arv-step-error\">Required (*)</span>\n }\n @if (s.roles && s.roles.length > 0) {\n <span class=\"arv-step-role-badge\">\n @for (r of s.roles; track r.id) {\n {{ r.positionLevel }}{{ r.orgName ? ' · ' + r.orgName : '' }}{{ r !== s.roles[s.roles.length - 1] ? ', ' : '' }}\n } \n </span>\n }\n </div>\n <!-- Selectable step: show approver picker -->\n @if (stepCandidates()[i]?.length > 1 || stepLoadingCandidates()[i]) {\n @if (stepLoadingCandidates()[i]) {\n <div class=\"arv-template-loading\">Loading candidates...</div>\n }\n @if (!stepLoadingCandidates()[i]) {\n <div class=\"arv-approvers\">\n <div class=\"arv-approver-tags\">\n @if (stepSelectedUsers()[i]) {\n <span class=\"arv-tag\">\n <ma-ux [userId]=\"stepSelectedUsers()[i]\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n <button class=\"arv-tag-remove\" (click)=\"onStepUserChangeInput(i, '')\">x</button>\n </span>\n }\n </div>\n @if (!stepSelectedUsers()[i]) {\n <div class=\"arv-user-search arv-step-picker\">\n <input class=\"arv-input arv-input-sm\" [value]=\"candidateSearchQuery()[i] || ''\"\n (input)=\"onCandidateSearchInput(i, $any($event.target).value)\"\n (focus)=\"onCandidateSearchInput(i, candidateSearchQuery()[i] || '')\"\n (blur)=\"clearCandidateResults(i)\"\n placeholder=\"Search approver...\" />\n @if (candidateSearchResults()[i]?.length) {\n <div class=\"arv-search-results\">\n @for (u of candidateSearchResults()[i]; track u.userId) {\n <div class=\"arv-search-item\" (mousedown)=\"onStepUserChangeInput(i, u.userId)\">\n <ma-ux [userId]=\"u.userId\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n }\n <!-- Single fixed-user step: show who is assigned -->\n @if (!stepLoadingCandidates()[i] && stepCandidates()[i]?.length === 1) {\n <div class=\"arv-step-fixed\">\n <ma-ux [userId]=\"stepCandidates()[i][0].userId\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n @if (selectedTemplate() && selectedTemplate()!.referenceUserIds.length > 0) {\n <div class=\"arv-step-preview arv-step-preview-cc\">\n <span class=\"arv-step-preview-num\">CC</span>\n <span class=\"arv-step-preview-name\">{{ selectedTemplate()!.referenceUserIds.length }} reference user(s) from template</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Ad-hoc steps -->\n @if (routingMode() === 'adhoc') {\n <div class=\"arv-steps\">\n @for (step of adHocSteps(); track step.stepOrder; let i = $index) {\n <div class=\"arv-step\">\n <div class=\"arv-step-header\">\n <span class=\"arv-step-num\">Step {{ i + 1 }}</span>\n @if (isStepsError()[i]) {\n <span class=\"arv-step-error\">Required (*)</span>\n }\n <input class=\"arv-input\" [value]=\"step.stepName\" (input)=\"updateStepName(i, $any($event.target).value)\" placeholder=\"Step name\" />\n <button class=\"arv-btn-icon arv-btn-danger\" (click)=\"removeStep(i)\" title=\"Remove step\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n <div class=\"arv-approvers\">\n <div class=\"arv-approver-tags\">\n @for (uid of step.approverUserIds; track uid; let j = $index) {\n <span class=\"arv-tag\">\n <ma-ux [userId]=\"uid\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n <button class=\"arv-tag-remove\" (click)=\"removeApprover(i, j)\">x</button>\n </span>\n }\n </div>\n @if (step.approverUserIds.length === 0) {\n <div class=\"arv-user-search\">\n <input class=\"arv-input arv-input-sm\" [value]=\"userSearchQuery()[i] || ''\"\n (input)=\"onUserSearchInput(i, $any($event.target).value)\"\n placeholder=\"Search approver...\" />\n @if (userSearchResults()[i]?.length) {\n <div class=\"arv-search-results\">\n @for (u of userSearchResults()[i]; track u.id) {\n <div class=\"arv-search-item\" (mousedown)=\"addApprover(i, u.id)\">\n <ma-ux [userId]=\"u.id\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <button class=\"arv-btn arv-btn-outline\" (click)=\"addStep()\">+ Add Step</button>\n </div>\n }\n </div>\n\n <!-- Reference / CC users -->\n <div class=\"arv-references\">\n <h4 class=\"arv-section-title\">CC / Reference</h4>\n <p class=\"arv-hint\">These users will be notified when the approval completes, but won't be asked to approve.</p>\n <div class=\"arv-approver-tags\">\n @for (uid of referenceUserIds(); track uid; let j = $index) {\n <span class=\"arv-tag\">\n <ma-ux [userId]=\"uid\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n <button class=\"arv-tag-remove\" (click)=\"removeReference(j)\">x</button>\n </span>\n }\n </div>\n <div class=\"arv-user-search\">\n <input class=\"arv-input arv-input-sm\" [value]=\"refSearchQuery()\"\n (input)=\"onRefSearchInput($any($event.target).value)\"\n placeholder=\"Search CC user...\" />\n @if (refSearchResults().length) {\n <div class=\"arv-search-results\">\n @for (u of refSearchResults(); track u.id) {\n <div class=\"arv-search-item\" (mousedown)=\"addReference(u.id)\">\n <ma-ux [userId]=\"u.id\" [useDefault]=\"true\" [showTitle]=\"false\"/>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"arv-actions\">\n <button class=\"arv-btn arv-btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"arv-btn arv-btn-primary\" [disabled]=\"submitting() || isError()\" (click)=\"submit()\">\n @if (submitting()) {\n <span class=\"arv-spinner\"></span>\n }\n {{isError() ? 'Complete Form to Submit' : submitting() ? 'Submitting...' : 'Submit for Approval' }}\n </button>\n </div>\n\n @if (errorMessage() || submitResultError()) {\n <div class=\"arv-error\">{{ errorMessage() || submitResultError() }}</div>\n }\n </div>\n }\n </div>\n\n <!-- Success state -->\n @if (isSubmitted()) {\n <div class=\"arv-success\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#66bb6a\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n <p>Submitted for approval successfully.</p>\n </div>\n }\n</div>\n","import { inject } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { withXMaPerm } from './x-ma-perm.pipe';\n\nexport interface RequestConfig {\n url: string;\n params?: HttpParams | Record<string, string | string[]>;\n}\n\nexport function xMaResource<T>(request: () => RequestConfig) {\n const http = inject(HttpClient);\n\n return rxResource({\n params: () => request(),\n stream: ({ params: { url, params } }) =>\n http\n .get<T>(url, { observe: 'response', params })\n .pipe(withXMaPerm()),\n });\n}","import { Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * MaIconComponent\n * Renders an SVG icon from the server-hosted sprite.\n * The sprite URL is derived from the stylesheet link injected by MesAuthService,\n * so changing the sprite on the server updates icons without a package rebuild.\n *\n * Selector: <ma-icon name=\"bell\" [size]=\"20\" />\n *\n * When the sprite is not available, falls back to inline SVG definitions\n * for the icons used internally by the library (bell, check, close, etc.).\n *\n * This component is intentionally lightweight — it is the single place where\n * icon SVG is defined, replacing the repeated inline <svg> blocks that were\n * scattered across every component template.\n */\n@Component({\n selector: 'ma-icon',\n template: `<span class=\"ma-icon\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [innerHTML]=\"svgContent()\"></span>`,\n styles: [`\n :host { display: inline-flex; align-items: center; justify-content: center; }\n .ma-icon { display: flex; align-items: center; justify-content: center; }\n .ma-icon svg { display: block; }\n `]\n})\nexport class MaIconComponent {\n name = input('');\n size = input(18);\n stroke = input('currentColor');\n strokeWidth = input(2);\n\n private sanitizer = inject(DomSanitizer);\n\n svgContent = computed<SafeHtml>(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.buildSvg())\n );\n\n private buildSvg(): string {\n const w = this.size();\n const h = this.size();\n const s = this.stroke();\n const sw = this.strokeWidth();\n const base = `xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${s}\" stroke-width=\"${sw}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`;\n\n switch (this.name()) {\n case 'bell':\n return `<svg ${base}><path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/></svg>`;\n case 'check':\n return `<svg ${base}><polyline points=\"20 6 9 17 4 12\"/></svg>`;\n case 'check-circle':\n return `<svg ${base}><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22 4 12 14.01 9 11.01\"/></svg>`;\n case 'close':\n return `<svg ${base}><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\n case 'alert-triangle':\n return `<svg ${base}><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>`;\n case 'x-circle':\n return `<svg ${base}><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`;\n case 'clipboard-check':\n return `<svg ${base}><path d=\"M9 11l3 3L22 4\"/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"/></svg>`;\n case 'trash':\n return `<svg ${base}><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/><path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/></svg>`;\n case 'user':\n return `<svg ${base}><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`;\n case 'log-out':\n return `<svg ${base}><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><polyline points=\"16 17 21 12 16 7\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/></svg>`;\n default:\n return `<svg ${base}><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`;\n }\n }\n}\n","import { Directive, HostBinding, inject } from '@angular/core';\nimport { ThemeService } from './theme.service';\n\n/**\n * MaThemeDirective\n * Apply `maTheme` to any element or component that needs automatic theme-class binding.\n * Adds `theme-light` or `theme-dark` to the host element's class list and keeps it\n * in sync with ThemeService, replacing the duplicated @HostBinding + subscription\n * pattern that was repeated in every component.\n *\n * Usage:\n * <div maTheme> ... </div>\n *\n * Or as a hostDirective in a component:\n * @Component({ hostDirectives: [MaThemeDirective], ... })\n */\n@Directive({\n selector: '[maTheme]'\n})\nexport class MaThemeDirective {\n private themeService = inject(ThemeService);\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n}\n","export enum MaUserMenuColor {\n Default = 'default',\n Primary = 'primary',\n Success = 'success',\n Warning = 'warning',\n Danger = 'danger',\n Info = 'info',\n}\n","import { Component, booleanAttribute, input, output } from '@angular/core';\nimport { MaUserMenuColor } from './ma-user-menu-color';\n\n@Component({\n selector: 'ma-user-menu',\n templateUrl: './ma-user-menu.component.html',\n styleUrl: './ma-user-menu.component.css',\n})\nexport class MaUserMenuComponent {\n name = input.required<string>();\n color = input<MaUserMenuColor>(MaUserMenuColor.Default);\n disabled = input(false, { transform: booleanAttribute }); \n\n itemClick = output<void>();\n\n onClick() {\n if (this.disabled()) return;\n this.itemClick.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"ma-user-menu-btn\"\n [class]=\"'ma-user-menu--' + color()\"\n [disabled]=\"disabled()\"\n (click)=\"onClick()\">\n <span class=\"ma-user-menu-icon\">\n <ng-content select=\"[maUserMenuIcon]\"></ng-content>\n </span>\n <span class=\"ma-user-menu-name\">{{ name() }}</span>\n</button>\n","import { firstValueFrom } from 'rxjs';\nimport { MesAuthService } from './mes-auth.service';\n\n/**\n * Invoked by the /sso/check page component on init.\n *\n * Flow:\n * 1. Verify the page is inside an iframe (window !== window.parent).\n * 2. Fetch the list of allowed peer origins from the backend.\n * 3. If the opener's origin is in the allow-list, get a short-lived SSO token\n * from this host's /auth/sso-token endpoint (uses the current session cookie).\n * 4. postMessage the result back to the opener.\n *\n * If the user is not logged in, /auth/sso-token returns 401 → post { ok: false }.\n */\nexport async function runSsoCheckHandshake(authService: MesAuthService): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const parentOrigin = document.referrer\n ? new URL(document.referrer).origin\n : null;\n\n const postResult = (ok: boolean, token?: string) => {\n if (!parentOrigin) return;\n window.parent.postMessage(\n { type: 'sso-check-result', ok, ...(token ? { token } : {}) },\n parentOrigin\n );\n };\n\n // Ensure we're inside an iframe\n if (window === window.parent) {\n // Direct navigation — nothing to do\n return;\n }\n\n if (!parentOrigin) {\n postResult(false);\n return;\n }\n\n try {\n // Check if the parent origin is allowed\n const peers = await firstValueFrom(authService.getSsoAllowedPeers());\n const allowed = peers.some(p => p.peerOrigin === parentOrigin);\n if (!allowed) {\n postResult(false);\n return;\n }\n\n // Get a short-lived SSO exchange token from the local backend\n const { token } = await firstValueFrom(authService.getSsoToken());\n postResult(true, token);\n } catch {\n // User not logged in (401) or network error — not an SSO session\n postResult(false);\n }\n}\n\n/**\n * Invoked by the login page component after a successful local login.\n *\n * If the URL contains `return_via=postMessage&target_origin=<url>`, this function\n * posts the newly issued SSO token back to the opener window and closes this popup.\n *\n * @returns true if it handled the return-via flow (caller should NOT do normal navigation).\n */\nexport async function runReturnViaPostMessageIfRequested(authService: MesAuthService): Promise<boolean> {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n const returnVia = params.get('return_via');\n const targetOrigin = params.get('target_origin');\n\n if (returnVia !== 'postMessage' || !targetOrigin) return false;\n\n try {\n const { token } = await firstValueFrom(authService.getSsoToken());\n window.opener?.postMessage(\n { type: 'sso-check-result', ok: true, token },\n targetOrigin\n );\n } catch {\n window.opener?.postMessage(\n { type: 'sso-check-result', ok: false },\n targetOrigin\n );\n }\n\n // Close the popup after a short delay so the postMessage can be dispatched\n setTimeout(() => window.close(), 300);\n return true;\n}\n","/**\n * Public AI types exported from mesauth-angular.\n *\n * The library ships a chat panel that talks to MesAuth.Api's /ai/chat SSE endpoint.\n * Consumer apps may register additional client-side tools that the AI can invoke\n * to drive their UI (navigation, dialogs, etc.) via provideMesAuthAi().\n */\n\n/**\n * A tool the host app registers. The AI may call it; the handler runs in the browser\n * with the application's DI container available via Angular's inject() in the handler.\n *\n * `parameters` is a JSON schema (object type). Use `readOnly: true` to skip the\n * confirm card for safe operations like navigation. Anything that mutates server state\n * or is hard to undo should have readOnly: false (default).\n */\nexport interface ClientTool {\n name: string;\n description: string;\n parameters: ClientToolSchema;\n readOnly?: boolean;\n /**\n * Handler executed when the AI calls this tool.\n * Return a string (or anything JSON-serializable) describing the outcome; this is\n * fed back to the AI as the tool result. Throw to signal failure.\n */\n handler: (args: any) => Promise<unknown> | unknown;\n}\n\nexport interface ClientToolSchema {\n type: 'object';\n properties?: Record<string, unknown>;\n required?: string[];\n [k: string]: unknown;\n}\n\n/** A single message in the chat panel UI (different from the on-wire format). */\nexport interface ChatBubble {\n id: string;\n role: 'user' | 'assistant' | 'tool';\n /** Plain-text content (assistant + user). For tool: short summary. */\n text: string;\n /** Server tool calls that ran in this assistant turn (rendered as chips). */\n toolEvents?: ChatToolEvent[];\n pending?: boolean;\n}\n\nexport interface ChatToolEvent {\n id: string;\n name: string;\n side: 'server' | 'client';\n status: 'running' | 'ok' | 'error' | 'awaiting-approval' | 'declined';\n summary?: string;\n args?: any;\n readOnly?: boolean;\n}\n\n/** Stream event types matching MesAuth.Api's AiStreamEvent JSON. */\nexport type AiSseEvent =\n | { type: 'session'; sessionId: string }\n | { type: 'token'; text: string }\n | { type: 'tool_call_started'; id: string; name: string; args: any; side: 'server' | 'client'; readOnly?: boolean }\n | { type: 'tool_call_completed'; id: string; ok: boolean; summary?: string }\n | { type: 'client_tool_call'; id: string; name: string; args: any; side: 'client'; readOnly?: boolean }\n | { type: 'error'; message: string }\n | { type: 'done' };\n","// Public surface of the AI module inside mesauth-angular.\nexport * from './ma-ai.models';\nexport * from './ma-ai-config';\nexport * from './ma-ai.service';\nexport * from './ma-ai-tools.registry';\nexport * from './ma-ai-button.component';\nexport * from './ma-ai-chat-panel.component';\nexport * from './ma-ai-markdown.pipe';\n","// mesauth-angular — primary entry point (backward compatible)\n// Re-exports everything so existing imports from 'mesauth-angular' continue to work.\n// Prefer importing from 'mesauth-angular/core' or 'mesauth-angular/ui' for\n// better tree-shaking and to express which layer you depend on.\n\nexport * from './mes-auth.service';\nexport * from './mes-auth.interceptor';\nexport * from './mes-auth.module';\nexport * from './user-profile.component';\nexport * from './ma-user.component';\nexport * from './ma-ux.component';\nexport * from './notification-badge.component';\nexport * from './notification-panel.component';\nexport * from './toast-container.component';\nexport * from './toast.service';\nexport * from './theme.service';\nexport * from './approval.models';\nexport * from './approval.service';\nexport * from './ma-arv-container.component';\nexport * from './ma-approval-panel.component';\nexport * from './x-ma-perm.pipe';\nexport * from './x-ma-resource';\nexport * from './ma-ui-config.service';\nexport * from './ma-icon.component';\nexport * from './ma-theme.directive';\nexport * from './ma-avatar.component';\nexport * from './ma-user-menu.component';\nexport * from './ma-user-menu-color';\nexport * from './sso-handshake.helper';\nexport * from './ai';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError","switchMap"],"mappings":"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"}