mesauth-angular 1.8.6 → 1.8.8

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/mes-auth.service.ts","../../src/mes-auth.interceptor.ts","../../src/mes-auth.module.ts","../../src/theme.service.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/ma-user.component.ts","../../src/ma-user.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-perm.pipe.ts","../../src/x-ma-resource.ts","../../src/ma-icon.component.ts","../../src/ma-theme.directive.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. */\nconst PACKAGE_VERSION = '1.8.6';\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\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\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\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 { inject, Injectable, InjectionToken, EnvironmentProviders, makeEnvironmentProviders, provideAppInitializer, NgZone } from '@angular/core';\nimport { MaUiConfigService } from './ma-ui-config.service';\nimport { HttpClient } from '@angular/common/http';\nimport { HubConnection, HubConnectionBuilder, LogLevel } from '@microsoft/signalr';\nimport { BehaviorSubject, Subject, Observable, of, EMPTY } from 'rxjs';\nimport { tap, catchError } from 'rxjs/operators';\nimport { Router } from '@angular/router';\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\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 const ngZone = inject(NgZone);\n mesAuthService.init(config, httpClient, router, ngZone);\n })\n ]);\n}\n\nexport interface IUser {\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 tokenVersion?: string;\n permEndpoint?: string;\n perms?: Set<string>;\n employeeCode?: string;\n avatarPath?: string;\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 _currentUser = new BehaviorSubject<IUser | null>(null);\n public currentUser$: Observable<IUser | null> = this._currentUser.asObservable();\n private _notifications = new Subject<any>();\n public notifications$: Observable<any> = this._notifications.asObservable();\n private _approvalEvents = new Subject<any>();\n public 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 private ngZone: NgZone | null = null;\n\n constructor() {\n // Empty constructor - all dependencies passed to init()\n }\n\n init(config: MesAuthConfig, httpClient: HttpClient, router?: Router, ngZone?: NgZone) {\n this.config = config;\n this.http = httpClient;\n this.router = router;\n this.ngZone = ngZone ?? null;\n this.apiBase = config.apiBaseUrl.replace(/\\/$/, '');\n\n // Inject server-hosted theme CSS and manifest so visual/config changes\n // don't require a package republish.\n const assetsUrl = config.uiAssetsUrl || `${this.apiBase}/mesauth-angular/v1`;\n this.injectThemeStylesheet(assetsUrl);\n inject(MaUiConfigService).loadManifest(assetsUrl, httpClient);\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 const link = document.createElement('link');\n link.id = id;\n link.rel = 'stylesheet';\n link.href = `${assetsUrl}/themes/default.css`;\n document.head.appendChild(link);\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.next(u);\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.next(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 this.hubConnection.on('ReceiveNotification', (n: any) => {\n if (this.ngZone) {\n this.ngZone.run(() => this._notifications.next(n));\n } else {\n this._notifications.next(n);\n }\n });\n\n this.hubConnection.on('ApprovalCompleted', (e: any) => {\n if (this.ngZone) {\n this.ngZone.run(() => this._approvalEvents.next({ type: 'ApprovalCompleted', ...e }));\n } else {\n this._approvalEvents.next({ type: 'ApprovalCompleted', ...e });\n }\n });\n\n this.hubConnection.on('ApprovalStepChanged', (e: any) => {\n if (this.ngZone) {\n this.ngZone.run(() => this._approvalEvents.next({ type: 'ApprovalStepChanged', ...e }));\n } else {\n this._approvalEvents.next({ type: 'ApprovalStepChanged', ...e });\n }\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 return this.http.post(url, {}, { withCredentials: this.config?.withCredentials ?? true }).pipe(\n tap(() => {\n this._currentUser.next(null);\n this.stop();\n })\n );\n }\n\n public get currentUser(): IUser | null {\n return this._currentUser.value;\n }\n\n public get isAuthenticated(): boolean {\n return this._currentUser.value !== 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","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { throwError, timer } from 'rxjs';\nimport { catchError, switchMap } 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 return next(req).pipe(\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 { 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\n constructor() {\n this.detectTheme();\n this.startWatching();\n }\n\n ngOnDestroy(): void {\n this.stopWatching();\n }\n\n private detectTheme(): void {\n const html = document.documentElement;\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 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 this.observer = new MutationObserver(() => this.detectTheme());\n this.observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'theme', 'data-coreui-theme']\n });\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 refreshTheme(): void {\n this.detectTheme();\n }\n}\n","import { Component, HostBinding, HostListener, inject, output, signal } 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 { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ma-user-profile',\n imports: [],\n templateUrl: './user-profile.component.html',\n styleUrl: './user-profile.component.css'\n})\nexport class UserProfileComponent {\n notificationClick = output<void>();\n approvalClick = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n currentUser = signal<IUser | null>(null);\n unreadCount = signal(0);\n pendingApprovalCount = signal(0);\n dropdownOpen = signal(false);\n\n // Signal to force avatar refresh\n avatarRefresh = signal<number>(Date.now());\n\n private hasUser = false;\n\n private authService = inject(MesAuthService);\n private router = inject(Router);\n private themeService = inject(ThemeService);\n private http = inject(HttpClient);\n\n constructor() {\n this.authService.currentUser$\n .pipe(takeUntilDestroyed())\n .subscribe(user => {\n this.currentUser.set(user);\n this.hasUser = !!user;\n // Force avatar refresh when user changes\n this.avatarRefresh.set(Date.now());\n if (!this.hasUser) {\n this.unreadCount.set(0);\n this.pendingApprovalCount.set(0);\n } else {\n this.loadUnreadCount();\n this.loadPendingApprovalCount();\n }\n });\n\n // Listen for approval events (SignalR) to refresh pending count\n this.authService.approvalEvents$\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.hasUser) this.loadPendingApprovalCount();\n });\n\n // Listen for new real-time notifications (SignalR only)\n this.authService.notifications$\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.hasUser) {\n this.loadUnreadCount();\n }\n });\n }\n\n loadUnreadCount() {\n if (!this.hasUser) {\n this.unreadCount.set(0);\n return;\n }\n\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => {\n this.unreadCount.set(response.unreadCount || 0);\n },\n error: (err) => {}\n });\n }\n\n loadPendingApprovalCount() {\n if (!this.hasUser) { this.pendingApprovalCount.set(0); return; }\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 has avatarPath, use it directly\n if (user.avatarPath) {\n // If avatarPath is already a full URL, use it as-is\n if (user.avatarPath.startsWith('http://') || user.avatarPath.startsWith('https://')) {\n return user.avatarPath;\n }\n // If it's a relative path, construct full URL with refresh timestamp\n return `${baseUrl.replace(/\\/$/, '')}${user.avatarPath}?t=${refresh}`;\n }\n\n // Fallback: construct URL using userId\n const userId = user.userId;\n if (userId && baseUrl) {\n return `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatar?t=${refresh}`;\n }\n\n // Fallback to UI avatars service if no userId or baseUrl\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 @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 }\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 this.router.navigate(['/profile']);\n this.dropdownOpen.set(false);\n }\n\n onLogout() {\n this.authService.logout().subscribe({\n next: () => {\n this.dropdownOpen.set(false);\n\n // Navigate to login with return URL\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: (err) => {\n // Still navigate to login even if logout fails\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","<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 <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 <!-- Approval Button -->\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 <!-- 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 <div class=\"avatar-ring\" [class.active]=\"dropdownOpen()\">\n @if (currentUser().fullName || currentUser().userName) {\n <img\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName\"\n class=\"avatar\"\n />\n } @else {\n <span class=\"avatar-initial\">{{ getLastNameInitial(currentUser()) }}</span>\n }\n </div>\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 @if (currentUser().fullName || currentUser().userName) {\n <img\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName\"\n class=\"dropdown-avatar\"\n />\n } @else {\n <span class=\"dropdown-avatar-initial\">{{ getLastNameInitial(currentUser()) }}</span>\n }\n </div>\n <div class=\"dropdown-user-info\">\n <span class=\"dropdown-user-name\">{{ currentUser().fullName || currentUser().userName }}</span>\n @if (currentUser().position || currentUser().department) {\n <span class=\"dropdown-user-sub\">{{ currentUser().position || currentUser().department }}</span>\n }\n </div>\n </div>\n\n <div class=\"mes-dropdown-divider\"></div>\n\n <button class=\"mes-dropdown-item profile-link\" (click)=\"onViewProfile()\">\n <svg class=\"item-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" 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 View Profile\n </button>\n\n <div class=\"mes-dropdown-divider\"></div>\n\n <button class=\"mes-dropdown-item logout-item\" (click)=\"onLogout()\">\n <svg class=\"item-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" 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 Logout\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\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 toasts$ = new BehaviorSubject<Toast[]>([]);\n public toasts: Observable<Toast[]> = this.toasts$.asObservable();\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 = {\n id,\n message,\n title,\n type,\n duration\n };\n\n const currentToasts = this.toasts$.value;\n this.toasts$.next([...currentToasts, toast]);\n\n if (duration > 0) {\n setTimeout(() => {\n this.remove(id);\n }, duration);\n }\n\n return id;\n }\n\n remove(id: string) {\n const currentToasts = this.toasts$.value;\n this.toasts$.next(currentToasts.filter(t => t.id !== id));\n }\n\n clear() {\n this.toasts$.next([]);\n }\n}\n","import { Component, HostBinding, inject } from '@angular/core';\nimport { ToastService, Toast } from './toast.service';\nimport { ThemeService } from './theme.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\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 toasts: Toast[] = [];\n\n private toastService = inject(ToastService);\n private themeService = inject(ThemeService);\n\n constructor() {\n this.toastService.toasts\n .pipe(takeUntilDestroyed())\n .subscribe(toasts => {\n this.toasts = toasts;\n });\n }\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 } 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 { takeUntilDestroyed } 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 isOpen = false;\n notifications = signal<NotificationDto[]>([]);\n activeTab: 'unread' | 'read' = 'unread';\n\n // Cached filtered lists — updated explicitly to avoid re-filtering on every CD cycle\n private _unreadNotifications = signal<NotificationDto[]>([]);\n private _readNotifications = signal<NotificationDto[]>([]);\n\n // Stable time-ago strings keyed by notification id — refreshed every 30s\n dateLabels: Map<string, string> = new Map();\n private dateTimer: ReturnType<typeof setInterval> | null = null;\n\n get unreadNotifications(): NotificationDto[] {\n return this._unreadNotifications();\n }\n\n get readNotifications(): NotificationDto[] {\n return this._readNotifications();\n }\n\n get currentNotifications(): NotificationDto[] {\n return this.activeTab === 'unread' ? this._unreadNotifications() : this._readNotifications();\n }\n\n selectedNotification: NotificationDto | null = null;\n selectedNotificationHtml: SafeHtml | null = null;\n selectedNotificationDate: string = '';\n\n // Returns plain text message for list display\n getNotificationMessage(notification: NotificationDto): string {\n return notification.message || '';\n }\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 to avoid NG0100 from live new Date() in template\n this.dateTimer = setInterval(() => this.refreshDateLabels(), 30000);\n\n // Listen for new real-time notifications\n this.authService.notifications$\n .pipe(takeUntilDestroyed())\n .subscribe((notification: RealTimeNotificationDto) => {\n // Show toast for new notification\n this.toastService.show(\n notification.message || '',\n notification.title,\n this.toastType(notification.type),\n 5000\n );\n // Reload notifications list\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({ // includeRead = true to get both read and unread\n next: (response: PagedList<NotificationDto>) => {\n this.notifications.set(response.items || []);\n this.onNotificationsChanged();\n },\n error: (err) => {}\n });\n }\n\n open() {\n this.isOpen = true;\n this.activeTab = 'unread'; // Reset to unread tab when opening\n }\n\n close() {\n this.isOpen = false;\n }\n\n switchTab(tab: 'unread' | 'read') {\n this.activeTab = tab;\n }\n\n openDetails(notification: NotificationDto) {\n this.selectedNotification = notification;\n // Cache computed values to avoid re-rendering on every change detection cycle\n const html = notification.messageHtml || notification.message || '';\n this.selectedNotificationHtml = this.sanitizer.bypassSecurityTrustHtml(html);\n this.selectedNotificationDate = this.formatDate(notification.createdAt);\n // Mark as read when opening details (if not already read)\n if (!notification.isRead) {\n this.authService.markAsRead(notification.id).subscribe({\n next: () => {\n notification.isRead = true;\n this.notificationRead.emit();\n this.onNotificationsChanged();\n },\n error: () => {}\n });\n }\n }\n\n closeDetails() {\n this.selectedNotification = null;\n this.selectedNotificationHtml = null;\n this.selectedNotificationDate = '';\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) {\n event.stopPropagation();\n }\n this.authService.markAsRead(notificationId).subscribe({\n next: () => {\n const notification = this.notifications().find(n => n.id === notificationId);\n if (notification) {\n notification.isRead = true;\n this.notificationRead.emit();\n this.onNotificationsChanged();\n }\n },\n error: (err) => {}\n });\n }\n\n markAllAsRead() {\n this.authService.markAllAsRead().subscribe({\n next: () => {\n this.notifications().forEach(n => n.isRead = true);\n this.notificationRead.emit();\n this.onNotificationsChanged();\n },\n error: (err) => {}\n });\n }\n\n deleteAllRead() {\n const readNotificationIds = this.notifications()\n .filter(n => n.isRead)\n .map(n => n.id);\n\n const deletePromises = readNotificationIds.map(id =>\n firstValueFrom(this.authService.deleteNotification(id))\n );\n\n Promise.all(deletePromises).then(() => {\n this.notifications.update((notis) => notis.filter(n => !n.isRead));\n this.onNotificationsChanged();\n }).catch((err) => {\n this.loadNotifications();\n });\n }\n\n deleteAllUnread() {\n const unreadNotificationIds = this.notifications()\n .filter(n => !n.isRead)\n .map(n => n.id);\n\n const deletePromises = unreadNotificationIds.map(id =>\n firstValueFrom(this.authService.deleteNotification(id))\n );\n\n Promise.all(deletePromises).then(() => {\n this.notifications.update((notis) => notis.filter(n => !n.isRead));\n this.notificationRead.emit();\n this.onNotificationsChanged();\n }).catch((err) => {\n this.loadNotifications();\n });\n }\n\n delete(notificationId: string, event: Event) {\n event.stopPropagation();\n const wasUnread = this.notifications().find(n => n.id === notificationId && !n.isRead) !== undefined;\n this.authService.deleteNotification(notificationId).subscribe({\n next: () => {\n this.notifications.update((notis) => notis.filter(n => n.id !== notificationId)); \n if (wasUnread) {\n this.notificationRead.emit();\n }\n this.onNotificationsChanged();\n },\n error: (err) => {}\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())) {\n return 'Invalid date';\n }\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 using a single shared now — prevents mid-loop clock drift\n private refreshDateLabels(): void {\n const now = new Date();\n for (const n of this.notifications()) {\n this.dateLabels.set(n.id, this.computeTimeAgo(n.createdAt, now));\n }\n }\n\n // Re-run filter once and store results in stable arrays\n private recomputeFilteredLists(): void {\n this._unreadNotifications.set(this.notifications().filter(n => !n.isRead));\n this._readNotifications.set(this.notifications().filter(n => n.isRead));\n }\n\n // Single call-site after every notification mutation\n private onNotificationsChanged(): void {\n this.recomputeFilteredLists();\n this.refreshDateLabels();\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\n // If no timezone indicator, assume UTC by appending 'Z'\n if (!normalized.endsWith('Z') && !normalized.includes('+') && !normalized.includes('-', 10)) {\n normalized += 'Z';\n }\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\">{{ getNotificationMessage(notification) }}</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}\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 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, HostListener\n} from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { MesAuthService, MesAuthConfig } from './mes-auth.service';\nimport { MaApprovalService } from './approval.service';\nimport { ApprovalDocumentSummaryDto, ApprovalDocumentStatus } from './approval.models';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient } from '@angular/common/http';\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 isOpen = false;\n loading = false;\n activeTab: PanelTab = 'processing';\n\n processingItems: ApprovalDocumentSummaryDto[] = [];\n approvedItems: ApprovalDocumentSummaryDto[] = [];\n rejectedItems: ApprovalDocumentSummaryDto[] = [];\n\n private mesAuth = inject(MesAuthService);\n private http = inject(HttpClient);\n private 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 this.mesAuth.approvalEvents$.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.isOpen) this.loadCurrentTab();\n });\n }\n\n open() {\n this.isOpen = true;\n this.loadAllTabs();\n }\n\n close() {\n this.isOpen = false;\n }\n\n toggle() {\n if (this.isOpen) this.close();\n else this.open();\n }\n\n switchTab(tab: PanelTab) {\n this.activeTab = tab;\n this.loadCurrentTab();\n }\n\n private loadAllTabs() {\n this.loading = true;\n if (!this.approvalSvc) { this.loading = false; return; }\n\n let pending = 3;\n const done = () => { if (--pending === 0) this.loading = false; };\n\n this.approvalSvc.getPendingApprovals(1, 100).subscribe({\n next: r => { this.processingItems = r.items; done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Approved).subscribe({\n next: r => { this.approvedItems = r.items; done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => { this.rejectedItems = 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 = 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 = r.items,\n error: () => {}\n });\n } else {\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => this.rejectedItems = 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 } 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';\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 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 </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, HostBinding, inject, signal, output } from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { takeUntilDestroyed } 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 unreadCount = signal(0);\n private hasUser = false;\n\n private authService = inject(MesAuthService);\n private themeService = inject(ThemeService);\n\n constructor() {\n this.authService.currentUser$\n .pipe(takeUntilDestroyed())\n .subscribe(user => {\n this.hasUser = !!user;\n if (!this.hasUser) {\n this.unreadCount.set(0);\n return;\n }\n this.loadUnreadCount();\n });\n\n // Listen for new notifications\n this.authService.notifications$\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.hasUser) {\n this.loadUnreadCount();\n }\n });\n }\n\n private loadUnreadCount() {\n if (!this.hasUser) {\n this.unreadCount.set(0);\n return;\n }\n\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => {\n this.unreadCount.set(response.unreadCount || 0);\n },\n error: (err) => console.error('Error loading unread count:', err)\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';\n\n@Component({\n selector: 'ma-arv-container',\n imports: [],\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 routingMode: '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 adHocSteps: ApprovalStepRequest[] = [];\n\n referenceUserIds: string[] = [];\n refSearchQuery = '';\n refSearchResults: any[] = [];\n\n userSearchQuery: string[] = [];\n userSearchResults: any[][] = [];\n\n candidateSearchQuery: string[] = [];\n candidateSearchResults: 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 // 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 let stepsError: Record<number, boolean> = {};\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 stepsError[i] = true;\n }\n else stepsError[i] = false;\n }\n }\n return stepsError;\n });\n submitResultError = signal<string | null>(null);\n userLabelMap: Record<string, string> = {};\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.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\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 forkJoin(calls.length > 0 ? calls : [of([] as RolePreviewUserDto[])])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: results => {\n const merged = new Map<string, RolePreviewUserDto>();\n results.forEach(list => list.forEach(u => merged.set(u.userId, u)));\n this.stepCandidates.update(c => {\n const next = [...c]; next[i] = Array.from(merged.values()); return next;\n });\n // Single candidate — 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 } 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(candidates => {\n candidates[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 candidates;\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 \n this.storeLabelFromCandidates(userId, this.stepCandidates()[stepIndex]);\n this.candidateSearchQuery[stepIndex] = '';\n this.candidateSearchResults[stepIndex] = []; \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[stepIndex] = query;\n if (!query || query.length < 2) { this.candidateSearchResults[stepIndex] = this.stepCandidates()[stepIndex]; return; }\n const q = this.normalize(query);\n this.candidateSearchResults[stepIndex] = this.stepCandidates()[stepIndex]\n .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 }\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 const order = this.adHocSteps.length + 1;\n this.adHocSteps.push({ stepOrder: order, stepName: `Step ${order}`, approverUserIds: [] });\n this.userSearchQuery.push('');\n this.userSearchResults.push([]);\n }\n\n removeStep(i: number) {\n this.adHocSteps.splice(i, 1);\n this.userSearchQuery.splice(i, 1);\n this.userSearchResults.splice(i, 1);\n this.adHocSteps.forEach((s, idx) => s.stepOrder = idx + 1);\n }\n\n addApprover(stepIndex: number, userId: string) {\n if (!this.adHocSteps[stepIndex].approverUserIds.includes(userId)) {\n this.adHocSteps[stepIndex].approverUserIds.push(userId);\n }\n this.storeLabelFromResults(userId, this.userSearchResults[stepIndex]);\n this.userSearchQuery[stepIndex] = '';\n this.userSearchResults[stepIndex] = [];\n }\n\n removeApprover(stepIndex: number, approverIndex: number) {\n this.adHocSteps[stepIndex].approverUserIds.splice(approverIndex, 1);\n }\n\n addReference(userId: string) {\n if (!this.referenceUserIds.includes(userId)) {\n this.referenceUserIds.push(userId);\n }\n this.storeLabelFromResults(userId, this.refSearchResults);\n this.refSearchQuery = '';\n this.refSearchResults = [];\n }\n\n private storeLabelFromResults(userId: string, results: any[]) {\n const user = results.find((u: any) => u.id === userId);\n if (user) {\n const parts = [user.department, user.position, user.fullName, user.employeeCode].filter(Boolean);\n this.userLabelMap[userId] = parts.length > 0 ? parts.join(' - ') : (user.userName || userId);\n }\n }\n\n private storeLabelFromCandidates(userId: string, candidates: RolePreviewUserDto[]) {\n const user = candidates.find((u: any) => u.userId === userId);\n if (user) {\n const parts = [user.department, user.position, user.fullName, user.employeeCode].filter(Boolean);\n this.userLabelMap[userId] = parts.length > 0 ? parts.join(' - ') : (user.employeeCode || userId);\n }\n }\n\n removeReference(j: number) {\n this.referenceUserIds.splice(j, 1);\n }\n\n onUserSearchInput(stepIndex: number, query: string) {\n this.userSearchQuery[stepIndex] = query;\n if (!query || query.length < 2) { this.userSearchResults[stepIndex] = []; return; }\n this.searchUsers(query).then(r => this.userSearchResults[stepIndex] = r);\n }\n\n onRefSearchInput(query: string) {\n this.refSearchQuery = query;\n if (!query || query.length < 2) { this.refSearchResults = []; return; }\n this.searchUsers(query).then(r => this.refSearchResults = 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 // if (!this.approvalSvc) { this.errorMessage.set('Approval service not initialized. Ensure provideMesAuth() is configured.'); return; }\n // if (!this.referenceId()) { this.errorMessage.set('ReferenceId is required.'); return; }\n // if (!this.title()) { this.errorMessage.set('Title is required.'); return; }\n\n // if (this.routingMode === 'template' && !this.selectedTemplateId()) {\n // this.errorMessage.set('Please select a template or switch to Custom Steps.'); return;\n // }\n // if (this.routingMode === 'adhoc' && this.adHocSteps.length === 0) {\n // this.errorMessage.set('Please add at least one approval step.'); return;\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 // this.errorMessage.set(`Please select an approver for step \"${step.stepName}\".`); return;\n // }\n // }\n // }\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 = 'template'\"> Use Template\n </label>\n <label class=\"arv-radio\">\n <input type=\"radio\" name=\"routingMode\" value=\"adhoc\" [checked]=\"routingMode === 'adhoc'\" (change)=\"routingMode = '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 {{ s.roles[0].positionLevel }}{{ s.roles[0].orgName ? ' · ' + s.roles[0].orgName : '' }}\n </span>\n }\n </div>\n <!-- Selectable step: show approver picker -->\n @if (stepCandidates()[i]?.length > 1 || stepLoadingCandidates()[i]) {\n <!-- <div class=\"arv-step-picker\">\n @if (stepLoadingCandidates[i]) {\n <div class=\"arv-template-loading\">Loading candidates...</div>\n }\n @if (!stepLoadingCandidates[i]) {\n <select class=\"arv-select arv-select-sm\" (change)=\"onStepUserChange(i, $event)\">\n <option value=\"\">-- Select approver --</option>\n @for (u of stepCandidates[i]; track u.userId) {\n <option [value]=\"u.userId\" [selected]=\"u.userId === stepSelectedUsers[i]\">\n {{ u.fullName || u.userId }}{{ u.department ? ' · ' + u.department : '' }}{{ u.position ? ' (' + u.position + ')' : '' }}{{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\n </option>\n }\n </select>\n }\n </div> -->\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 {{ userLabelMap[stepSelectedUsers()[i]] || stepSelectedUsers()[i] }}\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)=\"candidateSearchResults[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 {{ u.fullName || u.userName }} {{ u.department ? ' · ' + u.department : '' }} {{ u.position ? ' (' + u.position + ')' : '' }} {{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\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 {{ stepCandidates()[i][0].fullName || stepCandidates()[i][0].userId }}{{ stepCandidates()[i][0].department ? ' · ' + stepCandidates()[i][0].department : '' }}{{ stepCandidates()[i][0].position ? ' (' + stepCandidates()[i][0].position + ')' : '' }}{{ stepCandidates()[i][0].employeeCode ? ' (' + stepCandidates()[i][0].employeeCode + ')' : '' }} \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 <input class=\"arv-input\" [value]=\"step.stepName\" (input)=\"step.stepName = $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 {{ userLabelMap[uid] || uid }}\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\" (click)=\"addApprover(i, u.id)\">\n {{ u.fullName || u.userName }} {{ u.department ? ' · ' + u.department : '' }} {{ u.position ? ' (' + u.position + ')' : '' }} {{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\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 {{ userLabelMap[uid] || uid }}\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\" (click)=\"addReference(u.id)\">\n {{ u.fullName || u.userName }} {{ u.department ? ' · ' + u.department : '' }} {{ u.position ? ' (' + u.position + ')' : '' }} {{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\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 { 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 } 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","// 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 './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';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError"],"mappings":"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"}
1
+ {"version":3,"file":"mesauth-angular.mjs","sources":["../../src/ma-ui-config.service.ts","../../src/mes-auth.service.ts","../../src/mes-auth.interceptor.ts","../../src/mes-auth.module.ts","../../src/theme.service.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/ma-user.component.ts","../../src/ma-user.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-perm.pipe.ts","../../src/x-ma-resource.ts","../../src/ma-icon.component.ts","../../src/ma-theme.directive.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. */\nconst PACKAGE_VERSION = '1.8.8';\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\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\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\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 { inject, Injectable, InjectionToken, EnvironmentProviders, makeEnvironmentProviders, provideAppInitializer, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { MaUiConfigService } 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 } from 'rxjs/operators';\nimport { Router } from '@angular/router';\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\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 userId?: string;\n userName?: string;\n fullName?: string;\n gender?: string;\n email?: string;\n phoneNumber?: string;\n department?: string;\n position?: string;\n tokenVersion?: string;\n permEndpoint?: string;\n perms?: Set<string>;\n employeeCode?: string;\n avatarPath?: string;\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 // Inject server-hosted theme CSS and manifest so visual/config changes\n // don't require a package republish.\n const assetsUrl = config.uiAssetsUrl || `${this.apiBase}/mesauth-angular/v1`;\n this.injectThemeStylesheet(assetsUrl);\n inject(MaUiConfigService).loadManifest(assetsUrl, httpClient);\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 const link = document.createElement('link');\n link.id = id;\n link.rel = 'stylesheet';\n link.href = `${assetsUrl}/themes/default.css`;\n document.head.appendChild(link);\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 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 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","import { inject } from '@angular/core';\nimport { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { throwError, timer } from 'rxjs';\nimport { catchError, switchMap } 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 return next(req).pipe(\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 { 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\n constructor() {\n this.detectTheme();\n this.startWatching();\n }\n\n ngOnDestroy(): void {\n this.stopWatching();\n }\n\n private detectTheme(): void {\n const html = document.documentElement;\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 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 this.observer = new MutationObserver(() => this.detectTheme());\n this.observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'theme', 'data-coreui-theme']\n });\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 refreshTheme(): void {\n this.detectTheme();\n }\n}\n","import { Component, HostBinding, HostListener, inject, output, signal } 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 { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ma-user-profile',\n imports: [],\n templateUrl: './user-profile.component.html',\n styleUrl: './user-profile.component.css'\n})\nexport class UserProfileComponent {\n notificationClick = output<void>();\n approvalClick = output<void>();\n\n @HostBinding('class') get themeClass(): string {\n return `theme-${this.themeService.currentTheme()}`;\n }\n\n currentUser = signal<IUser | null>(null);\n unreadCount = signal(0);\n pendingApprovalCount = signal(0);\n dropdownOpen = signal(false);\n\n // Signal to force avatar refresh\n avatarRefresh = signal<number>(Date.now());\n\n private hasUser = false;\n\n private authService = inject(MesAuthService);\n private router = inject(Router);\n private themeService = inject(ThemeService);\n private http = inject(HttpClient);\n\n constructor() {\n this.authService.currentUser$\n .pipe(takeUntilDestroyed())\n .subscribe(user => {\n this.currentUser.set(user);\n this.hasUser = !!user;\n // Force avatar refresh when user changes\n this.avatarRefresh.set(Date.now());\n if (!this.hasUser) {\n this.unreadCount.set(0);\n this.pendingApprovalCount.set(0);\n } else {\n this.loadUnreadCount();\n this.loadPendingApprovalCount();\n }\n });\n\n // Listen for approval events (SignalR) to refresh pending count\n this.authService.approvalEvents$\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.hasUser) this.loadPendingApprovalCount();\n });\n\n // Listen for new real-time notifications (SignalR only)\n this.authService.notifications$\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.hasUser) {\n this.loadUnreadCount();\n }\n });\n }\n\n loadUnreadCount() {\n if (!this.hasUser) {\n this.unreadCount.set(0);\n return;\n }\n\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => {\n this.unreadCount.set(response.unreadCount || 0);\n },\n error: (err) => {}\n });\n }\n\n loadPendingApprovalCount() {\n if (!this.hasUser) { this.pendingApprovalCount.set(0); return; }\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 has avatarPath, use it directly\n if (user.avatarPath) {\n // If avatarPath is already a full URL, use it as-is\n if (user.avatarPath.startsWith('http://') || user.avatarPath.startsWith('https://')) {\n return user.avatarPath;\n }\n // If it's a relative path, construct full URL with refresh timestamp\n return `${baseUrl.replace(/\\/$/, '')}${user.avatarPath}?t=${refresh}`;\n }\n\n // Fallback: construct URL using userId\n const userId = user.userId;\n if (userId && baseUrl) {\n return `${baseUrl.replace(/\\/$/, '')}/auth/${userId}/avatar?t=${refresh}`;\n }\n\n // Fallback to UI avatars service if no userId or baseUrl\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 @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 }\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 this.router.navigate(['/profile']);\n this.dropdownOpen.set(false);\n }\n\n onLogout() {\n this.authService.logout().subscribe({\n next: () => {\n this.dropdownOpen.set(false);\n\n // Navigate to login with return URL\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: (err) => {\n // Still navigate to login even if logout fails\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","<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 <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 <!-- Approval Button -->\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 <!-- 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 <div class=\"avatar-ring\" [class.active]=\"dropdownOpen()\">\n @if (currentUser().fullName || currentUser().userName) {\n <img\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName\"\n class=\"avatar\"\n />\n } @else {\n <span class=\"avatar-initial\">{{ getLastNameInitial(currentUser()) }}</span>\n }\n </div>\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 @if (currentUser().fullName || currentUser().userName) {\n <img\n [src]=\"getAvatarUrl(currentUser())\"\n [alt]=\"currentUser().fullName || currentUser().userName\"\n class=\"dropdown-avatar\"\n />\n } @else {\n <span class=\"dropdown-avatar-initial\">{{ getLastNameInitial(currentUser()) }}</span>\n }\n </div>\n <div class=\"dropdown-user-info\">\n <span class=\"dropdown-user-name\">{{ currentUser().fullName || currentUser().userName }}</span>\n @if (currentUser().position || currentUser().department) {\n <span class=\"dropdown-user-sub\">{{ currentUser().position || currentUser().department }}</span>\n }\n </div>\n </div>\n\n <div class=\"mes-dropdown-divider\"></div>\n\n <button class=\"mes-dropdown-item profile-link\" (click)=\"onViewProfile()\">\n <svg class=\"item-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" 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 View Profile\n </button>\n\n <div class=\"mes-dropdown-divider\"></div>\n\n <button class=\"mes-dropdown-item logout-item\" (click)=\"onLogout()\">\n <svg class=\"item-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" 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 Logout\n </button>\n </div>\n }\n </div>\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 } 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 { takeUntilDestroyed } 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 isOpen = false;\n notifications = signal<NotificationDto[]>([]);\n activeTab: 'unread' | 'read' = 'unread';\n\n // Cached filtered lists — updated explicitly to avoid re-filtering on every CD cycle\n private _unreadNotifications = signal<NotificationDto[]>([]);\n private _readNotifications = signal<NotificationDto[]>([]);\n\n // Stable time-ago strings keyed by notification id — refreshed every 30s\n dateLabels: Map<string, string> = new Map();\n private dateTimer: ReturnType<typeof setInterval> | null = null;\n\n get unreadNotifications(): NotificationDto[] {\n return this._unreadNotifications();\n }\n\n get readNotifications(): NotificationDto[] {\n return this._readNotifications();\n }\n\n get currentNotifications(): NotificationDto[] {\n return this.activeTab === 'unread' ? this._unreadNotifications() : this._readNotifications();\n }\n\n selectedNotification: NotificationDto | null = null;\n selectedNotificationHtml: SafeHtml | null = null;\n selectedNotificationDate: string = '';\n\n // Returns plain text message for list display\n getNotificationMessage(notification: NotificationDto): string {\n return notification.message || '';\n }\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 to avoid NG0100 from live new Date() in template\n this.dateTimer = setInterval(() => this.refreshDateLabels(), 30000);\n\n // Listen for new real-time notifications\n this.authService.notifications$\n .pipe(takeUntilDestroyed())\n .subscribe((notification: RealTimeNotificationDto) => {\n // Show toast for new notification\n this.toastService.show(\n notification.message || '',\n notification.title,\n this.toastType(notification.type),\n 5000\n );\n // Reload notifications list\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({ // includeRead = true to get both read and unread\n next: (response: PagedList<NotificationDto>) => {\n this.notifications.set(response.items || []);\n this.onNotificationsChanged();\n },\n error: (err) => {}\n });\n }\n\n open() {\n this.isOpen = true;\n this.activeTab = 'unread'; // Reset to unread tab when opening\n }\n\n close() {\n this.isOpen = false;\n }\n\n switchTab(tab: 'unread' | 'read') {\n this.activeTab = tab;\n }\n\n openDetails(notification: NotificationDto) {\n this.selectedNotification = notification;\n // Cache computed values to avoid re-rendering on every change detection cycle\n const html = notification.messageHtml || notification.message || '';\n this.selectedNotificationHtml = this.sanitizer.bypassSecurityTrustHtml(html);\n this.selectedNotificationDate = this.formatDate(notification.createdAt);\n // Mark as read when opening details (if not already read)\n if (!notification.isRead) {\n this.authService.markAsRead(notification.id).subscribe({\n next: () => {\n notification.isRead = true;\n this.notificationRead.emit();\n this.onNotificationsChanged();\n },\n error: () => {}\n });\n }\n }\n\n closeDetails() {\n this.selectedNotification = null;\n this.selectedNotificationHtml = null;\n this.selectedNotificationDate = '';\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) {\n event.stopPropagation();\n }\n this.authService.markAsRead(notificationId).subscribe({\n next: () => {\n const notification = this.notifications().find(n => n.id === notificationId);\n if (notification) {\n notification.isRead = true;\n this.notificationRead.emit();\n this.onNotificationsChanged();\n }\n },\n error: (err) => {}\n });\n }\n\n markAllAsRead() {\n this.authService.markAllAsRead().subscribe({\n next: () => {\n this.notifications().forEach(n => n.isRead = true);\n this.notificationRead.emit();\n this.onNotificationsChanged();\n },\n error: (err) => {}\n });\n }\n\n deleteAllRead() {\n const readNotificationIds = this.notifications()\n .filter(n => n.isRead)\n .map(n => n.id);\n\n const deletePromises = readNotificationIds.map(id =>\n firstValueFrom(this.authService.deleteNotification(id))\n );\n\n Promise.all(deletePromises).then(() => {\n this.notifications.update((notis) => notis.filter(n => !n.isRead));\n this.onNotificationsChanged();\n }).catch((err) => {\n this.loadNotifications();\n });\n }\n\n deleteAllUnread() {\n const unreadNotificationIds = this.notifications()\n .filter(n => !n.isRead)\n .map(n => n.id);\n\n const deletePromises = unreadNotificationIds.map(id =>\n firstValueFrom(this.authService.deleteNotification(id))\n );\n\n Promise.all(deletePromises).then(() => {\n this.notifications.update((notis) => notis.filter(n => !n.isRead));\n this.notificationRead.emit();\n this.onNotificationsChanged();\n }).catch((err) => {\n this.loadNotifications();\n });\n }\n\n delete(notificationId: string, event: Event) {\n event.stopPropagation();\n const wasUnread = this.notifications().find(n => n.id === notificationId && !n.isRead) !== undefined;\n this.authService.deleteNotification(notificationId).subscribe({\n next: () => {\n this.notifications.update((notis) => notis.filter(n => n.id !== notificationId)); \n if (wasUnread) {\n this.notificationRead.emit();\n }\n this.onNotificationsChanged();\n },\n error: (err) => {}\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())) {\n return 'Invalid date';\n }\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 using a single shared now — prevents mid-loop clock drift\n private refreshDateLabels(): void {\n const now = new Date();\n for (const n of this.notifications()) {\n this.dateLabels.set(n.id, this.computeTimeAgo(n.createdAt, now));\n }\n }\n\n // Re-run filter once and store results in stable arrays\n private recomputeFilteredLists(): void {\n this._unreadNotifications.set(this.notifications().filter(n => !n.isRead));\n this._readNotifications.set(this.notifications().filter(n => n.isRead));\n }\n\n // Single call-site after every notification mutation\n private onNotificationsChanged(): void {\n this.recomputeFilteredLists();\n this.refreshDateLabels();\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\n // If no timezone indicator, assume UTC by appending 'Z'\n if (!normalized.endsWith('Z') && !normalized.includes('+') && !normalized.includes('-', 10)) {\n normalized += 'Z';\n }\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\">{{ getNotificationMessage(notification) }}</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}\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 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, HostListener\n} from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { MesAuthService, MesAuthConfig } from './mes-auth.service';\nimport { MaApprovalService } from './approval.service';\nimport { ApprovalDocumentSummaryDto, ApprovalDocumentStatus } from './approval.models';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient } from '@angular/common/http';\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 isOpen = false;\n loading = false;\n activeTab: PanelTab = 'processing';\n\n processingItems: ApprovalDocumentSummaryDto[] = [];\n approvedItems: ApprovalDocumentSummaryDto[] = [];\n rejectedItems: ApprovalDocumentSummaryDto[] = [];\n\n private mesAuth = inject(MesAuthService);\n private http = inject(HttpClient);\n private 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 this.mesAuth.approvalEvents$.pipe(takeUntilDestroyed()).subscribe(() => {\n if (this.isOpen) this.loadCurrentTab();\n });\n }\n\n open() {\n this.isOpen = true;\n this.loadAllTabs();\n }\n\n close() {\n this.isOpen = false;\n }\n\n toggle() {\n if (this.isOpen) this.close();\n else this.open();\n }\n\n switchTab(tab: PanelTab) {\n this.activeTab = tab;\n this.loadCurrentTab();\n }\n\n private loadAllTabs() {\n this.loading = true;\n if (!this.approvalSvc) { this.loading = false; return; }\n\n let pending = 3;\n const done = () => { if (--pending === 0) this.loading = false; };\n\n this.approvalSvc.getPendingApprovals(1, 100).subscribe({\n next: r => { this.processingItems = r.items; done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Approved).subscribe({\n next: r => { this.approvedItems = r.items; done(); },\n error: () => done()\n });\n\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => { this.rejectedItems = 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 = 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 = r.items,\n error: () => {}\n });\n } else {\n this.approvalSvc.getMyRequests(1, 10, ApprovalDocumentStatus.Rejected).subscribe({\n next: r => this.rejectedItems = 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 } 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';\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 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 </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, HostBinding, inject, signal, output } from '@angular/core';\nimport { MesAuthService } from './mes-auth.service';\nimport { ThemeService } from './theme.service';\nimport { takeUntilDestroyed } 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 unreadCount = signal(0);\n private hasUser = false;\n\n private authService = inject(MesAuthService);\n private themeService = inject(ThemeService);\n\n constructor() {\n this.authService.currentUser$\n .pipe(takeUntilDestroyed())\n .subscribe(user => {\n this.hasUser = !!user;\n if (!this.hasUser) {\n this.unreadCount.set(0);\n return;\n }\n this.loadUnreadCount();\n });\n\n // Listen for new notifications\n this.authService.notifications$\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n if (this.hasUser) {\n this.loadUnreadCount();\n }\n });\n }\n\n private loadUnreadCount() {\n if (!this.hasUser) {\n this.unreadCount.set(0);\n return;\n }\n\n this.authService.getUnreadCount().subscribe({\n next: (response: any) => {\n this.unreadCount.set(response.unreadCount || 0);\n },\n error: (err) => console.error('Error loading unread count:', err)\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';\n\n@Component({\n selector: 'ma-arv-container',\n imports: [],\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 routingMode: '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 adHocSteps: ApprovalStepRequest[] = [];\n\n referenceUserIds: string[] = [];\n refSearchQuery = '';\n refSearchResults: any[] = [];\n\n userSearchQuery: string[] = [];\n userSearchResults: any[][] = [];\n\n candidateSearchQuery: string[] = [];\n candidateSearchResults: 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 // 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 let stepsError: Record<number, boolean> = {};\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 stepsError[i] = true;\n }\n else stepsError[i] = false;\n }\n }\n return stepsError;\n });\n submitResultError = signal<string | null>(null);\n userLabelMap: Record<string, string> = {};\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.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\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 forkJoin(calls.length > 0 ? calls : [of([] as RolePreviewUserDto[])])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: results => {\n const merged = new Map<string, RolePreviewUserDto>();\n results.forEach(list => list.forEach(u => merged.set(u.userId, u)));\n this.stepCandidates.update(c => {\n const next = [...c]; next[i] = Array.from(merged.values()); return next;\n });\n // Single candidate — 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 } 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 \n this.storeLabelFromCandidates(userId, this.stepCandidates()[stepIndex]);\n this.candidateSearchQuery[stepIndex] = '';\n this.candidateSearchResults[stepIndex] = []; \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[stepIndex] = query;\n if (!query || query.length < 2) { this.candidateSearchResults[stepIndex] = this.stepCandidates()[stepIndex]; return; }\n const q = this.normalize(query);\n this.candidateSearchResults[stepIndex] = this.stepCandidates()[stepIndex]\n .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 }\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 const order = this.adHocSteps.length + 1;\n this.adHocSteps.push({ stepOrder: order, stepName: `Step ${order}`, approverUserIds: [] });\n this.userSearchQuery.push('');\n this.userSearchResults.push([]);\n }\n\n removeStep(i: number) {\n this.adHocSteps.splice(i, 1);\n this.userSearchQuery.splice(i, 1);\n this.userSearchResults.splice(i, 1);\n this.adHocSteps.forEach((s, idx) => s.stepOrder = idx + 1);\n }\n\n addApprover(stepIndex: number, userId: string) {\n if (!this.adHocSteps[stepIndex].approverUserIds.includes(userId)) {\n this.adHocSteps[stepIndex].approverUserIds.push(userId);\n }\n this.storeLabelFromResults(userId, this.userSearchResults[stepIndex]);\n this.userSearchQuery[stepIndex] = '';\n this.userSearchResults[stepIndex] = [];\n }\n\n removeApprover(stepIndex: number, approverIndex: number) {\n this.adHocSteps[stepIndex].approverUserIds.splice(approverIndex, 1);\n }\n\n addReference(userId: string) {\n if (!this.referenceUserIds.includes(userId)) {\n this.referenceUserIds.push(userId);\n }\n this.storeLabelFromResults(userId, this.refSearchResults);\n this.refSearchQuery = '';\n this.refSearchResults = [];\n }\n\n private storeLabelFromResults(userId: string, results: any[]) {\n const user = results.find((u: any) => u.id === userId);\n if (user) {\n const parts = [user.department, user.position, user.fullName, user.employeeCode].filter(Boolean);\n this.userLabelMap[userId] = parts.length > 0 ? parts.join(' - ') : (user.userName || userId);\n }\n }\n\n private storeLabelFromCandidates(userId: string, candidates: RolePreviewUserDto[]) {\n const user = candidates.find((u: any) => u.userId === userId);\n if (user) {\n const parts = [user.department, user.position, user.fullName, user.employeeCode].filter(Boolean);\n this.userLabelMap[userId] = parts.length > 0 ? parts.join(' - ') : (user.employeeCode || userId);\n }\n }\n\n removeReference(j: number) {\n this.referenceUserIds.splice(j, 1);\n }\n\n onUserSearchInput(stepIndex: number, query: string) {\n this.userSearchQuery[stepIndex] = query;\n if (!query || query.length < 2) { this.userSearchResults[stepIndex] = []; return; }\n this.searchUsers(query).then(r => this.userSearchResults[stepIndex] = r);\n }\n\n onRefSearchInput(query: string) {\n this.refSearchQuery = query;\n if (!query || query.length < 2) { this.refSearchResults = []; return; }\n this.searchUsers(query).then(r => this.refSearchResults = 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 // if (!this.approvalSvc) { this.errorMessage.set('Approval service not initialized. Ensure provideMesAuth() is configured.'); return; }\n // if (!this.referenceId()) { this.errorMessage.set('ReferenceId is required.'); return; }\n // if (!this.title()) { this.errorMessage.set('Title is required.'); return; }\n\n // if (this.routingMode === 'template' && !this.selectedTemplateId()) {\n // this.errorMessage.set('Please select a template or switch to Custom Steps.'); return;\n // }\n // if (this.routingMode === 'adhoc' && this.adHocSteps.length === 0) {\n // this.errorMessage.set('Please add at least one approval step.'); return;\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 // this.errorMessage.set(`Please select an approver for step \"${step.stepName}\".`); return;\n // }\n // }\n // }\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 = 'template'\"> Use Template\n </label>\n <label class=\"arv-radio\">\n <input type=\"radio\" name=\"routingMode\" value=\"adhoc\" [checked]=\"routingMode === 'adhoc'\" (change)=\"routingMode = '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 {{ s.roles[0].positionLevel }}{{ s.roles[0].orgName ? ' · ' + s.roles[0].orgName : '' }}\n </span>\n }\n </div>\n <!-- Selectable step: show approver picker -->\n @if (stepCandidates()[i]?.length > 1 || stepLoadingCandidates()[i]) {\n <!-- <div class=\"arv-step-picker\">\n @if (stepLoadingCandidates[i]) {\n <div class=\"arv-template-loading\">Loading candidates...</div>\n }\n @if (!stepLoadingCandidates[i]) {\n <select class=\"arv-select arv-select-sm\" (change)=\"onStepUserChange(i, $event)\">\n <option value=\"\">-- Select approver --</option>\n @for (u of stepCandidates[i]; track u.userId) {\n <option [value]=\"u.userId\" [selected]=\"u.userId === stepSelectedUsers[i]\">\n {{ u.fullName || u.userId }}{{ u.department ? ' · ' + u.department : '' }}{{ u.position ? ' (' + u.position + ')' : '' }}{{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\n </option>\n }\n </select>\n }\n </div> -->\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 {{ userLabelMap[stepSelectedUsers()[i]] || stepSelectedUsers()[i] }}\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)=\"candidateSearchResults[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 {{ u.fullName || u.userName }} {{ u.department ? ' · ' + u.department : '' }} {{ u.position ? ' (' + u.position + ')' : '' }} {{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\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 {{ stepCandidates()[i][0].fullName || stepCandidates()[i][0].userId }}{{ stepCandidates()[i][0].department ? ' · ' + stepCandidates()[i][0].department : '' }}{{ stepCandidates()[i][0].position ? ' (' + stepCandidates()[i][0].position + ')' : '' }}{{ stepCandidates()[i][0].employeeCode ? ' (' + stepCandidates()[i][0].employeeCode + ')' : '' }} \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 <input class=\"arv-input\" [value]=\"step.stepName\" (input)=\"step.stepName = $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 {{ userLabelMap[uid] || uid }}\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\" (click)=\"addApprover(i, u.id)\">\n {{ u.fullName || u.userName }} {{ u.department ? ' · ' + u.department : '' }} {{ u.position ? ' (' + u.position + ')' : '' }} {{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\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 {{ userLabelMap[uid] || uid }}\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\" (click)=\"addReference(u.id)\">\n {{ u.fullName || u.userName }} {{ u.department ? ' · ' + u.department : '' }} {{ u.position ? ' (' + u.position + ')' : '' }} {{ u.employeeCode ? ' (' + u.employeeCode + ')' : '' }}\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 { 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 } 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","// 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 './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';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError"],"mappings":"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"}