@flusys/ng-auth 4.0.0-rc → 4.0.2

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":"flusys-ng-auth.mjs","sources":["../../../projects/ng-auth/interfaces/auth.interface.ts","../../../projects/ng-auth/services/auth-api.service.ts","../../../projects/ng-auth/services/auth-state.service.ts","../../../projects/ng-auth/services/auth-init.service.ts","../../../projects/ng-auth/services/branch-api.service.ts","../../../projects/ng-auth/services/company-api.service.ts","../../../projects/ng-auth/services/token-refresh-state.service.ts","../../../projects/ng-auth/services/user-api.service.ts","../../../projects/ng-auth/services/user-permission-api.service.ts","../../../projects/ng-auth/constants/auth-endpoints.const.ts","../../../projects/ng-auth/guards/auth.guard.ts","../../../projects/ng-auth/interceptors/auth.interceptor.ts","../../../projects/ng-auth/interceptors/token-refresh.interceptor.ts","../../../projects/ng-auth/constants/messages.ts","../../../projects/ng-auth/routes/auth.routes.ts","../../../projects/ng-auth/adapters/auth-layout-providers.adapter.ts","../../../projects/ng-auth/adapters/auth-shared-providers.adapter.ts","../../../projects/ng-auth/providers/auth-layout.providers.ts","../../../projects/ng-auth/providers/auth-providers.ts","../../../projects/ng-auth/providers/auth-extension.providers.ts","../../../projects/ng-auth/pages/administration/administration-page.component.ts","../../../projects/ng-auth/pages/branch/branch-form.component.ts","../../../projects/ng-auth/pages/branch/branch-list.component.ts","../../../projects/ng-auth/pages/company/company-form.component.ts","../../../projects/ng-auth/pages/company/company-list.component.ts","../../../projects/ng-auth/pages/forgot-password/forgot-password-page.component.ts","../../../projects/ng-auth/pages/login/login-page.component.ts","../../../projects/ng-auth/pages/profile/profile-page.component.ts","../../../projects/ng-auth/pages/register/register-page.component.ts","../../../projects/ng-auth/pages/reset-password/reset-password-page.component.ts","../../../projects/ng-auth/pages/users/user-form.component.ts","../../../projects/ng-auth/components/user-company-permission-dialog.component.ts","../../../projects/ng-auth/components/user-branch-permission-dialog.component.ts","../../../projects/ng-auth/pages/users/user-list.component.ts","../../../projects/ng-auth/pages/verify-email/verify-email-page.component.ts","../../../projects/ng-auth/public-api.ts","../../../projects/ng-auth/flusys-ng-auth.ts"],"sourcesContent":["export interface ILoginRequest {\n email: string;\n password: string;\n}\n\nexport interface IRegistrationRequest {\n name: string;\n email: string;\n password: string;\n phone?: string;\n companySlug?: string;\n branchSlug?: string;\n newCompanyName?: string;\n newCompanyPhone?: string;\n newCompanyAddress?: string;\n additionalFields?: Record<string, unknown>;\n}\n\nexport interface ISelectRequest {\n sessionId: string;\n companyId: string;\n branchId: string;\n}\n\nexport interface ISwitchCompanyRequest {\n companyId: string;\n branchId: string;\n}\n\nexport interface IChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\nexport interface IUserInfo {\n id: string;\n email: string;\n name?: string;\n phone?: string | null;\n profilePictureId?: string | null;\n companyId?: string;\n branchId?: string;\n companyLogoId?: string;\n branchLogoId?: string;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug?: string;\n logoId?: string | null;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug?: string;\n logoId?: string | null;\n}\n\nexport interface IBranchSelectionInfo {\n id: string;\n name: string;\n slug: string;\n logoId?: string | null;\n}\n\nexport interface ICompanyWithBranches {\n id: string;\n name: string;\n slug: string;\n logoId?: string | null;\n branches: IBranchSelectionInfo[];\n}\n\nexport interface ILoginResponse {\n accessToken: string;\n refreshToken: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IMeResponse {\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IRegistrationResponse {\n accessToken?: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n requiresEmailVerification?: boolean;\n}\n\nexport interface ICompanySelectionResponse {\n requiresSelection: true;\n sessionId: string;\n expiresAt: Date | string;\n user: IUserInfo;\n companies: ICompanyWithBranches[];\n}\n\nexport interface IRefreshTokenResponse {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport interface ILoginRequiresEmailVerification {\n requiresEmailVerification: true;\n email: string;\n message: string;\n}\n\nexport type AuthResponse = ILoginResponse | ICompanySelectionResponse | ILoginRequiresEmailVerification;\n\nexport function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification {\n return 'requiresEmailVerification' in response && response.requiresEmailVerification === true;\n}\n\nexport function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse {\n return 'requiresSelection' in response && response.requiresSelection === true;\n}\n\nexport function isLoginResponse(response: AuthResponse): response is ILoginResponse {\n return 'accessToken' in response && !('requiresSelection' in response) && !('requiresEmailVerification' in response);\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl } from '@flusys/ng-core';\nimport { IMessageResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n AuthResponse,\n IChangePasswordRequest,\n ILoginRequest,\n ILoginResponse,\n IMeResponse,\n IRefreshTokenResponse,\n IRegistrationRequest,\n IRegistrationResponse,\n ISelectRequest,\n ISwitchCompanyRequest,\n} from '../interfaces/auth.interface';\n\n/**\n * Auth API Service\n * Handles all authentication-related API calls matching NestJS auth endpoints\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthApiService {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl: string;\n\n constructor() {\n this.baseUrl = getServiceUrl(this.appConfig, 'auth');\n }\n\n /**\n * Login with email and password\n * Returns either:\n * - ILoginResponse (direct login success)\n * - ICompanySelectionResponse (requires company/branch selection)\n */\n login(data: ILoginRequest): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.baseUrl}/login`, data);\n }\n\n /**\n * Register new user\n * Supports simple registration and company-based registration\n * Returns RegistrationResponse directly (not wrapped in SingleResponse)\n */\n register(data: IRegistrationRequest): Observable<IRegistrationResponse> {\n return this.http.post<IRegistrationResponse>(\n `${this.baseUrl}/register`,\n data,\n );\n }\n\n /**\n * Select company and branch after login\n * Used when login returns requiresSelection: true\n * Returns LoginResponse directly (not wrapped)\n */\n select(data: ISelectRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/select`, data);\n }\n\n /**\n * Switch company/branch for logged-in user\n * Returns LoginResponse directly (not wrapped)\n */\n switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(\n `${this.baseUrl}/switch-company`,\n data,\n );\n }\n\n /**\n * Refresh access token\n * Refresh token is sent via HTTP-only cookie\n * Returns RefreshTokenResponse directly (not wrapped)\n */\n refresh(): Observable<IRefreshTokenResponse> {\n return this.http.post<IRefreshTokenResponse>(`${this.baseUrl}/refresh`, {});\n }\n\n /**\n * Get current user info\n * Returns only user data (no tokens) - IMeResponse\n */\n me(): Observable<IMeResponse> {\n return this.http.post<IMeResponse>(`${this.baseUrl}/me`, {});\n }\n\n /**\n * Logout current user\n */\n logout(): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/logout`, {});\n }\n\n /**\n * Change password for logged-in user\n */\n changePassword(data: IChangePasswordRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/change-password`,\n data,\n );\n }\n\n /**\n * Send forgot password email\n */\n forgotPassword(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/forgot-password`, {\n email,\n });\n }\n\n /**\n * Reset password with token\n */\n resetPassword(\n token: string,\n newPassword: string,\n ): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/reset-password`, {\n token,\n newPassword,\n });\n }\n\n /**\n * Resend verification email (unauthenticated)\n */\n resendVerification(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/resend-verification`,\n { email },\n );\n }\n\n /**\n * Verify email with token\n * Returns IMessageResponse for existing user verification\n * Returns IRegistrationResponse for pending registration completion\n */\n verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse> {\n return this.http.post<IMessageResponse | IRegistrationResponse>(`${this.baseUrl}/verify-email`, {\n token,\n });\n }\n}\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ICompanySelectionResponse,\n ICompanyWithBranches,\n ILoginResponse,\n IUserInfo,\n} from '../interfaces/auth.interface';\n\n/**\n * Storage keys (static constants)\n * NOTE: Access token is NOT stored - kept in memory only for security (XSS protection)\n * Only token expiry is stored to know when refresh is needed on page load\n */\nconst STORAGE = {\n TOKEN_EXPIRY: 'tokenExpiresAt', // Store expiry time, not the token itself\n COMPANY_ID: 'selectedCompanyId',\n BRANCH_ID: 'selectedBranchId',\n} as const;\n\n/**\n * Auth State Service\n * Minimal signal-based state management for authentication\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n // DI Injection\n private readonly appConfig = inject(APP_CONFIG);\n private readonly router = inject(Router);\n private readonly platform = inject(PlatformService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n // Core State (private writable, public readonly)\n private readonly _user = signal<IUserInfo | null>(null);\n private readonly _accessToken = signal<string>(''); // Memory-only, not persisted\n private readonly _tokenExpiresAt = signal<number | null>(null); // Token expiry timestamp\n private readonly _company = signal<ICompanyInfo | null>(null);\n private readonly _branch = signal<IBranchInfo | null>(null);\n\n readonly user = this._user.asReadonly();\n readonly accessToken = this._accessToken.asReadonly();\n readonly tokenExpiresAt = this._tokenExpiresAt.asReadonly();\n readonly company = this._company.asReadonly();\n readonly branch = this._branch.asReadonly();\n\n // Company Selection State (temporary during login flow)\n private readonly _selectionSessionId = signal<string | null>(null);\n private readonly _availableCompanies = signal<ICompanyWithBranches[]>([]);\n private readonly _selectionExpiresAt = signal<Date | null>(null);\n\n readonly selectionSessionId = this._selectionSessionId.asReadonly();\n readonly availableCompanies = this._availableCompanies.asReadonly();\n\n // Computed States\n readonly isAuthenticated = computed(\n () => !!this._accessToken() && !!this._user(),\n );\n readonly requiresCompanySelection = computed(\n () => !!this._selectionSessionId() && this._availableCompanies().length > 0,\n );\n readonly userName = computed(() => this._user()?.name ?? this.translateAdapter?.translate('auth.user.default.name') ?? 'User');\n readonly companyName = computed(() => this._company()?.name ?? '');\n readonly branchName = computed(() => this._branch()?.name ?? '');\n\n /**\n * Check if token is expired or will expire soon (within 30 seconds).\n * Used to proactively refresh token before requests fail.\n */\n readonly isTokenExpired = computed(() => {\n const expiresAt = this._tokenExpiresAt();\n if (!expiresAt) return true;\n // Consider expired 30 seconds before actual expiry\n return Date.now() >= expiresAt - 30000;\n });\n\n // Config-derived states\n readonly tenantId = computed(\n () => this.appConfig.multiTenant.tenantId ?? null,\n );\n\n constructor() {\n // Auto-persist token expiry (NOT the token itself - security)\n effect(() => {\n const expiresAt = this._tokenExpiresAt();\n expiresAt\n ? this.store(STORAGE.TOKEN_EXPIRY, expiresAt.toString())\n : this.remove(STORAGE.TOKEN_EXPIRY);\n });\n\n // Auto-persist company/branch IDs\n effect(() => {\n const companyId = this._company()?.id;\n const branchId = this._branch()?.id;\n companyId\n ? this.store(STORAGE.COMPANY_ID, companyId)\n : this.remove(STORAGE.COMPANY_ID);\n branchId\n ? this.store(STORAGE.BRANCH_ID, branchId)\n : this.remove(STORAGE.BRANCH_ID);\n });\n\n // Load initial state from storage (expiry only, not token)\n this.loadFromStorage();\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n setLoginState(response: ILoginResponse): void {\n this._accessToken.set(response.accessToken);\n this._user.set(response.user);\n this._company.set(response.company ?? null);\n this._branch.set(response.branch ?? null);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(response.accessToken);\n this._tokenExpiresAt.set(expiry);\n this.clearSelectionState();\n }\n\n setSelectionState(response: ICompanySelectionResponse): void {\n this._selectionSessionId.set(response.sessionId);\n this._availableCompanies.set(response.companies);\n this._selectionExpiresAt.set(new Date(response.expiresAt));\n this._user.set(response.user);\n }\n\n clearSelectionState(): void {\n this._selectionSessionId.set(null);\n this._availableCompanies.set([]);\n this._selectionExpiresAt.set(null);\n }\n\n resetState(): void {\n this._user.set(null);\n this._accessToken.set('');\n this._tokenExpiresAt.set(null);\n this._company.set(null);\n this._branch.set(null);\n this.clearSelectionState();\n Object.values(STORAGE).forEach((key) => this.remove(key));\n }\n\n // ==========================================================================\n // Individual Setters (for external use where needed)\n // ==========================================================================\n\n setUser(user: IUserInfo | null): void {\n this._user.set(user);\n }\n\n setAccessToken(token: string): void {\n this._accessToken.set(token);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(token);\n this._tokenExpiresAt.set(expiry);\n }\n\n setCompany(company: ICompanyInfo | null): void {\n this._company.set(company);\n }\n\n setBranch(branch: IBranchInfo | null): void {\n this._branch.set(branch);\n }\n\n // ==========================================================================\n // Navigation Helpers\n // ==========================================================================\n\n navigateToLogin(returnUrl?: string): void {\n this.router.navigate(\n ['/auth/login'],\n returnUrl ? { queryParams: { returnUrl } } : {},\n );\n }\n\n navigateAfterLogin(returnUrl?: string): void {\n // Validate returnUrl to prevent open redirect attacks\n const safeUrl = this.isValidReturnUrl(returnUrl) ? returnUrl : '/';\n this.router.navigateByUrl(safeUrl);\n }\n\n /** Validates a return URL to prevent open redirect attacks */\n private isValidReturnUrl(url: string | undefined): url is string {\n if (!url) return false;\n // Must start with '/' and not contain protocol indicators\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n }\n\n // Storage accessors (used by components)\n getStoredCompanyId(): string | null {\n return this.get(STORAGE.COMPANY_ID);\n }\n\n getStoredBranchId(): string | null {\n return this.get(STORAGE.BRANCH_ID);\n }\n\n // Storage helpers\n private loadFromStorage(): void {\n if (this.platform.isServer) return;\n // Load token expiry (NOT the token - it's memory-only for security)\n const expiryStr = this.get(STORAGE.TOKEN_EXPIRY);\n if (expiryStr) {\n this._tokenExpiresAt.set(parseInt(expiryStr, 10));\n }\n }\n\n /**\n * Decode JWT expiry without verification (client-side only).\n * Returns expiry timestamp in milliseconds.\n */\n private decodeTokenExpiry(token: string): number | null {\n try {\n if (!token) return null;\n const payload = token.split('.')[1];\n if (!payload) return null;\n // Convert base64url to base64 and add padding\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const decoded = JSON.parse(atob(padded));\n return decoded.exp ? decoded.exp * 1000 : null; // Convert to milliseconds\n } catch {\n return null;\n }\n }\n\n private store(key: string, value: string): void {\n if (!this.platform.isServer) localStorage.setItem(key, value);\n }\n\n private get(key: string): string | null {\n return !this.platform.isServer ? localStorage.getItem(key) : null;\n }\n\n private remove(key: string): void {\n if (!this.platform.isServer) localStorage.removeItem(key);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n catchError,\n finalize,\n map,\n Observable,\n of,\n shareReplay,\n switchMap,\n tap,\n timeout,\n} from 'rxjs';\nimport { AuthApiService } from './auth-api.service';\nimport { AuthStateService } from './auth-state.service';\n\n/**\n * Auth Initialization Service\n * Handles app startup authentication flow:\n * 1. Check if user has valid session (via refresh token cookie)\n * 2. Restore user state from /auth/me\n * 3. Handle company selection if needed\n *\n * IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthInitService {\n private readonly authState = inject(AuthStateService);\n private readonly authApi = inject(AuthApiService);\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n\n /** Whether initial auth check has completed */\n readonly initialized = signal(false);\n\n /** Whether auth check is in progress */\n readonly loading = signal(false);\n\n /** Error from auth check */\n readonly error = signal<string | null>(null);\n\n /** Cached initialization observable to prevent duplicate calls */\n private initializationCache$: Observable<boolean> | null = null;\n\n /**\n * Initialize authentication state on app startup.\n *\n * Flow:\n * 1. If already authenticated with user data -> done\n * 2. Try refresh token (via cookie) -> get new access token\n * 3. Call /auth/me to get user info\n * 4. Update state accordingly\n *\n * Uses shareReplay to prevent duplicate initialization calls.\n */\n initialize(): Observable<boolean> {\n /**\n * 1. Already authenticated with full state\n */\n if (this.authState.isAuthenticated() && this.authState.user()) {\n this.initialized.set(true);\n return of(true);\n }\n\n /**\n * 2. Prevent infinite retry loops\n */\n if (this.initialized()) {\n return of(this.authState.isAuthenticated());\n }\n\n /**\n * 3. Reuse in-flight initialization\n */\n if (this.initializationCache$) {\n return this.initializationCache$;\n }\n\n this.loading.set(true);\n this.error.set(null);\n\n /**\n * 4. Start initialization\n * Timeout after 5 seconds to prevent app stability issues\n */\n this.initializationCache$ = this.authApi.refresh().pipe(\n timeout(5000),\n switchMap((refreshResponse) => {\n // Set access token from refresh\n this.authState.setAccessToken(refreshResponse.accessToken);\n // Fetch user profile\n return this.authApi.me().pipe(\n map((meResponse) => {\n const { user, company, branch } = meResponse;\n\n this.authState.setUser(user);\n\n if (this.appConfig.enableCompanyFeature) {\n this.authState.setCompany(company ?? null);\n this.authState.setBranch(branch ?? null);\n }\n\n return true;\n }),\n );\n }),\n\n tap(() => {\n this.initialized.set(true);\n this.loading.set(false);\n }),\n\n catchError((err) => {\n this.loading.set(false);\n // Always mark as initialized to prevent retry loops\n this.initialized.set(true);\n\n const errorMessage =\n err?.error?.message || err?.message || 'Authentication failed';\n\n const isCompanyError =\n errorMessage.includes('no company assigned') ||\n errorMessage.includes('Company with ID') ||\n errorMessage.includes('Please select a company') ||\n errorMessage.includes('Branch with ID');\n\n this.error.set(errorMessage);\n\n if (isCompanyError && this.appConfig.enableCompanyFeature) {\n // Keep token, force company selection\n this.authState.setUser(null);\n this.authState.setCompany(null);\n this.authState.setBranch(null);\n } else {\n // Full logout - but keep initialized=true to prevent retry\n this.authState.resetState();\n }\n\n return of(false);\n }),\n\n shareReplay({ bufferSize: 1, refCount: true }),\n\n finalize(() => {\n // IMPORTANT: allow re-initialization later\n this.initializationCache$ = null;\n }),\n );\n\n return this.initializationCache$;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateBranchRequest, IUpdateBranchRequest, IBranch } from '../interfaces/branch.interface';\n\n/**\n * Branch API Service\n * Signal-based service for branch CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class BranchApiService extends ApiResourceService<\n ICreateBranchRequest | IUpdateBranchRequest,\n IBranch\n> {\n private readonly _currentCompanyId = signal<string | null>(null);\n\n constructor() {\n super('branch', inject(HttpClient), 'administration');\n }\n\n setCurrentCompanyId(companyId: string | null): void {\n this._currentCompanyId.set(companyId);\n }\n\n fetchByCompany(companyId: string, search = ''): void {\n this.setCurrentCompanyId(companyId);\n this.fetchList(search, { filter: { companyId } });\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateCompanyRequest, IUpdateCompanyRequest, ICompany } from '../interfaces/company.interface';\n\n/**\n * Company API Service\n * Signal-based service for company CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class CompanyApiService extends ApiResourceService<\n ICreateCompanyRequest | IUpdateCompanyRequest,\n ICompany\n> {\n constructor() {\n super('company', inject(HttpClient), 'administration');\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Token Refresh State Service\n * Manages token refresh state for SSR-safe request queuing.\n * Uses BehaviorSubject for RxJS interop (multi-subscriber async coordination).\n */\n@Injectable({ providedIn: 'root' })\nexport class TokenRefreshStateService {\n private readonly _isRefreshing = signal(false);\n readonly isRefreshing = this._isRefreshing.asReadonly();\n\n private readonly _refreshTokenSubject = new BehaviorSubject<string | null>(null);\n readonly refreshTokenSubject$ = this._refreshTokenSubject.asObservable();\n\n startRefresh(): void {\n this._isRefreshing.set(true);\n this._refreshTokenSubject.next(null);\n }\n\n completeRefresh(newToken: string): void {\n this._isRefreshing.set(false);\n this._refreshTokenSubject.next(newToken);\n }\n\n failRefresh(): void {\n this._isRefreshing.set(false);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ICreateUserRequest, IUpdateUserRequest, IUser } from '../interfaces/user.interface';\n\n/**\n * User API Service\n * Signal-based service for user CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class UserApiService extends ApiResourceService<\n ICreateUserRequest | IUpdateUserRequest,\n IUser\n> {\n constructor() {\n super('users', inject(HttpClient), 'administration');\n }\n\n updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>> {\n return this.http.post<ISingleResponse<IUser>>(`${this.baseUrl}/profile`, data);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { Observable } from 'rxjs';\nimport {\n IAssignUserBranchRequest,\n IAssignUserCompanyRequest,\n IBatchOperationResponse,\n IUserBranchesResponse,\n IUserCompaniesResponse,\n} from '../interfaces/user-permission.interface';\n\n/**\n * User Permission API Service\n * Handles user-company and user-branch permission assignments.\n * Endpoint: POST /administration/permissions/*\n */\n@Injectable({ providedIn: 'root' })\nexport class UserPermissionApiService {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl = `${getServiceUrl(this.appConfig, 'administration')}/permissions`;\n\n // Company Permissions\n assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(`${this.baseUrl}/user-company/assign`, data);\n }\n\n assignUserToCompany(userId: string, companyId: string): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: true }] });\n }\n\n revokeUserFromCompany(userId: string, companyId: string): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: false }] });\n }\n\n getUserCompanies(userId: string): Observable<IUserCompaniesResponse> {\n return this.http.post<IUserCompaniesResponse>(`${this.baseUrl}/get-user-company`, { userId });\n }\n\n // Branch Permissions\n assignUserBranches(data: IAssignUserBranchRequest): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(`${this.baseUrl}/user-branch/assign`, data);\n }\n\n assignUserToBranch(userId: string, branchId: string): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: true }] });\n }\n\n revokeUserFromBranch(userId: string, branchId: string): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: false }] });\n }\n\n getUserBranches(userId: string, companyId?: string): Observable<IUserBranchesResponse> {\n return this.http.post<IUserBranchesResponse>(`${this.baseUrl}/get-user-branch`, {\n userId,\n ...(companyId && { companyId }),\n });\n }\n}\n","/**\n * Authentication API Endpoints\n *\n * Centralized endpoint definitions to prevent inconsistencies across interceptors\n * and services. All auth-related endpoints should be referenced from here.\n */\nexport const AUTH_ENDPOINTS = {\n LOGIN: '/auth/login',\n LOGOUT: '/auth/logout',\n REFRESH: '/auth/refresh',\n REGISTER: '/auth/register',\n ME: '/auth/me',\n SELECT: '/auth/select',\n SWITCH_COMPANY: '/auth/switch-company',\n CHANGE_PASSWORD: '/auth/change-password',\n VERIFY_EMAIL: '/auth/verify-email',\n FORGOT_PASSWORD: '/auth/forgot-password',\n RESET_PASSWORD: '/auth/reset-password',\n RESEND_VERIFICATION: '/auth/resend-verification',\n} as const;\n\n/** Check if a URL matches a specific endpoint */\nexport function isEndpoint(url: string, endpoint: string): boolean {\n return url.includes(endpoint);\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router, UrlTree } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { AUTH_ENDPOINTS } from '../constants/auth-endpoints.const';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\n\nfunction isValidReturnUrl(url: unknown): url is string {\n if (typeof url !== 'string' || !url) return false;\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n}\n\n/** Protects routes requiring authentication */\nexport const authGuard: CanActivateFn = (route, state) => {\n const authState = inject(AuthStateService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!authState.isAuthenticated()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], { queryParams: { returnUrl: state.url } });\n }\n\n if (appConfig.enableCompanyFeature) {\n if (authState.requiresCompanySelection() || !authState.company()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], { queryParams: { returnUrl: state.url } });\n }\n }\n\n return true;\n};\n\n/** Protects auth routes from authenticated users, restores session first */\nexport const guestGuard: CanActivateFn = (route): boolean | UrlTree | Observable<boolean | UrlTree> => {\n const authState = inject(AuthStateService);\n const authInit = inject(AuthInitService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n const checkAndRedirect = (): boolean | UrlTree => {\n if (authState.requiresCompanySelection()) return true;\n\n if (authState.isAuthenticated()) {\n if (appConfig.enableCompanyFeature && !authState.company()) return true;\n const returnUrl = route.queryParams['returnUrl'];\n return router.createUrlTree([isValidReturnUrl(returnUrl) ? returnUrl : '/']);\n }\n\n return true;\n };\n\n if (authInit.initialized()) return checkAndRedirect();\n\n return authInit.initialize().pipe(\n map(() => checkAndRedirect()),\n catchError(() => of(true)),\n );\n};\n\n/** Protects routes requiring company feature to be enabled */\nexport const companyFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!appConfig.enableCompanyFeature) return router.createUrlTree(['/']);\n return true;\n};\n\n/** Protects routes requiring email feature to be enabled */\nexport const emailFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!appConfig.services.email?.enabled) return router.createUrlTree([AUTH_ENDPOINTS.LOGIN]);\n return true;\n};\n\n/** Protects routes requiring sign-up feature to be enabled */\nexport const signUpFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (appConfig.enableSignUp === false) return router.createUrlTree([AUTH_ENDPOINTS.LOGIN]);\n return true;\n};\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { CookieService } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { AUTH_ENDPOINTS, isEndpoint } from '../constants/auth-endpoints.const';\nimport { AuthStateService } from '../services/auth-state.service';\n\n/** Endpoints that need withCredentials for cookie handling */\nconst COOKIE_ENDPOINTS = [\n AUTH_ENDPOINTS.LOGIN,\n AUTH_ENDPOINTS.LOGOUT,\n AUTH_ENDPOINTS.REFRESH,\n AUTH_ENDPOINTS.REGISTER,\n AUTH_ENDPOINTS.SELECT,\n AUTH_ENDPOINTS.SWITCH_COMPANY,\n AUTH_ENDPOINTS.VERIFY_EMAIL,\n] as const;\n\n/**\n * Auth Interceptor - Adds auth headers and cookie credentials to requests\n */\nexport function authInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const authState = inject(AuthStateService);\n const cookieService = inject(CookieService);\n const appConfig = inject(APP_CONFIG);\n\n const headers: Record<string, string> = {};\n\n // Add tenant header if multi-tenant mode\n if (appConfig.multiTenant.enabled) {\n const tenantId = authState.tenantId();\n if (tenantId) {\n headers[appConfig.multiTenant.tenantHeader] = tenantId;\n }\n }\n\n // Add Bearer token if available\n const token = authState.accessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // Check if this endpoint needs withCredentials for cookies\n const needsCredentials = COOKIE_ENDPOINTS.some((ep) => isEndpoint(req.url, ep));\n\n if (needsCredentials) {\n headers['cookie'] = cookieService.get();\n return next(req.clone({ withCredentials: true, setHeaders: headers }));\n }\n\n if (Object.keys(headers).length > 0) {\n return next(req.clone({ setHeaders: headers }));\n }\n\n return next(req);\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { MessageService } from 'primeng/api';\nimport { catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\nimport { AUTH_ENDPOINTS, isEndpoint } from '../constants/auth-endpoints.const';\nimport { AuthApiService } from '../services/auth-api.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { TokenRefreshStateService } from '../services/token-refresh-state.service';\n\n/** Token Refresh Interceptor - Proactive and reactive token refresh with request queuing */\nexport function tokenRefreshInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const authState = inject(AuthStateService);\n const authApi = inject(AuthApiService);\n const messageService = inject(MessageService);\n const platformId = inject(PLATFORM_ID);\n const isBrowser = isPlatformBrowser(platformId);\n const refreshState = inject(TokenRefreshStateService);\n const translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n const t = (key: string) => translateAdapter?.translate(key) ?? key;\n\n // Skip refresh for these endpoints to prevent infinite loops\n const isRefreshRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REFRESH);\n const isLoginRequest = isEndpoint(req.url, AUTH_ENDPOINTS.LOGIN);\n const isSelectRequest = isEndpoint(req.url, AUTH_ENDPOINTS.SELECT);\n const isRegisterRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REGISTER);\n\n // Don't intercept auth-related endpoints\n if (isRefreshRequest || isLoginRequest || isSelectRequest || isRegisterRequest) {\n return next(req);\n }\n\n // PROACTIVE REFRESH: Check if token is expired or expiring soon\n if (authState.isTokenExpired() && authState.tokenExpiresAt() !== null) {\n // Token is expired/expiring - refresh proactively before request\n return handleTokenRefresh(\n req,\n next,\n authState,\n authApi,\n messageService,\n isBrowser,\n refreshState,\n t,\n );\n }\n\n // Token is valid - proceed with request, handle 401 reactively\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n // Only handle 401 errors\n if (error.status !== 401) {\n return throwError(() => error);\n }\n\n // Handle 401 by refreshing token\n return handleTokenRefresh(\n req,\n next,\n authState,\n authApi,\n messageService,\n isBrowser,\n refreshState,\n t,\n );\n }),\n );\n}\n\nfunction handleTokenRefresh(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n authState: AuthStateService,\n authApi: AuthApiService,\n messageService: MessageService,\n isBrowser: boolean,\n refreshState: TokenRefreshStateService,\n t: (key: string) => string,\n): Observable<HttpEvent<unknown>> {\n if (refreshState.isRefreshing()) {\n return refreshState.refreshTokenSubject$.pipe(\n filter((token) => token !== null),\n take(1),\n switchMap((token) => next(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }))),\n );\n }\n\n refreshState.startRefresh();\n\n return authApi.refresh().pipe(\n switchMap((response) => {\n const newToken = response.accessToken;\n authState.setAccessToken(newToken);\n refreshState.completeRefresh(newToken);\n return next(req.clone({ setHeaders: { Authorization: `Bearer ${newToken}` } }));\n }),\n catchError((refreshError) => {\n refreshState.failRefresh();\n return handleRefreshFailure(authState, messageService, isBrowser, refreshError, t);\n }),\n );\n}\n\nfunction handleRefreshFailure(\n authState: AuthStateService,\n messageService: MessageService,\n isBrowser: boolean,\n error: HttpErrorResponse,\n t: (key: string) => string,\n): Observable<never> {\n if (isBrowser) {\n messageService.add({ severity: 'error', summary: t('auth.session.expired.title'), detail: t('auth.session.please.login.again') });\n }\n authState.resetState();\n authState.navigateToLogin();\n\n return throwError(() => error);\n}\n","export const AUTH_MESSAGES: Record<string, string> = {\n // Administration\n 'administration.title': 'Administration',\n 'administration.subtitle': 'Manage users, companies, and branches',\n\n // Users\n 'administration.user.title': 'Users',\n 'administration.user.add': 'Add User',\n 'administration.user.new': 'New User',\n 'administration.user.create': 'Create User',\n 'administration.user.edit': 'Edit User',\n 'administration.user.name': 'Name',\n 'administration.user.email': 'Email',\n 'administration.user.phone': 'Phone',\n 'administration.user.password': 'Password',\n 'administration.user.password.optional': '(leave blank to keep current)',\n 'administration.user.password.placeholder': 'Enter password',\n 'administration.user.name.placeholder': 'Enter full name',\n 'administration.user.email.placeholder': 'Enter email address',\n 'administration.user.phone.placeholder': 'Enter phone number',\n 'administration.user.email.verified': 'Email Verified',\n 'administration.user.no.users': 'No users found',\n 'administration.user.details': 'User Details',\n 'administration.user.auto.assign.to': 'Auto-assign to',\n 'administration.user.delete.title': 'Delete User',\n 'administration.user.delete.success': 'User deleted successfully',\n\n // Companies\n 'administration.company.title': 'Companies',\n 'administration.company.add': 'Add Company',\n 'administration.company.new': 'New Company',\n 'administration.company.create': 'Create Company',\n 'administration.company.edit': 'Edit Company',\n 'administration.company.select': 'Select Company',\n 'administration.company.name': 'Company Name',\n 'administration.company.name.placeholder': 'Enter company name',\n 'administration.company.slug': 'Company Slug',\n 'administration.company.slug.placeholder': 'Enter company slug',\n 'administration.company.code': 'Company Code',\n 'administration.company.code.placeholder': 'Enter company code',\n 'administration.company.details': 'Company Details',\n 'administration.company.phone': 'Phone',\n 'administration.company.phone.placeholder': 'Enter phone number',\n 'administration.company.email.placeholder': 'Enter email address',\n 'administration.company.address': 'Address',\n 'administration.company.address.placeholder': 'Enter address',\n 'administration.company.website': 'Website',\n 'administration.company.website.placeholder': 'Enter website URL',\n 'administration.company.no.companies': 'No companies found',\n 'administration.company.delete.title': 'Delete Company',\n 'administration.company.delete.success': 'Company deleted successfully',\n 'administration.company.slug.required': 'Company slug is required',\n\n // Branches\n 'administration.branch.title': 'Branches',\n 'administration.branch.add': 'Add Branch',\n 'administration.branch.new': 'New Branch',\n 'administration.branch.create': 'Create Branch',\n 'administration.branch.edit': 'Edit Branch',\n 'administration.branch.name': 'Branch Name',\n 'administration.branch.name.placeholder': 'Enter branch name',\n 'administration.branch.slug': 'Branch Slug',\n 'administration.branch.slug.placeholder': 'Enter branch slug',\n 'administration.branch.code': 'Branch Code',\n 'administration.branch.code.placeholder': 'Enter branch code',\n 'administration.branch.company': 'Company',\n 'administration.branch.email.placeholder': 'Enter email address',\n 'administration.branch.phone.placeholder': 'Enter phone number',\n 'administration.branch.address': 'Address',\n 'administration.branch.address.placeholder': 'Enter address',\n 'administration.branch.no.branches': 'No branches found',\n 'administration.branch.select.company.first': 'Please select a company first',\n 'administration.branch.view.branches': 'View Branches',\n 'administration.branch.delete.title': 'Delete Branch',\n 'administration.branch.delete.success': 'Branch deleted successfully',\n 'administration.branch.slug.required': 'Branch slug is required',\n\n // Permission dialogs (administration)\n 'administration.permission.company.permissions': 'Company Permissions',\n 'administration.permission.branch.permissions': 'Branch Permissions',\n\n // Login\n 'auth.login.title': 'Login',\n 'auth.login.subtitle': 'Welcome back! Please login to continue.',\n 'auth.login.sign.in': 'Sign In',\n 'auth.login.sign.in.to.continue': 'Sign in to continue to your account',\n 'auth.login.success': 'Login successful',\n 'auth.login.welcome': 'Welcome back!',\n 'auth.login.welcome.user': 'Welcome back, {{name}}!',\n 'auth.login.failed': 'Login failed. Please check your credentials.',\n 'auth.login.account.locked': 'Your account has been locked. Please contact support.',\n 'auth.login.account.inactive': 'Your account is inactive. Please contact support.',\n 'auth.login.email.not.verified': 'Please verify your email before logging in',\n 'auth.login.email': 'Email Address',\n 'auth.login.password': 'Password',\n 'auth.login.email.placeholder': 'Enter your email',\n 'auth.login.password.placeholder': 'Enter your password',\n 'auth.login.remember.me': 'Remember me',\n 'auth.login.forgot.password': 'Forgot Password?',\n 'auth.login.no.account': \"Don't have an account?\",\n 'auth.login.sign.up': 'Sign Up',\n 'auth.login.select.company': 'Select Company',\n 'auth.login.select.company.message': 'Please select a company and branch to continue',\n 'auth.login.select.company.option': 'Select a company',\n 'auth.login.select.branch.option': 'Select a branch',\n 'auth.login.remember.selection': 'Remember my selection',\n 'auth.login.back.to.sign.in': 'Back to Sign In',\n 'auth.login.verify.email.message': 'Please verify your email to complete registration',\n 'auth.login.resend.verification': 'Resend Verification Email',\n\n // Logout\n 'auth.logout.success': 'Logged out successfully',\n 'auth.logout.confirm': 'Are you sure you want to logout?',\n\n // Registration\n 'auth.register.title': 'Create Account',\n 'auth.register.create.account': 'Create Account',\n 'auth.register.subtitle': 'Fill in your details to create an account.',\n 'auth.register.success': 'Account created successfully',\n 'auth.register.failed': 'Registration failed. Please try again.',\n 'auth.register.email.exists': 'Email already exists',\n 'auth.register.full.name': 'Full Name',\n 'auth.register.name.placeholder': 'Enter your full name',\n 'auth.register.email.placeholder': 'Enter your email address',\n 'auth.register.password.placeholder': 'Create a password',\n 'auth.register.confirm.password': 'Confirm Password',\n 'auth.register.confirm.password.placeholder': 'Confirm your password',\n 'auth.register.passwords.do.not.match': 'Passwords do not match',\n 'auth.register.already.have.account': 'Already have an account?',\n 'auth.register.join.default.company': 'Join Default Company',\n 'auth.register.join.or.create.company': 'Join or Create Company',\n 'auth.register.create.new.company': 'Create New Company',\n 'auth.register.preconfigured.company': 'Pre-configured Company',\n 'auth.register.preconfigured.branch': 'Pre-configured Branch',\n 'auth.register.enter.company.code': 'Enter company code to join',\n 'auth.register.min.characters': 'Min. {{count}} characters',\n\n // Password\n 'auth.password.forgot': 'Forgot Password?',\n 'auth.password.reset': 'Reset Password',\n 'auth.password.reset.success': 'Password reset successfully',\n 'auth.password.reset.failed': 'Password reset failed',\n 'auth.password.reset.email.sent': 'Password reset email sent',\n 'auth.password.change': 'Change Password',\n 'auth.password.change.success': 'Password changed successfully',\n 'auth.password.change.failed': 'Failed to change password',\n 'auth.password.current.password': 'Current Password',\n 'auth.password.new.password': 'New Password',\n 'auth.password.confirm.password': 'Confirm Password',\n 'auth.password.requirements': 'Password must be at least 8 characters with uppercase, lowercase, and numbers.',\n\n // Session\n 'auth.session.expired': 'Your session has expired. Please login again.',\n 'auth.session.invalid': 'Invalid session. Please login again.',\n 'auth.session.expired.title': 'Session Expired',\n 'auth.session.please.login.again': 'Please log in again.',\n\n // Verification\n 'auth.verify.email': 'Verify Email',\n 'auth.verify.email.sent': 'Verification email sent. Please check your inbox.',\n 'auth.verify.email.success': 'Email Verified',\n 'auth.verify.email.success.message': 'Your email has been verified successfully. You can now login to your account.',\n 'auth.verify.email.failed': 'Verification Failed',\n 'auth.verify.email.verifying': 'Verifying Email',\n 'auth.verify.email.please.wait': 'Please wait while we verify your email address...',\n 'auth.verify.email.invalid.link': 'This verification link is invalid or has expired.',\n 'auth.verify.email.resend.email': 'Resend Verification Email',\n 'auth.verify.email.resend.title': 'Resend Verification',\n 'auth.verify.email.resend.subtitle': 'Enter your email to receive a new verification link.',\n 'auth.verify.email.email.placeholder': 'Enter your email address',\n 'auth.verify.email.email.sent': 'Verification email sent. Please check your inbox.',\n 'auth.verify.email.resend': 'Resend Email',\n 'auth.verify.resend': 'Resend Verification Email',\n\n // Forgot Password Page\n 'auth.forgot.password.title': 'Forgot Password',\n 'auth.forgot.password.subtitle': 'Enter your email address and we will send you a reset link.',\n 'auth.forgot.password.email.placeholder': 'Enter your email address',\n 'auth.forgot.password.send.reset.link': 'Send Reset Link',\n 'auth.forgot.password.remember.password': 'Remember your password?',\n 'auth.forgot.password.check.email': 'Check Your Email',\n 'auth.forgot.password.email.sent.to': 'We sent a password reset link to {{email}}',\n 'auth.forgot.password.didnt.receive': \"Didn't receive the email?\",\n 'auth.forgot.password.try.again': 'Try Again',\n\n // Reset Password Page\n 'auth.reset.password.title': 'Reset Password',\n 'auth.reset.password.subtitle': 'Enter your new password below.',\n 'auth.reset.password.new.password': 'New Password',\n 'auth.reset.password.new.password.placeholder': 'Enter your new password',\n 'auth.reset.password.confirm.password': 'Confirm Password',\n 'auth.reset.password.confirm.password.placeholder': 'Confirm your new password',\n 'auth.reset.password.reset.password': 'Reset Password',\n 'auth.reset.password.success': 'Password Reset Successful',\n 'auth.reset.password.success.message': 'Your password has been reset successfully. You can now login with your new password.',\n 'auth.reset.password.invalid.link': 'Invalid Reset Link',\n 'auth.reset.password.invalid.link.message': 'This password reset link is invalid or has expired.',\n 'auth.reset.password.request.new.link': 'Request New Link',\n\n // Profile Page\n 'auth.profile.title': 'Profile',\n 'auth.profile.subtitle': 'Manage your account settings and preferences.',\n 'auth.profile.storage.not.enabled': 'Profile picture upload is not available. Storage service is not configured.',\n 'auth.profile.name.placeholder': 'Enter your full name',\n 'auth.profile.additional.info': 'Additional Information',\n 'auth.profile.employment.info': 'Employment Information',\n 'auth.profile.managed.by.admin': 'This field is managed by an administrator.',\n 'auth.profile.security': 'Security',\n 'auth.profile.current.password': 'Current Password',\n 'auth.profile.new.password': 'New Password',\n 'auth.profile.confirm.password': 'Confirm New Password',\n 'auth.profile.change.password': 'Change Password',\n 'auth.profile.company.branch': 'Company & Branch',\n 'auth.profile.update.success': 'Profile updated successfully',\n 'auth.profile.password.changed': 'Password changed successfully',\n 'auth.profile.picture.updated': 'Profile picture updated',\n\n // Two-Factor Authentication\n 'auth.two.factor.title': 'Two-Factor Authentication',\n 'auth.two.factor.enter.code': 'Enter the code from your authenticator app',\n 'auth.two.factor.invalid.code': 'Invalid verification code',\n 'auth.two.factor.setup': 'Set up Two-Factor Authentication',\n 'auth.two.factor.enabled': 'Two-Factor Authentication enabled',\n 'auth.two.factor.disabled': 'Two-Factor Authentication disabled',\n\n // Form labels\n 'auth.field.email': 'Email Address',\n 'auth.field.password': 'Password',\n 'auth.field.remember.me': 'Remember me',\n 'auth.field.first.name': 'First Name',\n 'auth.field.last.name': 'Last Name',\n 'auth.field.full.name': 'Full Name',\n 'auth.field.username': 'Username',\n\n // Common placeholders\n 'auth.email.placeholder': 'Enter email address',\n 'auth.phone.placeholder': 'Enter phone number',\n\n // Buttons\n 'auth.button.login': 'Login',\n 'auth.button.logout': 'Logout',\n 'auth.button.register': 'Register',\n 'auth.button.create.account': 'Create Account',\n 'auth.button.reset.password': 'Reset Password',\n 'auth.button.send.reset.link': 'Send Reset Link',\n 'auth.button.back.to.login': 'Back to Login',\n\n // Token messages (API keys)\n 'auth.token.refresh.success': 'Token refreshed successfully',\n 'auth.token.invalid': 'Invalid token',\n 'auth.token.expired': 'Token has expired',\n\n // Company selection messages (API keys)\n 'auth.login.requires.selection': 'Please select a company and branch to continue',\n 'auth.company.select.success': 'Company selected successfully',\n 'auth.company.switch.success': 'Switched company successfully',\n 'auth.company.list.success': 'User companies retrieved successfully',\n 'auth.branch.list.success': 'Company branches retrieved successfully',\n 'auth.me.success': 'User info retrieved successfully',\n\n // Email verification (API keys)\n 'email.verification.sent': 'Verification email sent',\n 'email.verification.success': 'Email verified successfully',\n 'email.verification.failed': 'Email verification failed',\n 'email.verification.token.invalid': 'Invalid verification token',\n 'email.verification.token.expired': 'Verification token has expired',\n 'email.verification.not.enabled': 'Email verification is not enabled',\n 'email.verification.resend.success': 'Verification email resent successfully',\n 'email.verification.resend.throttled': 'Please wait before requesting another verification email',\n\n // User CRUD messages (API keys)\n 'user.create.success': 'User created successfully',\n 'user.create.many.success': '{{count}} users created successfully',\n 'user.get.success': 'User retrieved successfully',\n 'user.get.all.success': 'Users retrieved successfully',\n 'user.update.success': 'User updated successfully',\n 'user.update.many.success': '{{count}} users updated successfully',\n 'user.delete.success': 'User deleted successfully',\n 'user.restore.success': 'User restored successfully',\n 'user.not.found': 'User not found',\n 'user.profile.success': 'Profile retrieved successfully',\n 'user.profile.update.success': 'Profile updated successfully',\n 'user.profile.extras.success': 'Profile extras retrieved successfully',\n 'user.profile.sections.success': 'Profile sections retrieved successfully',\n 'user.profile.section.data.success': 'Profile section data retrieved successfully',\n 'user.profile.section.update.success': 'Profile section updated successfully',\n 'user.profile.completion.success': 'Profile completion retrieved successfully',\n 'user.email.verify.success': 'Email verified successfully',\n 'user.phone.verify.success': 'Phone verified successfully',\n 'user.status.update.success': 'User status updated successfully',\n\n // Company CRUD messages (API keys)\n 'company.create.success': 'Company created successfully',\n 'company.create.many.success': '{{count}} companies created successfully',\n 'company.get.success': 'Company retrieved successfully',\n 'company.get.all.success': 'Companies retrieved successfully',\n 'company.update.success': 'Company updated successfully',\n 'company.update.many.success': '{{count}} companies updated successfully',\n 'company.delete.success': 'Company deleted successfully',\n 'company.restore.success': 'Company restored successfully',\n 'company.not.found': 'Company not found',\n\n // Branch CRUD messages (API keys)\n 'branch.create.success': 'Branch created successfully',\n 'branch.create.many.success': '{{count}} branches created successfully',\n 'branch.get.success': 'Branch retrieved successfully',\n 'branch.get.all.success': 'Branches retrieved successfully',\n 'branch.update.success': 'Branch updated successfully',\n 'branch.update.many.success': '{{count}} branches updated successfully',\n 'branch.delete.success': 'Branch deleted successfully',\n 'branch.restore.success': 'Branch restored successfully',\n 'branch.not.found': 'Branch not found',\n\n // User permission messages (API keys)\n 'user.permission.company.assign.success': 'Company permission assigned successfully',\n 'user.permission.company.list.success': 'User companies retrieved successfully',\n 'user.permission.branch.assign.success': 'Branch permission assigned successfully',\n 'user.permission.branch.list.success': 'User branches retrieved successfully',\n 'user.permission.batch.success': 'Processed {{added}} additions and {{removed}} removals',\n 'user.permission.already.assigned': 'User already assigned to this {{type}}',\n 'user.permission.not.found': '{{type}} permission not found',\n\n // Additional API keys\n 'auth.token.required': 'Refresh token is required',\n 'auth.token.revoked': 'Token has been revoked',\n 'auth.token.too.large': 'Refresh token too large (≈{{size}} bytes)',\n 'auth.company.no.access': '{{entity}} belongs to another company',\n 'auth.company.not.found': 'Company not found',\n 'auth.company.required': 'Company is required',\n 'auth.company.feature.not.enabled': 'This feature is not enabled for your company',\n 'auth.branch.no.access': 'No access to this branch',\n 'auth.branch.not.found': 'Branch not found',\n 'auth.email.not.configured': 'Email service is not configured',\n 'auth.email.send.failed': 'Failed to send email',\n 'auth.session.not.available': 'Session not available',\n 'auth.profile.access.denied': 'Access to profile denied',\n 'auth.profile.sections.not.supported': 'Profile sections not supported',\n 'auth.logout.service.unavailable': 'Logout service unavailable',\n 'auth.password.change.invalid.current': 'Current password is incorrect',\n 'auth.password.change.current.required': 'Current password is required',\n 'auth.password.reset.token.expired': 'Password reset token has expired',\n 'auth.password.reset.token.used': 'Password reset token has already been used',\n 'auth.login.invalid.credentials': 'Invalid email or password',\n 'auth.login.account.deactivated': 'Your account has been deactivated',\n 'auth.register.company.already.assigned': 'Company already assigned',\n\n // Permission dialogs\n 'auth.permission.manage.company': 'Manage Company Permissions',\n 'auth.permission.manage.branch': 'Manage Branch Permissions',\n 'auth.permission.user': 'User',\n 'auth.permission.company.assigned': 'Assigned {{name}}',\n 'auth.permission.company.revoked': 'Revoked {{name}}',\n 'auth.permission.branch.assigned': 'Assigned {{name}}',\n 'auth.permission.branch.revoked': 'Revoked {{name}}',\n 'auth.permission.no.company': 'This user has no company permissions assigned.',\n 'auth.permission.assign.company.first': 'Assign company permissions first before managing branch access.',\n 'auth.permission.select.company.for.branches': 'Please select a company to view branches.',\n\n // Validation messages\n 'auth.validation.email.required': 'Email is required',\n 'auth.validation.email.invalid': 'Please enter a valid email address',\n 'auth.validation.password.required': 'Password is required',\n 'auth.validation.name.required': 'Name is required',\n 'auth.validation.name.min.length': 'Name must be at least {{min}} characters',\n 'auth.validation.password.min.length': 'Password must be at least 8 characters',\n 'auth.validation.password.max.length': 'Password exceeds maximum length',\n 'auth.validation.password.pattern': 'Password does not meet requirements',\n 'auth.validation.password.require.uppercase': 'Password must contain at least one uppercase letter',\n 'auth.validation.password.require.lowercase': 'Password must contain at least one lowercase letter',\n 'auth.validation.password.require.number': 'Password must contain at least one number',\n 'auth.validation.password.require.special': 'Password must contain at least one special character',\n 'auth.validation.confirm.password.required': 'Please confirm your password',\n 'auth.validation.company.required': 'Please select a company',\n 'auth.validation.branch.required': 'Please select a branch',\n};\n","import { Routes } from '@angular/router';\nimport {\n permissionGuard,\n USER_PERMISSIONS,\n COMPANY_PERMISSIONS,\n BRANCH_PERMISSIONS,\n SHARED_MESSAGES,\n resolveTranslationModule,\n} from '@flusys/ng-shared';\nimport { AUTH_MESSAGES } from '../constants/messages';\nimport {\n authGuard,\n companyFeatureGuard,\n emailFeatureGuard,\n guestGuard,\n signUpFeatureGuard,\n} from '../guards/auth.guard';\n\n/**\n * Auth Routes Configuration\n * Public routes for authentication (login, register, etc.)\n *\n * Note: Company selection is now handled within the login page as a multi-step flow.\n */\nexport const AUTH_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['auth'], fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES } }) },\n children: [\n {\n path: 'login',\n loadComponent: () =>\n import('../pages/login/login-page.component').then(\n (m) => m.LoginPageComponent,\n ),\n canActivate: [guestGuard],\n },\n {\n path: 'register',\n loadComponent: () =>\n import('../pages/register/register-page.component').then(\n (m) => m.RegisterPageComponent,\n ),\n canActivate: [signUpFeatureGuard, guestGuard],\n },\n {\n path: 'forgot-password',\n loadComponent: () =>\n import('../pages/forgot-password/forgot-password-page.component').then(\n (m) => m.ForgotPasswordPageComponent,\n ),\n canActivate: [emailFeatureGuard, guestGuard],\n },\n {\n path: 'reset-password',\n loadComponent: () =>\n import('../pages/reset-password/reset-password-page.component').then(\n (m) => m.ResetPasswordPageComponent,\n ),\n canActivate: [emailFeatureGuard, guestGuard],\n },\n {\n path: 'verify-email',\n loadComponent: () =>\n import('../pages/verify-email/verify-email-page.component').then(\n (m) => m.VerifyEmailPageComponent,\n ),\n canActivate: [emailFeatureGuard],\n },\n {\n path: '',\n redirectTo: 'login',\n pathMatch: 'full',\n },\n ],\n },\n];\n\n/**\n * Administration Routes Configuration\n * Protected routes for company, branch, user management and permissions\n * Uses tabbed interface - all under /administration with child routes\n */\nexport const ADMINISTRATION_ROUTES: Routes = [\n {\n path: '',\n canActivate: [authGuard],\n resolve: { translations: resolveTranslationModule({ modules: ['auth'], fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/administration/administration-page.component').then(\n (m) => m.AdministrationPageComponent,\n ),\n children: [\n // Users tab\n {\n path: 'users',\n canActivate: [permissionGuard(USER_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/users/user-list.component').then(\n (m) => m.UserListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n ],\n },\n // Company tab (requires company feature)\n {\n path: 'company',\n canActivate: [companyFeatureGuard, permissionGuard(COMPANY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/company/company-list.component').then(\n (m) => m.CompanyListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n ],\n },\n // Branch tab (requires company feature)\n {\n path: 'branch',\n canActivate: [companyFeatureGuard, permissionGuard(BRANCH_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/branch/branch-list.component').then(\n (m) => m.BranchListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n ],\n },\n // Default redirect to users\n {\n path: '',\n redirectTo: 'users',\n pathMatch: 'full',\n },\n ],\n },\n];\n\n/**\n * Profile Routes Configuration\n * Protected route for user profile management\n */\nexport const PROFILE_ROUTES: Routes = [\n {\n path: '',\n canActivate: [authGuard],\n resolve: { translations: resolveTranslationModule({ modules: ['auth'], fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/profile/profile-page.component').then(\n (m) => m.ProfilePageComponent,\n ),\n },\n];\n","import { computed, inject, Injectable, Signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ILayoutAuthApi,\n ILayoutAuthState,\n IUserInfo as ILayoutUserInfo,\n} from '@flusys/ng-layout';\nimport { Observable, of } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\nimport { AuthApiService } from '../services/auth-api.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\n/**\n * Auth Layout Provider Adapters\n *\n * Implements provider interfaces from ng-layout using ng-auth services.\n * Bridges auth state and API to layout components.\n *\n * @example\n * // In app.config.ts\n * import { provideAuthLayoutIntegration } from '@flusys/ng-auth';\n * providers: [...provideAuthLayoutIntegration()]\n */\n\n// =============================================================================\n// Layout State Adapter\n// =============================================================================\n\n@Injectable({ providedIn: 'root' })\nexport class AuthLayoutStateAdapter implements ILayoutAuthState {\n private readonly authState = inject(AuthStateService);\n\n readonly currentCompanyInfo: Signal<ICompanyInfo | null> = computed(() => {\n const company = this.authState.company();\n if (company) {\n return {\n id: company.id,\n name: company.name,\n slug: company.slug ?? '',\n imageId: company.logoId ?? '',\n };\n }\n return null;\n });\n\n readonly currentBranchInfo: Signal<IBranchInfo | null> = computed(() => {\n const branch = this.authState.branch();\n if (branch) {\n return {\n id: branch.id,\n name: branch.name,\n slug: branch.slug ?? '',\n imageId: branch.logoId ?? undefined,\n };\n }\n return null;\n });\n\n readonly loginUserData: Signal<ILayoutUserInfo | null> = computed(() => {\n const user = this.authState.user();\n if (user) {\n return {\n id: user.id,\n name: user.name ?? this.authState.userName(),\n email: user.email,\n };\n }\n return null;\n });\n}\n\n// =============================================================================\n// Layout API Adapter\n// =============================================================================\n\n@Injectable({ providedIn: 'root' })\nexport class AuthLayoutApiAdapter implements ILayoutAuthApi {\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly router = inject(Router);\n\n logOut(): Observable<any> {\n return this.authApi.logout().pipe(\n tap(() => {\n this.authState.resetState();\n }),\n );\n }\n\n navigateLogin(withUrl?: boolean): void {\n if (withUrl) {\n const currentUrl = this.router.url;\n this.authState.navigateToLogin(currentUrl);\n } else {\n this.authState.navigateToLogin();\n }\n }\n\n switchCompany(companyId: string, branchId: string): Observable<any> {\n return this.authApi.switchCompany({ companyId, branchId }).pipe(\n tap(() => {\n window.location.reload();\n }),\n );\n }\n\n getUserCompanies(): Observable<ICompanyInfo[]> {\n const userId = this.authState.user()?.id;\n if (!userId) {\n return of([]);\n }\n\n return this.permissionApi.getUserCompanies(userId).pipe(\n map((response) =>\n (response.data || []).map((permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n slug: permission.companySlug ?? '',\n imageId: '',\n })),\n ),\n );\n }\n\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]> {\n const userId = this.authState.user()?.id;\n if (!userId) {\n return of([]);\n }\n\n return this.permissionApi.getUserBranches(userId, companyId).pipe(\n map((response) =>\n (response.data || []).map((permission) => ({\n id: permission.branchId,\n name: permission.branchName,\n slug: permission.branchSlug ?? '',\n })),\n ),\n );\n }\n}\n","import { inject, Injectable, Signal } from '@angular/core';\nimport {\n IAuthStateProvider,\n ICompanyApiProvider,\n ICompanyBasicInfo,\n IListResponse,\n ISingleResponse,\n IUserBasicInfo,\n IUserPermissionProvider,\n IUserProvider,\n} from '@flusys/ng-shared';\nimport { map, Observable } from 'rxjs';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserApiService } from '../services/user-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\n/**\n * Auth Shared Provider Adapters\n *\n * Implements provider interfaces from ng-shared using ng-auth services.\n * Allows IAM, Storage, and Form-Builder packages to access auth data\n * without depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * import { provideAuthProviders } from '@flusys/ng-auth';\n * providers: [...provideAuthProviders()]\n */\n\n// =============================================================================\n// User Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthUserProviderAdapter implements IUserProvider {\n private readonly userApi = inject(UserApiService);\n\n getUsers(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n companyId?: string;\n branchId?: string;\n isActive?: boolean;\n [key: string]: any;\n }): Observable<IListResponse<IUserBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n filter: {\n ...(filter?.companyId && { companyId: filter.companyId }),\n ...(filter?.branchId && { branchId: filter.branchId }),\n ...(filter?.isActive !== undefined && { isActive: filter.isActive }),\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.userApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((user) => ({\n id: user.id,\n name: user.name ?? user.email,\n email: user.email,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n\n// =============================================================================\n// Company API Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {\n private readonly companyApi = inject(CompanyApiService);\n\n getCompanies(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n }): Observable<IListResponse<ICompanyBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.companyApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((company) => ({\n id: company.id,\n name: company.name,\n slug: company.slug,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n\n// =============================================================================\n// User Permission Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {\n private readonly userPermissionApi = inject(UserPermissionApiService);\n\n getUserBranchPermissions(\n userId: string,\n companyId?: string,\n ): Observable<ISingleResponse<any>> {\n return this.userPermissionApi.getUserBranches(\n userId,\n companyId,\n ) as Observable<ISingleResponse<any>>;\n }\n}\n\n// =============================================================================\n// Auth State Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthStateProviderAdapter implements IAuthStateProvider {\n private readonly authState = inject(AuthStateService);\n private readonly authInit = inject(AuthInitService);\n\n get isAuthenticated(): Signal<boolean> {\n return this.authState.isAuthenticated;\n }\n\n initialize(): Observable<void> {\n return this.authInit.initialize().pipe(map(() => undefined));\n }\n}\n","import { Provider } from '@angular/core';\nimport { LAYOUT_AUTH_API, LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AuthLayoutApiAdapter, AuthLayoutStateAdapter } from '../adapters/auth-layout-providers.adapter';\n\n/** Provides auth integration for ng-layout */\nexport function provideAuthLayoutIntegration(): Provider[] {\n return [\n { provide: LAYOUT_AUTH_STATE, useClass: AuthLayoutStateAdapter },\n { provide: LAYOUT_AUTH_API, useClass: AuthLayoutApiAdapter },\n ];\n}\n","import { Provider } from '@angular/core';\nimport { AUTH_STATE_PROVIDER, COMPANY_API_PROVIDER, USER_PERMISSION_PROVIDER, USER_PROVIDER } from '@flusys/ng-shared';\nimport {\n AuthCompanyApiProviderAdapter,\n AuthStateProviderAdapter,\n AuthUserPermissionProviderAdapter,\n AuthUserProviderAdapter,\n} from '../adapters/auth-shared-providers.adapter';\n\n/** Provides auth implementations for ng-shared provider interfaces */\nexport function provideAuthProviders(): Provider[] {\n return [\n { provide: USER_PROVIDER, useClass: AuthUserProviderAdapter },\n { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter },\n { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter },\n { provide: AUTH_STATE_PROVIDER, useClass: AuthStateProviderAdapter },\n ];\n}\n","import { Injector, InjectionToken, TemplateRef, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { ILogicNode } from '@flusys/ng-shared';\nimport { IUser } from '../interfaces/user.interface';\n\nexport interface IEmailValidationConfig {\n pattern?: RegExp;\n message?: string;\n}\n\nexport interface IPasswordValidationConfig {\n minLength?: number;\n maxLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n pattern?: RegExp;\n message?: string;\n}\n\nexport interface IAuthValidationConfig {\n email?: IEmailValidationConfig;\n password?: IPasswordValidationConfig;\n}\n\nexport const AUTH_VALIDATION_CONFIG = new InjectionToken<IAuthValidationConfig>(\n 'AUTH_VALIDATION_CONFIG'\n);\n\nexport interface IRegistrationFieldTemplateContext {\n field: IRegistrationExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const REGISTRATION_FIELD_CONTEXT = new InjectionToken<IRegistrationFieldTemplateContext>(\n 'REGISTRATION_FIELD_CONTEXT'\n);\n\nexport interface IRegistrationExtraField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';\n placeholder?: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: Array<{ label: string; value: unknown }>;\n pattern?: RegExp;\n validationMessage?: string;\n order?: number;\n containerClass?: string;\n template?: TemplateRef<IRegistrationFieldTemplateContext>;\n component?: Type<unknown>;\n injector?: Injector;\n}\n\nexport interface IRegistrationExtensionProvider {\n getExtraFields(): IRegistrationExtraField[];\n transformRegistrationData?(data: Record<string, unknown>): Record<string, unknown>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_REGISTRATION_EXTENSION = new InjectionToken<IRegistrationExtensionProvider>(\n 'AUTH_REGISTRATION_EXTENSION'\n);\n\nexport interface IUserListExtraColumn {\n key: string;\n header: string;\n field?: string;\n template?: TemplateRef<{ $implicit: IUser }>;\n styleClass?: string;\n width?: string;\n sortable?: boolean;\n order?: number;\n}\n\nexport interface IUserListExtraAction {\n key: string;\n label: string;\n icon: string;\n severity?: 'info' | 'success' | 'warn' | 'danger' | 'secondary' | 'contrast';\n permission?: string;\n onClick: (user: IUser) => void;\n isVisible?: (user: IUser) => boolean;\n isDisabled?: (user: IUser) => boolean;\n order?: number;\n}\n\nexport interface IUserListExtensionProvider {\n getExtraColumns(): IUserListExtraColumn[];\n getExtraActions(): IUserListExtraAction[];\n enrichUserData?(users: IUser[]): Observable<IUser[]>;\n}\n\nexport const AUTH_USER_LIST_EXTENSION = new InjectionToken<IUserListExtensionProvider>(\n 'AUTH_USER_LIST_EXTENSION'\n);\n\nexport interface IProfileExtraSection {\n key: string;\n title: string;\n icon?: string;\n order?: number;\n component?: Type<unknown>;\n template?: TemplateRef<{ user: IUser }>;\n collapsible?: boolean;\n collapsed?: boolean;\n editPermission?: string | ILogicNode;\n}\n\nexport interface IProfileFieldTemplateContext {\n field: IProfileExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const PROFILE_FIELD_CONTEXT = new InjectionToken<IProfileFieldTemplateContext>(\n 'PROFILE_FIELD_CONTEXT'\n);\n\nexport interface IProfileExtraField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';\n placeholder?: string;\n editable?: boolean;\n required?: boolean;\n options?: Array<{ label: string; value: unknown }>;\n pattern?: RegExp;\n validationMessage?: string;\n order?: number;\n sectionKey?: string;\n template?: TemplateRef<IProfileFieldTemplateContext>;\n component?: Type<unknown>;\n injector?: Injector;\n}\n\nexport interface IProfileExtensionProvider {\n getExtraSections?(): IProfileExtraSection[];\n getExtraFields?(): IProfileExtraField[];\n getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;\n saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_PROFILE_EXTENSION = new InjectionToken<IProfileExtensionProvider>(\n 'AUTH_PROFILE_EXTENSION'\n);\n\nexport interface IUserFormFieldTemplateContext {\n field: IUserFormExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const USER_FORM_FIELD_CONTEXT = new InjectionToken<IUserFormFieldTemplateContext>(\n 'USER_FORM_FIELD_CONTEXT'\n);\n\nexport interface IUserFormExtraField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';\n placeholder?: string;\n required?: boolean;\n options?: Array<{ label: string; value: unknown }>;\n pattern?: RegExp;\n validationMessage?: string;\n order?: number;\n template?: TemplateRef<IUserFormFieldTemplateContext>;\n component?: Type<unknown>;\n injector?: Injector;\n}\n\nexport interface IUserFormExtensionProvider {\n getExtraFields?(): IUserFormExtraField[];\n getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;\n saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_USER_FORM_EXTENSION = new InjectionToken<IUserFormExtensionProvider>(\n 'AUTH_USER_FORM_EXTENSION'\n);\n\nexport type UserDetailViewMode = 'dialog' | 'sidebar' | 'page';\n\nexport interface IUserDetailViewConfig {\n viewMode: UserDetailViewMode;\n allowEdit?: boolean;\n width?: string;\n component?: Type<unknown>;\n tabs?: Array<{\n key: string;\n label: string;\n icon?: string;\n component?: Type<unknown>;\n template?: TemplateRef<{ user: IUser }>;\n }>;\n}\n\nexport const AUTH_USER_DETAIL_CONFIG = new InjectionToken<IUserDetailViewConfig>(\n 'AUTH_USER_DETAIL_CONFIG'\n);\n\nexport function validatePassword(password: string, config: IPasswordValidationConfig): string | null {\n const minLen = config.minLength ?? 8;\n const maxLen = config.maxLength;\n\n if (password.length < minLen) {\n return config.message ?? 'auth.validation.password.min.length';\n }\n if (maxLen && password.length > maxLen) {\n return config.message ?? 'auth.validation.password.max.length';\n }\n\n if (config.pattern) {\n if (!config.pattern.test(password)) {\n return config.message ?? 'auth.validation.password.pattern';\n }\n } else {\n if (config.requireUppercase && !/[A-Z]/.test(password)) {\n return config.message ?? 'auth.validation.password.require.uppercase';\n }\n if (config.requireLowercase && !/[a-z]/.test(password)) {\n return config.message ?? 'auth.validation.password.require.lowercase';\n }\n if (config.requireNumbers && !/\\d/.test(password)) {\n return config.message ?? 'auth.validation.password.require.number';\n }\n if (config.requireSpecialChars && !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) {\n return config.message ?? 'auth.validation.password.require.special';\n }\n }\n\n return null;\n}\n\nexport function validateEmail(email: string, config?: IEmailValidationConfig): string | null {\n const pattern = config?.pattern ?? /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const message = config?.message ?? 'auth.validation.email.invalid';\n\n if (!pattern.test(email)) return message;\n return null;\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n PermissionValidatorService,\n TranslatePipe,\n USER_PERMISSIONS,\n COMPANY_PERMISSIONS,\n BRANCH_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { CommonModule } from '@angular/common';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n requiresCompanyFeature?: boolean;\n}\n\n/**\n * Administration Page Component\n * Unified administration page with tabs for:\n * - Users (always visible) - includes permission management via dialogs\n * - Companies (only if company feature enabled)\n * - Branches (only if company feature enabled)\n */\n@Component({\n selector: 'lib-administration-page',\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">{{ 'administration.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1\">{{ 'administration.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <div>\n <router-outlet />\n </div>\n </div>\n `,\n})\nexport class AdministrationPageComponent {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'users',\n labelKey: 'administration.user.title',\n icon: 'pi pi-users',\n route: 'users',\n permission: USER_PERMISSIONS.READ,\n },\n {\n id: 'companies',\n labelKey: 'administration.company.title',\n icon: 'pi pi-building',\n route: 'company',\n permission: COMPANY_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n {\n id: 'branches',\n labelKey: 'administration.branch.title',\n icon: 'pi pi-sitemap',\n route: 'branch',\n permission: BRANCH_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n ];\n\n /** Check if company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Visible tabs based on config and permissions */\n readonly visibleTabs = computed(() => {\n return this.allTabs.filter((tab) => {\n const hasCompanyFeature = !tab.requiresCompanyFeature || this.companyFeatureEnabled();\n const hasPermission = this.permissionValidator.hasPermission(tab.permission);\n return hasCompanyFeature && hasPermission;\n });\n });\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranch,\n ICreateBranchRequest,\n IUpdateBranchRequest,\n} from '../../interfaces/branch.interface';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Branch form model interface */\ninterface IBranchFormModel {\n companyId: string;\n name: string;\n slug: string;\n email: string;\n phone: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Branch Form Component\n * Handles creating and editing branches.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? ('administration.branch.edit' | translate) : ('administration.branch.new' | translate) }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Company Selection -->\n @if (!isEditMode()) {\n <div class=\"flex flex-col gap-2\">\n <label for=\"companyId\" class=\"font-medium\">{{ 'administration.company.title' | translate }} *</label>\n <select\n id=\"companyId\"\n class=\"p-select-native w-full\"\n [formField]=\"branchForm.companyId\">\n <option value=\"\">{{ 'administration.company.select' | translate }}</option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'administration.branch.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"branchForm.name\"\n (blur)=\"generateSlug()\"\n [placeholder]=\"'administration.branch.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">{{ 'administration.branch.slug' | translate }} *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"branchForm.slug\"\n [placeholder]=\"'administration.branch.slug.placeholder' | translate\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">{{ 'administration.user.email' | translate }}</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"branchForm.email\"\n [placeholder]=\"'administration.branch.email.placeholder' | translate\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"branchForm.phone\"\n [placeholder]=\"'administration.branch.phone.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"branchForm.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">{{ 'administration.branch.address' | translate }}</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"branchForm.address\"\n [placeholder]=\"'administration.branch.address.placeholder' | translate\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class BranchFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // Route params as signals\n private readonly routeParams = toSignal(this.route.paramMap);\n private readonly queryParams = toSignal(this.route.queryParamMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing branch data when editing */\n readonly existingBranch = signal<IBranch | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingBranch());\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IBranchFormModel>({\n companyId: '',\n name: '',\n slug: '',\n email: '',\n phone: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly branchForm = form(this.formModel, (f) => {\n required(f.companyId, { message: this.translate('auth.validation.company.required') });\n required(f.name, { message: this.translate('shared.name.required') });\n required(f.slug, { message: this.translate('administration.branch.slug.required') });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.companyId.trim().length > 0 &&\n model.name.trim().length > 0 &&\n model.slug.trim().length > 0\n );\n });\n\n constructor() {\n // Load companies on initialization\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n const query = this.queryParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadBranch(id);\n } else {\n // Set company from query params or current company\n const queryCompanyId = query?.get('companyId');\n const currentCompanyId = this.authState.company()?.id;\n const companyId = queryCompanyId || currentCompanyId;\n\n if (companyId) {\n this.formModel.update((m) => ({ ...m, companyId }));\n }\n }\n });\n }\n\n async loadBranch(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.branchService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingBranch.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n } catch {\n this.router.navigate(['/administration/branch']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private toFormModel(branch: IBranch): IBranchFormModel {\n return {\n companyId: branch.companyId,\n name: branch.name,\n slug: branch.slug,\n email: branch.email || '',\n phone: branch.phone || '',\n address: branch.address || '',\n isActive: branch.isActive,\n };\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n if (this.isEditMode() && this.existingBranch()) {\n await this.updateBranch();\n } else {\n await this.createBranch();\n }\n this.navigateToList();\n } catch {\n // Error handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async updateBranch(): Promise<void> {\n const model = this.formModel();\n const updateData: IUpdateBranchRequest = {\n id: this.existingBranch()!.id,\n name: model.name,\n slug: model.slug,\n ...this.buildOptionalFields(model),\n };\n await this.branchService.updateAsync(updateData);\n this.onSaveSuccess(this.translate('branch.update.success'));\n }\n\n private async createBranch(): Promise<void> {\n const model = this.formModel();\n const createData: ICreateBranchRequest = {\n companyId: model.companyId,\n name: model.name,\n slug: model.slug,\n ...this.buildOptionalFields(model),\n };\n await this.branchService.insertAsync(createData);\n this.onSaveSuccess(this.translate('branch.create.success'));\n }\n\n private buildOptionalFields(model: IBranchFormModel) {\n return {\n email: model.email || undefined,\n phone: model.phone || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: message });\n }\n\n private getTargetCompanyId(): string | null {\n return this.existingBranch()?.companyId || this.formModel().companyId || null;\n }\n\n private navigateToList(): void {\n const companyId = this.getTargetCompanyId();\n this.router.navigate(['/administration/branch'], {\n queryParams: companyId ? { companyId } : {},\n });\n }\n\n onCancel(): void {\n this.navigateToList();\n }\n}\n","import { Component, effect, inject, signal, untracked } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, BRANCH_PERMISSIONS, HasPermissionDirective, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { IBranch } from '../../interfaces/branch.interface';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/**\n * Branch List Component\n * Displays a list of branches for a company with CRUD operations.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-list',\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <div class=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\">\n <h2 class=\"text-xl font-semibold m-0\">{{ 'administration.branch.title' | translate }}</h2>\n @if (companies().length > 1) {\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event); onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administration.company.select' | translate\"\n styleClass=\"w-full sm:w-64\" />\n }\n </div>\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.CREATE\"\n [label]=\"'administration.branch.add' | translate\"\n icon=\"pi pi-plus\"\n [disabled]=\"!selectedCompanyId()\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"branches()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>{{ 'administration.branch.name' | translate }}</th>\n <th>{{ 'administration.branch.slug' | translate }}</th>\n <th>{{ 'administration.user.email' | translate }}</th>\n <th>{{ 'administration.user.phone' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-branch>\n <tr>\n <td>{{ branch.name }}</td>\n <td>{{ branch.slug }}</td>\n <td>{{ branch.email || '-' }}</td>\n <td>{{ branch.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"branch.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"branch.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.edit' | translate\"\n (onClick)=\"onEdit(branch)\" />\n @if (!branch.readOnly) {\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [pTooltip]=\"'shared.delete' | translate\"\n (onClick)=\"onDelete(branch)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n @if (!selectedCompanyId()) {\n {{ 'administration.branch.select.company.first' | translate }}\n } @else {\n {{ 'administration.branch.no.branches' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class BranchListComponent {\n // Permission constants for template\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParamMap = toSignal(this.route.queryParamMap);\n private initialized = false;\n\n /** Selected company ID (signal for zoneless change detection) */\n readonly selectedCompanyId = signal<string | null>(null);\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n /** Branches from service */\n readonly branches = this.branchService.data;\n\n /** Loading state from service */\n readonly isLoading = this.branchService.isLoading;\n\n /** Total count from service */\n readonly total = this.branchService.total;\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (this.initialized) return;\n\n this.initialized = true;\n\n // Use untracked to avoid nested effect error when initializing resources\n untracked(() => {\n // Load companies for dropdown\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Check for company ID from query params or use current company\n // p-table's onLazyLoad will handle the initial data fetch\n const queryCompanyId = params?.get('companyId') || null;\n const currentCompanyId = this.authState.company()?.id;\n\n this.selectedCompanyId.set(queryCompanyId || currentCompanyId || null);\n });\n });\n }\n\n loadBranches(): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.branchService.fetchByCompany(companyId, '');\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId()) {\n this.loadBranches();\n }\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n\n // Use fetchByCompany to maintain company context\n this.branchService.setCurrentCompanyId(companyId);\n this.branchService.fetchList('', {\n filter: { companyId },\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/branch/new'], {\n queryParams: { companyId: this.selectedCompanyId() },\n });\n }\n\n onEdit(branch: IBranch): void {\n this.router.navigate(['/administration/branch', branch.id]);\n }\n\n onDelete(branch: IBranch): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', { name: branch.name }),\n header: this.translate('administration.branch.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.branchService.deleteAsync({ id: branch.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('administration.branch.delete.success'),\n });\n this.branchService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n ICompany,\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n} from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Company form model interface */\ninterface ICompanyFormModel {\n name: string;\n slug: string;\n email: string;\n phone: string;\n website: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Company Form Component\n * Handles creating and editing companies.\n */\n@Component({\n selector: 'lib-company-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? ('administration.company.edit' | translate) : ('administration.company.new' | translate) }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'administration.company.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"companyForm.name\"\n (blur)=\"generateSlug()\"\n [placeholder]=\"'administration.company.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">{{ 'administration.company.slug' | translate }} *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"companyForm.slug\"\n [placeholder]=\"'administration.company.slug.placeholder' | translate\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">{{ 'administration.user.email' | translate }}</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"companyForm.email\"\n [placeholder]=\"'administration.company.email.placeholder' | translate\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"companyForm.phone\"\n [placeholder]=\"'administration.company.phone.placeholder' | translate\"\n />\n </div>\n\n <!-- Website -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"website\" class=\"font-medium\">{{ 'administration.company.website' | translate }}</label>\n <input\n pInputText\n id=\"website\"\n [formField]=\"companyForm.website\"\n [placeholder]=\"'administration.company.website.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"companyForm.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">{{ 'administration.company.address' | translate }}</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"companyForm.address\"\n [placeholder]=\"'administration.company.address.placeholder' | translate\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class CompanyFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly companyService = inject(CompanyApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // Route params as signal\n private readonly routeParams = toSignal(this.route.paramMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing company data when editing */\n readonly existingCompany = signal<ICompany | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingCompany());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<ICompanyFormModel>({\n name: '',\n slug: '',\n email: '',\n phone: '',\n website: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly companyForm = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('shared.name.required') });\n required(f.slug, { message: this.translate('administration.company.slug.required') });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0 && model.slug.trim().length > 0;\n });\n\n constructor() {\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadCompany(id);\n }\n });\n }\n\n private async loadCompany(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.companyService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingCompany.set(response.data);\n this.formModel.set({\n name: response.data.name,\n slug: response.data.slug,\n email: response.data.email || '',\n phone: response.data.phone || '',\n website: response.data.website || '',\n address: response.data.address || '',\n isActive: response.data.isActive,\n });\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/administration/company']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const isEdit = this.isEditMode() && this.existingCompany();\n\n if (isEdit) {\n const updateData: IUpdateCompanyRequest = {\n id: this.existingCompany()!.id,\n ...this.buildCompanyData(),\n };\n await this.companyService.updateAsync(updateData);\n } else {\n await this.companyService.insertAsync(this.buildCompanyData());\n }\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: isEdit ? this.translate('company.update.success') : this.translate('company.create.success'),\n });\n this.router.navigate(['/administration/company']);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/company']);\n }\n\n /** Build company data from form model */\n private buildCompanyData(): ICreateCompanyRequest {\n const model = this.formModel();\n return {\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n website: model.website || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, BRANCH_PERMISSIONS, COMPANY_PERMISSIONS, HasPermissionDirective, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/**\n * Company List Component\n * Displays a list of companies with CRUD operations.\n * Only visible when company feature is enabled.\n */\n@Component({\n selector: 'lib-company-list',\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">{{ 'administration.company.title' | translate }}</h2>\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.CREATE\"\n [label]=\"'administration.company.add' | translate\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"companies()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>{{ 'administration.company.name' | translate }}</th>\n <th>{{ 'administration.company.slug' | translate }}</th>\n <th>{{ 'administration.user.email' | translate }}</th>\n <th>{{ 'administration.user.phone' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-company>\n <tr>\n <td>{{ company.name }}</td>\n <td>{{ company.slug }}</td>\n <td>{{ company.email || '-' }}</td>\n <td>{{ company.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"company.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"company.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.edit' | translate\"\n (onClick)=\"onEdit(company)\" />\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.READ\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [pTooltip]=\"'administration.branch.view.branches' | translate\"\n (onClick)=\"onViewBranches(company)\" />\n @if (!company.readOnly) {\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [pTooltip]=\"'shared.delete' | translate\"\n (onClick)=\"onDelete(company)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n {{ 'administration.company.no.companies' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class CompanyListComponent {\n // Permission constants for template\n readonly COMPANY_PERMISSIONS = COMPANY_PERMISSIONS;\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly companyService = inject(CompanyApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n /** Companies from service */\n readonly companies = this.companyService.data;\n\n /** Loading state from service */\n readonly isLoading = this.companyService.isLoading;\n\n /** Total count from service */\n readonly total = this.companyService.total;\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n this.companyService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/company/new']);\n }\n\n onEdit(company: ICompany): void {\n this.router.navigate(['/administration/company', company.id]);\n }\n\n onViewBranches(company: ICompany): void {\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId: company.id },\n });\n }\n\n onDelete(company: ICompany): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', { name: company.name }),\n header: this.translate('administration.company.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.companyService.deleteAsync({ id: company.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('administration.company.delete.success'),\n });\n this.companyService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required, email as emailValidator } from '@angular/forms/signals';\nimport { finalize, tap } from 'rxjs';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IForgotPasswordFormModel {\n email: string;\n}\n\n@Component({\n selector: 'lib-forgot-password-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @if (!emailSent()) {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.forgot.password.title' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n {{ 'auth.forgot.password.subtitle' | translate }}\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'administration.user.email' | translate }}\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.forgot.password.email.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"forgotForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n [label]=\"'auth.forgot.password.send.reset.link' | translate\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <span class=\"font-medium\">{{ 'auth.forgot.password.remember.password' | translate }}</span>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.sign.in' | translate }}\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.forgot.password.check.email' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.forgot.password.email.sent.to' | translate: { email: submittedEmail() } }}\n </p>\n <p class=\"text-sm text-muted-color mb-6\">\n {{ 'auth.forgot.password.didnt.receive' | translate }}\n <span\n class=\"text-primary cursor-pointer font-semibold\"\n (click)=\"resetForm()\">\n {{ 'auth.forgot.password.try.again' | translate }}\n </span>.\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ForgotPasswordPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly emailSent = signal(false);\n readonly submittedEmail = signal('');\n readonly formModel = signal<IForgotPasswordFormModel>({ email: '' });\n readonly forgotForm = form(this.formModel, (f) => {\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.translate('shared.invalid.email') });\n });\n readonly isFormValid = computed(() => this.forgotForm().valid());\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.invalid.email'),\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.formModel().email;\n\n // Always show success (security: don't reveal if email exists)\n this.authApi\n .forgotPassword(email)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n tap({ next: () => this.showEmailSent(email), error: () => this.showEmailSent(email) }),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe();\n }\n\n private showEmailSent(email: string): void {\n this.submittedEmail.set(email);\n this.emailSent.set(true);\n }\n\n resetForm(): void {\n this.emailSent.set(false);\n this.submittedEmail.set('');\n this.formModel.set({ email: '' });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n minLength,\n required,\n} from '@angular/forms/signals';\nimport {\n APP_CONFIG,\n isCompanyFeatureEnabled,\n isEmailFeatureEnabled,\n isSignUpEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n ISelectRequest,\n isEmailVerificationRequired,\n} from '../../interfaces/auth.interface';\nimport {\n AUTH_VALIDATION_CONFIG,\n validateEmail,\n validatePassword,\n} from '../../providers/auth-extension.providers';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\ninterface ILoginFormModel {\n email: string;\n password: string;\n rememberMe: boolean;\n}\n\ninterface ISelectionFormModel {\n companyId: string;\n branchId: string;\n rememberSelection: boolean;\n}\n\ntype LoginStep = 'credentials' | 'company-selection' | 'email-verification';\n\n@Component({\n selector: 'lib-login-page',\n imports: [\n AngularModule,\n PrimeModule,\n FormField,\n AppFloatingConfigurator,\n TranslatePipe,\n ],\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen\"\n >\n <div\n class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\"\n >\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\"\n >\n <!-- Step Indicator (only when company feature enabled) -->\n @if (companyFeatureEnabled()) {\n <div class=\"flex items-center justify-center mb-6 gap-2\">\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'credentials'\"\n [class.text-primary-contrast]=\"\n currentStep() === 'credentials'\n \"\n [class.bg-surface-200]=\"currentStep() !== 'credentials'\"\n [class.text-muted-color]=\"currentStep() !== 'credentials'\"\n >\n 1\n </div>\n <div class=\"w-12 h-0.5 bg-surface-200\"></div>\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'company-selection'\"\n [class.text-primary-contrast]=\"\n currentStep() === 'company-selection'\n \"\n [class.bg-surface-200]=\"currentStep() !== 'company-selection'\"\n [class.text-muted-color]=\"\n currentStep() !== 'company-selection'\n \"\n >\n 2\n </div>\n </div>\n }\n\n <!-- Step 1: Credentials -->\n @if (currentStep() === 'credentials') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.welcome' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">{{\n 'auth.login.sign.in.to.continue' | translate\n }}</span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.login.email' | translate }}\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.login.email.placeholder' | translate\"\n class=\"w-full md:w-[25rem]\"\n [formField]=\"loginForm.email\"\n autocomplete=\"email\"\n />\n @if (emailValidationError() && loginFormModel().email) {\n <small class=\"text-danger block mt-1\">{{\n emailValidationError()\n }}</small>\n }\n <div class=\"mb-4\"></div>\n\n <label\n for=\"password\"\n class=\"block font-medium text-lg mb-2 text-color\"\n >\n {{ 'auth.login.password' | translate }}\n </label>\n <div class=\"mb-4\">\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [placeholder]=\"'auth.login.password.placeholder' | translate\"\n class=\"w-full md:w-[25rem]\"\n [formField]=\"loginForm.password\"\n autocomplete=\"current-password\"\n />\n @if (passwordValidationError() && loginFormModel().password) {\n <small class=\"text-danger block mt-1\">{{\n passwordValidationError()\n }}</small>\n }\n </div>\n\n <div\n class=\"flex flex-col sm:flex-row items-start sm:items-center justify-between mt-2 mb-8 gap-4\"\n >\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"loginForm.rememberMe\" />\n <span>{{ 'auth.login.remember.me' | translate }}</span>\n </label>\n @if (emailFeatureEnabled()) {\n <span\n class=\"font-medium no-underline cursor-pointer text-primary\"\n style=\"margin-inline-start: 0.5rem;\"\n routerLink=\"/auth/forgot-password\"\n >\n {{ 'auth.login.forgot.password' | translate }}\n </span>\n }\n </div>\n\n <p-button\n [label]=\"'auth.login.sign.in' | translate\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isLoginFormValid() || isLoading()\"\n />\n\n @if (signUpEnabled()) {\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{\n 'auth.login.no.account' | translate\n }}</span>\n <a\n routerLink=\"/auth/register\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n {{ 'auth.login.sign.up' | translate }}\n </a>\n </div>\n }\n </form>\n }\n\n <!-- Email Verification Required -->\n @if (currentStep() === 'email-verification') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-warn\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.email.not.verified' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{\n 'auth.login.verify.email.message'\n | translate: { email: unverifiedEmail() }\n }}\n </p>\n <p-button\n [label]=\"'auth.login.resend.verification' | translate\"\n styleClass=\"w-full mb-4\"\n [loading]=\"isLoading()\"\n (onClick)=\"onResendVerification()\"\n />\n <div class=\"mt-4\">\n <span\n class=\"font-semibold text-primary cursor-pointer\"\n (click)=\"goBackToCredentials()\"\n >\n {{ 'auth.login.back.to.sign.in' | translate }}\n </span>\n </div>\n </div>\n }\n\n <!-- Step 2: Company Selection -->\n @if (currentStep() === 'company-selection') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.select.company' | translate }}\n </div>\n <div class=\"text-muted-color font-medium\">\n {{\n 'auth.login.select.company.message'\n | translate: { name: userName() }\n }}\n </div>\n </div>\n\n <form (ngSubmit)=\"onSelectCompany()\">\n <label\n for=\"company\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'administration.company.title' | translate }}\n </label>\n <select\n id=\"company\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.companyId\"\n (change)=\"onCompanyChange()\"\n >\n <option value=\"\">\n {{ 'auth.login.select.company.option' | translate }}\n </option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n\n <label\n for=\"branch\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'administration.branch.title' | translate }}\n </label>\n <select\n id=\"branch\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.branchId\"\n >\n <option value=\"\">\n {{ 'auth.login.select.branch.option' | translate }}\n </option>\n @for (branch of branches(); track branch.id) {\n <option [value]=\"branch.id\">{{ branch.name }}</option>\n }\n </select>\n\n <div class=\"flex items-center mt-2 mb-8\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"selectionForm.rememberSelection\"\n />\n <span>{{\n 'auth.login.remember.selection' | translate\n }}</span>\n </label>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <p-button\n [label]=\"'shared.back' | translate\"\n styleClass=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (onClick)=\"goBackToCredentials()\"\n />\n <p-button\n [label]=\"'shared.continue' | translate\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\"\n />\n </div>\n </form>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class LoginPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n\n private readonly validationConfig = inject(AUTH_VALIDATION_CONFIG, {\n optional: true,\n });\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly returnUrl = input<string>('');\n readonly currentStep = signal<LoginStep>('credentials');\n readonly isLoading = signal(false);\n readonly unverifiedEmail = signal('');\n\n readonly loginFormModel = signal<ILoginFormModel>({\n email: '',\n password: '',\n rememberMe: true,\n });\n\n private readonly emailErrorMessage = computed(\n () =>\n this.validationConfig?.email?.message ??\n this.translate('shared.invalid.email'),\n );\n private readonly passwordMinLength = computed(\n () => this.validationConfig?.password?.minLength ?? 8,\n );\n private readonly passwordErrorMessage = computed(\n () =>\n this.validationConfig?.password?.message ??\n this.translate('auth.validation.password.min.length', { min: this.passwordMinLength() }),\n );\n\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, { message: this.translate('auth.validation.password.required') });\n minLength(f.password, this.passwordMinLength(), {\n message: this.passwordErrorMessage(),\n });\n });\n\n readonly emailValidationError = computed(() => {\n const email = this.loginFormModel().email;\n if (!email) return null;\n return validateEmail(email, this.validationConfig?.email ?? undefined);\n });\n\n readonly passwordValidationError = computed(() => {\n const password = this.loginFormModel().password;\n if (!password) return null;\n if (!this.validationConfig?.password) return null;\n return validatePassword(password, this.validationConfig.password);\n });\n\n readonly isLoginFormValid = computed(() => {\n const formValid = this.loginForm().valid();\n const emailError = this.emailValidationError();\n const passwordError = this.passwordValidationError();\n return formValid && !emailError && !passwordError;\n });\n\n readonly selectionFormModel = signal<ISelectionFormModel>({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n\n readonly selectionForm = form(this.selectionFormModel, (f) => {\n required(f.companyId, { message: this.translate('auth.validation.company.required') });\n required(f.branchId, { message: this.translate('auth.validation.branch.required') });\n });\n\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly emailFeatureEnabled = computed(() =>\n isEmailFeatureEnabled(this.appConfig),\n );\n readonly signUpEnabled = computed(() => isSignUpEnabled(this.appConfig));\n\n private sessionId: string | null = null;\n readonly companies = signal<ICompanyWithBranches[]>([]);\n readonly userName = signal<string>('');\n\n readonly branches = computed<IBranchSelectionInfo[]>(() => {\n const companyId = this.selectionFormModel().companyId;\n if (!companyId) return [];\n const company = this.companies().find((c) => c.id === companyId);\n return company?.branches ?? [];\n });\n\n constructor() {\n effect(() => {\n if (this.authState.requiresCompanySelection()) {\n this.restorePendingSelectionState();\n }\n });\n }\n\n private restorePendingSelectionState(): void {\n const availableCompanies = this.authState.availableCompanies();\n const sessionId = this.authState.selectionSessionId();\n const name = this.authState.userName();\n\n if (availableCompanies.length > 0 && sessionId) {\n this.companies.set(availableCompanies);\n this.sessionId = sessionId;\n this.userName.set(name);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n }\n }\n\n onSubmit(): void {\n if (!this.isLoginFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.loginFormModel();\n const loginData: ILoginRequest = {\n email: formData.email,\n password: formData.password,\n };\n\n this.authApi\n .login(loginData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (isEmailVerificationRequired(response)) {\n this.unverifiedEmail.set(response.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n this.sessionId = response.sessionId;\n this.companies.set(response.companies);\n this.userName.set(response.user.name ?? response.user.email);\n this.authState.setSelectionState(response);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else {\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.login.success'),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n const message =\n error?.error?.message || this.translate('auth.login.failed');\n this.messageService.add({\n severity: 'error',\n summary: this.translate('auth.login.title'),\n detail: message,\n });\n },\n });\n }\n\n onCompanyChange(): void {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: '',\n }));\n\n const branches = this.branches();\n if (branches.length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: branches[0].id,\n }));\n }\n }\n\n onSelectCompany(): void {\n if (!this.isSelectionFormValid()) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('auth.login.requires.selection'),\n });\n return;\n }\n\n if (!this.sessionId) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('auth.session.expired'),\n });\n this.goBackToCredentials();\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.selectionFormModel();\n const selectData: ISelectRequest = {\n sessionId: this.sessionId,\n companyId: formData.companyId!,\n branchId: formData.branchId!,\n };\n\n this.authApi\n .select(selectData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.login.success'),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n goBackToCredentials(): void {\n this.sessionId = null;\n this.companies.set([]);\n this.unverifiedEmail.set('');\n this.selectionFormModel.set({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n this.authState.resetState();\n this.currentStep.set('credentials');\n }\n\n onResendVerification(): void {\n const email = this.unverifiedEmail();\n if (!email) return;\n\n this.isLoading.set(true);\n\n this.authApi\n .resendVerification(email)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.message || this.translate('auth.verify.email.sent'),\n });\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n private autoSelectIfSingle(): void {\n if (this.companies().length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: this.companies()[0].id,\n }));\n this.onCompanyChange();\n }\n\n const storedCompanyId = this.authState.getStoredCompanyId();\n const storedBranchId = this.authState.getStoredBranchId();\n\n if (storedCompanyId) {\n const company = this.companies().find((c) => c.id === storedCompanyId);\n if (company) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: storedCompanyId,\n }));\n if (storedBranchId) {\n const branch = company.branches.find((b) => b.id === storedBranchId);\n if (branch) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: storedBranchId,\n }));\n }\n }\n }\n }\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport {\n APP_CONFIG,\n getPermissionMode,\n isCompanyFeatureEnabled,\n isFeatureEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport {\n AngularModule,\n FILE_PROVIDER,\n FileUploaderComponent,\n FileUrlService,\n HasPermissionDirective,\n IProfileActionInfo,\n IProfileRoleInfo,\n PrimeModule,\n PROFILE_PERMISSION_PROVIDER,\n TranslatePipe,\n} from '@flusys/ng-shared';\nimport { catchError, finalize, forkJoin, of } from 'rxjs';\nimport { MessageService } from 'primeng/api';\nimport { IUpdateUserRequest } from '../../interfaces/user.interface';\nimport {\n AUTH_PROFILE_EXTENSION,\n AUTH_USER_FORM_EXTENSION,\n IProfileExtraField,\n IProfileExtraSection,\n IProfileFieldTemplateContext,\n IUserFormExtraField,\n PROFILE_FIELD_CONTEXT,\n} from '../../providers/auth-extension.providers';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { UserApiService } from '../../services/user-api.service';\n\ninterface IProfileFormModel {\n name: string;\n phone: string;\n}\n\ninterface IPasswordFormModel {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n@Component({\n selector: 'lib-profile-page',\n imports: [AngularModule, PrimeModule, FormField, FileUploaderComponent, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"mb-4 md:mb-6\">\n <h1 class=\"text-2xl font-bold text-color mb-2\">{{ 'auth.profile.title' | translate }}</h1>\n <p class=\"text-muted-color\">{{ 'auth.profile.subtitle' | translate }}</p>\n </div>\n\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex flex-col md:flex-row gap-4 md:gap-6\">\n <div class=\"flex flex-col items-center gap-4 md:w-72 lg:w-80 md:border-r md:border-surface-200 md:pr-6\">\n @if (profilePictureUrl()) {\n <p-avatar\n [image]=\"profilePictureUrl()!\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28\" />\n } @else {\n <p-avatar\n [label]=\"userInitials()\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28 text-3xl bg-primary text-primary-contrast\" />\n }\n <div class=\"text-center\">\n <div class=\"font-semibold text-color\">{{ userName() }}</div>\n <div class=\"text-muted-color text-sm\">{{ userEmail() }}</div>\n </div>\n @if (showUploadSection()) {\n <lib-file-uploader\n [acceptTypes]=\"['image/*']\"\n [multiple]=\"false\"\n [maxSizeMb]=\"5\"\n [showPreview]=\"false\"\n [uploadOptions]=\"profileUploadOptions\"\n (fileUploaded)=\"onProfilePictureUploaded($event)\"\n class=\"w-full\" />\n } @else {\n <div class=\"w-full p-3 bg-surface-100 rounded-lg text-center\">\n <i class=\"pi pi-info-circle text-muted-color mr-2\"></i>\n <span class=\"text-sm text-muted-color\">{{ 'auth.profile.storage.not.enabled' | translate }}</span>\n </div>\n }\n </div>\n\n <div class=\"flex-1\">\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-4\">\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-color\">{{ 'administration.user.email' | translate }}</label>\n <input\n pInputText\n [value]=\"userEmail()\"\n disabled\n class=\"bg-surface-50\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium text-color\">{{ 'administration.user.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'auth.profile.name.placeholder' | translate\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium text-color\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\" />\n </div>\n\n @if (editableFields().length > 0) {\n <div class=\"border-t border-surface pt-4 mt-2\">\n <div class=\"text-sm font-medium text-muted-color mb-4\">\n <i class=\"pi pi-pencil mr-2\"></i>{{ 'auth.profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <p-skeleton height=\"2rem\" styleClass=\"mb-2\" />\n <p-skeleton height=\"2rem\" />\n } @else {\n <div class=\"flex flex-col gap-4\">\n @for (field of editableFields(); track field.key) {\n <div class=\"flex flex-col gap-2\">\n <label [for]=\"field.key\" class=\"font-medium text-color\">\n {{ field.label }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container *ngComponentOutlet=\"field.component; injector: getFieldInjector(field)\" />\n } @else if (field.template) {\n <ng-container [ngTemplateOutlet]=\"field.template\" [ngTemplateOutletContext]=\"getFieldTemplateContext(field)\" />\n } @else {\n <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ field: field }\" />\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{ extraFieldsValidationError() }}</small>\n }\n }\n </div>\n }\n\n @if (viewOnlyFields().length > 0) {\n <div class=\"border-t border-surface pt-4 mt-2\">\n <div class=\"flex items-center justify-between mb-4\">\n <div class=\"text-sm font-medium text-muted-color\">\n <i class=\"pi pi-eye mr-2\"></i>{{ 'auth.profile.employment.info' | translate }}\n </div>\n <p-tag [value]=\"'auth.profile.managed.by.admin' | translate\" severity=\"secondary\" />\n </div>\n @if (isLoadingExtraFields()) {\n <p-skeleton height=\"2rem\" styleClass=\"mb-2\" />\n <p-skeleton height=\"2rem\" />\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (field of viewOnlyFields(); track field.key) {\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm text-muted-color\">{{ field.label }}</label>\n <span class=\"text-color font-medium\">\n @if (field.type === 'select') {\n {{ getSelectLabel(field, getAdminFieldValue(field.key)) }}\n } @else {\n {{ getAdminFieldValue(field.key) || '-' }}\n }\n </span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <ng-template #fieldTemplate let-field=\"field\">\n @switch (field.type) {\n @case ('text') {\n <input\n pInputText\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n @case ('number') {\n <input\n pInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).valueAsNumber)\"\n class=\"w-full\" />\n }\n @case ('textarea') {\n <textarea\n pInputTextarea\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\"\n rows=\"3\"></textarea>\n }\n @case ('select') {\n <select\n [id]=\"field.key\"\n class=\"p-select-native w-full\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{standalone: true}\"\n [disabled]=\"field.editable === false\"\n (ngModelChange)=\"updateExtraField(field.key, $event)\">\n <option value=\"\">{{ field.placeholder ?? ('shared.select' | translate) }}</option>\n @for (opt of field.options; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n }\n @case ('checkbox') {\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [id]=\"field.key\"\n [checked]=\"getExtraFieldValue(field.key) ?? false\"\n [disabled]=\"field.editable === false\"\n (change)=\"updateExtraField(field.key, $any($event.target).checked)\" />\n <span>{{ field.placeholder ?? field.label }}</span>\n </label>\n }\n @case ('date') {\n <input\n pInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n }\n </ng-template>\n\n <div class=\"flex justify-end pt-4\">\n <p-button\n [label]=\"'shared.save.changes' | translate\"\n icon=\"pi pi-check\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || !isFormDirty() || isLoading()\" />\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-lock text-primary\"></i>\n <span class=\"font-semibold text-color\">{{ 'auth.profile.security' | translate }}</span>\n </div>\n <form (ngSubmit)=\"onChangePassword()\" class=\"flex flex-col gap-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div class=\"flex flex-col gap-2\">\n <label for=\"currentPassword\" class=\"font-medium text-color\">{{ 'auth.profile.current.password' | translate }} *</label>\n <p-password\n id=\"currentPassword\"\n name=\"currentPassword\"\n [ngModel]=\"passwordModel().currentPassword\"\n (ngModelChange)=\"updatePasswordField('currentPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n [placeholder]=\"'shared.placeholder.current.password' | translate\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"newPassword\" class=\"font-medium text-color\">{{ 'auth.profile.new.password' | translate }} *</label>\n <p-password\n id=\"newPassword\"\n name=\"newPassword\"\n [ngModel]=\"passwordModel().newPassword\"\n (ngModelChange)=\"updatePasswordField('newPassword', $event)\"\n [feedback]=\"true\"\n [toggleMask]=\"true\"\n [placeholder]=\"'shared.min.characters' | translate: { count: 6 }\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"confirmPassword\" class=\"font-medium text-color\">{{ 'auth.profile.confirm.password' | translate }} *</label>\n <p-password\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n [ngModel]=\"passwordModel().confirmPassword\"\n (ngModelChange)=\"updatePasswordField('confirmPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n [placeholder]=\"'shared.placeholder.confirm.password' | translate\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n @if (!passwordsMatch()) {\n <small class=\"text-danger\">{{ 'auth.register.passwords.do.not.match' | translate }}</small>\n }\n </div>\n </div>\n\n <div class=\"flex justify-end\">\n <p-button\n [label]=\"'auth.profile.change.password' | translate\"\n icon=\"pi pi-key\"\n type=\"submit\"\n [loading]=\"isPasswordLoading()\"\n [disabled]=\"!isPasswordFormValid() || isPasswordLoading()\" />\n </div>\n </form>\n </div>\n\n @for (section of extraSections(); track section.key) {\n @if (section.editPermission) {\n <div *hasPermission=\"section.editPermission\" class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n @if (section.icon) {\n <i [class]=\"section.icon + ' text-primary'\"></i>\n }\n <span class=\"font-semibold text-color\">{{ section.title }}</span>\n </div>\n <div class=\"section-content\">\n @if (section.component) {\n <ng-container *ngComponentOutlet=\"section.component\" />\n }\n </div>\n </div>\n } @else {\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n @if (section.icon) {\n <i [class]=\"section.icon + ' text-primary'\"></i>\n }\n <span class=\"font-semibold text-color\">{{ section.title }}</span>\n </div>\n <div class=\"section-content\">\n @if (section.component) {\n <ng-container *ngComponentOutlet=\"section.component\" />\n }\n </div>\n </div>\n }\n }\n\n @if (showBottomRow()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-4 flex-1\">\n @if (showCompanySection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-building text-primary\"></i>\n <span class=\"font-semibold text-color\">{{ 'auth.profile.company.branch' | translate }}</span>\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-briefcase text-primary\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">{{ 'administration.company.title' | translate }}</div>\n <div class=\"font-medium text-color\">{{ companyName() || ('shared.not.assigned' | translate) }}</div>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-success/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-map-marker text-success\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">{{ 'administration.branch.title' | translate }}</div>\n <div class=\"font-medium text-color\">{{ branchName() || ('shared.not.assigned' | translate) }}</div>\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (showPermissionsSection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center justify-between mb-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-shield text-primary\"></i>\n <span class=\"font-semibold text-color\">{{ 'iam.permission.my.permissions' | translate }}</span>\n </div>\n <p-tag [value]=\"'shared.read.only' | translate\" severity=\"secondary\" />\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n @if (showRoles()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-users\"></i> {{ 'iam.role.title' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userRoles().length === 0) {\n <span class=\"text-muted-color text-sm\">{{ 'iam.role.no.roles.assigned' | translate }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (role of userRoles(); track role.id) {\n <p-tag [value]=\"role.name\" severity=\"info\" />\n }\n </div>\n }\n </div>\n }\n\n @if (showActions()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-bolt\"></i> {{ 'iam.action.direct.actions' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userActions().length === 0) {\n <span class=\"text-muted-color text-sm\">{{ 'iam.action.no.actions.assigned' | translate }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (action of userActions(); track action.id) {\n <p-tag [value]=\"action.name\" severity=\"success\" />\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n})\nexport class ProfilePageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authState = inject(AuthStateService);\n private readonly userService = inject(UserApiService);\n private readonly authApiService = inject(AuthApiService);\n private readonly fileUrlService = inject(FileUrlService);\n private readonly fileProvider = inject(FILE_PROVIDER, { optional: true });\n private readonly permissionProvider = inject(PROFILE_PERMISSION_PROVIDER, { optional: true });\n private readonly profileExtension = inject(AUTH_PROFILE_EXTENSION, { optional: true });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, { optional: true });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly isLoadingPermissions = signal(false);\n readonly isLoadingExtraFields = signal(false);\n private readonly _profilePictureUrl = signal<string | null>(null);\n readonly profilePictureUrl = this._profilePictureUrl.asReadonly();\n\n private readonly _userRoles = signal<IProfileRoleInfo[]>([]);\n readonly userRoles = this._userRoles.asReadonly();\n private readonly _userActions = signal<IProfileActionInfo[]>([]);\n readonly userActions = this._userActions.asReadonly();\n\n readonly extraSections = computed<IProfileExtraSection[]>(() => {\n if (!this.profileExtension?.getExtraSections) return [];\n const sections = this.profileExtension.getExtraSections();\n return sections.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly editableFields = computed<IProfileExtraField[]>(() => {\n if (!this.profileExtension?.getExtraFields) return [];\n const fields = this.profileExtension.getExtraFields();\n return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly viewOnlyFields = computed<IUserFormExtraField[]>(() => {\n if (!this.userFormExtension?.getExtraFields) return [];\n const fields = this.userFormExtension.getExtraFields();\n return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly hasExtraContent = computed(() =>\n this.extraSections().length > 0 || this.editableFields().length > 0 || this.viewOnlyFields().length > 0\n );\n\n readonly extraFieldsModel = signal<Record<string, unknown>>({});\n readonly originalExtraFieldsModel = signal<Record<string, unknown>>({});\n readonly adminFieldsModel = signal<Record<string, unknown>>({});\n\n readonly isExtraFieldsDirty = computed(() => {\n const current = this.extraFieldsModel();\n const original = this.originalExtraFieldsModel();\n return JSON.stringify(current) !== JSON.stringify(original);\n });\n\n readonly extraFieldsValidationError = computed(() => {\n if (!this.profileExtension?.validateExtraFields) return null;\n return this.profileExtension.validateExtraFields(this.extraFieldsModel());\n });\n\n readonly userEmail = computed(() => this.authState.user()?.email ?? '');\n readonly userName = computed(() => this.authState.userName());\n readonly userInitials = computed(() => {\n const name = this.authState.user()?.name ?? '';\n return name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\n });\n readonly companyName = computed(() => this.authState.companyName());\n readonly branchName = computed(() => this.authState.branchName());\n\n readonly showUploadSection = computed(() =>\n isFeatureEnabled(this.appConfig, 'storage') && this.fileProvider !== null\n );\n readonly showCompanySection = computed(() => isCompanyFeatureEnabled(this.appConfig));\n readonly showPermissionsSection = computed(() =>\n isFeatureEnabled(this.appConfig, 'iam') && this.permissionProvider !== null\n );\n readonly permissionMode = computed(() => getPermissionMode(this.appConfig));\n readonly showRoles = computed(() => {\n const mode = this.permissionMode();\n return mode === 'rbac' || mode === 'full';\n });\n readonly showActions = computed(() => {\n const mode = this.permissionMode();\n return mode === 'direct' || mode === 'full';\n });\n readonly showBottomRow = computed(() => this.showCompanySection() || this.showPermissionsSection());\n\n private readonly originalFormModel = signal<IProfileFormModel>({ name: '', phone: '' });\n readonly formModel = signal<IProfileFormModel>({ name: '', phone: '' });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('auth.validation.name.required') });\n });\n\n readonly isFormValid = computed(() => this.formModel().name.trim().length > 0);\n\n readonly isFormDirty = computed(() => {\n const current = this.formModel();\n const original = this.originalFormModel();\n const basicDirty = current.name !== original.name || current.phone !== original.phone;\n return basicDirty || this.isExtraFieldsDirty();\n });\n\n updateExtraField(key: string, value: unknown): void {\n this.extraFieldsModel.update((model) => ({ ...model, [key]: value }));\n }\n\n getExtraFieldValue(key: string): unknown {\n return this.extraFieldsModel()[key];\n }\n\n getAdminFieldValue(key: string): unknown {\n return this.adminFieldsModel()[key];\n }\n\n getSelectLabel(field: IProfileExtraField | IUserFormExtraField, value: unknown): string {\n if (!value || !field.options) return '-';\n const option = field.options.find(opt => opt.value === value);\n return option?.label ?? String(value);\n }\n\n getFieldTemplateContext(field: IProfileExtraField): IProfileFieldTemplateContext {\n return {\n field,\n value: this.extraFieldsModel()[field.key],\n updateValue: (value: unknown) => this.updateExtraField(field.key, value),\n };\n }\n\n private readonly parentInjector = inject(Injector);\n\n getFieldInjector(field: IProfileExtraField): Injector {\n return Injector.create({\n providers: [{ provide: PROFILE_FIELD_CONTEXT, useValue: this.getFieldTemplateContext(field) }],\n parent: field.injector ?? this.parentInjector,\n });\n }\n\n readonly passwordModel = signal<IPasswordFormModel>({\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n });\n\n readonly isPasswordLoading = signal(false);\n\n readonly isPasswordFormValid = computed(() => {\n const model = this.passwordModel();\n return model.currentPassword.length > 0 && model.newPassword.length >= 6 && model.newPassword === model.confirmPassword;\n });\n\n readonly passwordsMatch = computed(() => {\n const model = this.passwordModel();\n return model.confirmPassword.length === 0 || model.newPassword === model.confirmPassword;\n });\n\n readonly profileUploadOptions = {\n folderPath: 'profile-pictures',\n compress: true,\n maxWidth: 400,\n maxHeight: 400,\n isPrivate: true,\n };\n\n constructor() {\n this.loadUserData();\n\n effect(() => {\n if (this.showPermissionsSection()) this.loadPermissions();\n });\n\n effect(() => {\n const user = this.authState.user();\n if (user && this.hasExtraContent()) this.loadExtraFields();\n });\n }\n\n private loadUserData(): void {\n const user = this.authState.user();\n if (user) {\n const initialValues: IProfileFormModel = { name: user.name ?? '', phone: user.phone ?? '' };\n this.originalFormModel.set(initialValues);\n this.formModel.set(initialValues);\n\n if (user.profilePictureId && isFeatureEnabled(this.appConfig, 'storage')) {\n this.fileUrlService\n .fetchSingleFileUrl(user.profilePictureId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((file) => this._profilePictureUrl.set(file?.url ?? null));\n }\n }\n }\n\n private loadPermissions(): void {\n const user = this.authState.user();\n const branch = this.authState.branch();\n\n if (!user || !this.permissionProvider) return;\n\n const loadRoles = this.showRoles();\n const loadActions = this.showActions();\n\n if (!loadRoles && !loadActions) return;\n\n this.isLoadingPermissions.set(true);\n\n const roles$ = loadRoles\n ? this.permissionProvider.getUserRoles(user.id, branch?.id).pipe(catchError(() => of({ data: [] as IProfileRoleInfo[] })))\n : of({ data: [] as IProfileRoleInfo[] });\n\n const actions$ = loadActions\n ? this.permissionProvider.getUserActions(user.id, branch?.id).pipe(catchError(() => of({ data: [] as IProfileActionInfo[] })))\n : of({ data: [] as IProfileActionInfo[] });\n\n forkJoin([roles$, actions$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingPermissions.set(false))\n )\n .subscribe(([rolesResponse, actionsResponse]) => {\n this._userRoles.set(rolesResponse.data ?? []);\n this._userActions.set(actionsResponse.data ?? []);\n });\n }\n\n private loadExtraFields(): void {\n const user = this.authState.user();\n if (!user) return;\n\n const hasProfileFields = !!this.profileExtension?.getExtraFieldValues;\n const hasAdminFields = !!this.userFormExtension?.getExtraFieldValues;\n\n if (!hasProfileFields && !hasAdminFields) return;\n\n this.isLoadingExtraFields.set(true);\n\n const profileFields$ = hasProfileFields\n ? this.profileExtension!.getExtraFieldValues!(user.id).pipe(\n catchError(() => {\n const defaults: Record<string, unknown> = {};\n for (const field of this.editableFields()) {\n if (field.key) defaults[field.key] = undefined;\n }\n return of(defaults);\n })\n )\n : of({} as Record<string, unknown>);\n\n const adminFields$ = hasAdminFields\n ? this.userFormExtension!.getExtraFieldValues!(user.id).pipe(\n catchError(() => {\n const defaults: Record<string, unknown> = {};\n for (const field of this.viewOnlyFields()) {\n if (field.key) defaults[field.key] = undefined;\n }\n return of(defaults);\n })\n )\n : of({} as Record<string, unknown>);\n\n forkJoin([profileFields$, adminFields$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingExtraFields.set(false))\n )\n .subscribe(([profileValues, adminValues]) => {\n this.extraFieldsModel.set(profileValues);\n this.originalExtraFieldsModel.set(profileValues);\n this.adminFieldsModel.set(adminValues);\n });\n }\n\n onProfilePictureUploaded(file: { id?: string; name: string; key: string; size: number; contentType: string }): void {\n const user = this.authState.user();\n if (!user || !file.id) return;\n\n const fileManagerId = file.id;\n\n this.userService\n .updateProfile({ id: user.id, profilePictureId: fileManagerId })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.authState.setUser({ ...user, profilePictureId: fileManagerId });\n this.fileUrlService\n .fetchSingleFileUrl(fileManagerId, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((fileInfo) => this._profilePictureUrl.set(fileInfo?.url ?? null));\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: this.translate('auth.profile.picture.updated') });\n }\n },\n error: () => {},\n });\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n const extraFieldsError = this.extraFieldsValidationError();\n if (extraFieldsError) {\n this.messageService.add({ severity: 'error', summary: this.translate('shared.validation.error'), detail: extraFieldsError });\n return;\n }\n\n const user = this.authState.user();\n if (!user) return;\n\n this.isLoading.set(true);\n const model = this.formModel();\n\n const updateData: IUpdateUserRequest = {\n id: user.id,\n name: model.name,\n phone: model.phone || undefined,\n };\n\n const profileUpdate$ = this.userService.updateProfile(updateData);\n const extraFieldsUpdate$ = this.isExtraFieldsDirty() && this.profileExtension?.saveExtraFieldValues\n ? this.profileExtension.saveExtraFieldValues(user.id, this.extraFieldsModel())\n : of(undefined);\n\n forkJoin([profileUpdate$, extraFieldsUpdate$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: ([response]) => {\n if (response.success && response.data) {\n this.authState.setUser({ ...user, name: response.data.name, phone: response.data.phone ?? null });\n this.originalFormModel.set({ name: response.data.name, phone: response.data.phone ?? '' });\n this.originalExtraFieldsModel.set({ ...this.extraFieldsModel() });\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: this.translate('auth.profile.update.success') });\n }\n },\n error: () => {},\n });\n }\n\n updatePasswordField(field: keyof IPasswordFormModel, value: string): void {\n this.passwordModel.update((model) => ({ ...model, [field]: value }));\n }\n\n onChangePassword(): void {\n if (!this.isPasswordFormValid()) return;\n\n this.isPasswordLoading.set(true);\n const model = this.passwordModel();\n\n this.authApiService\n .changePassword({ currentPassword: model.currentPassword, newPassword: model.newPassword })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isPasswordLoading.set(false))\n )\n .subscribe({\n next: () => {\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: this.translate('auth.profile.password.changed') });\n this.passwordModel.set({ currentPassword: '', newPassword: '', confirmPassword: '' });\n },\n error: () => {},\n });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n minLength,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n APP_CONFIG,\n getDefaultBranchSlug,\n getDefaultCompanySlug,\n isCompanyFeatureEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IRegistrationRequest } from '../../interfaces/auth.interface';\nimport {\n AUTH_REGISTRATION_EXTENSION,\n AUTH_VALIDATION_CONFIG,\n IRegistrationExtraField,\n IRegistrationFieldTemplateContext,\n REGISTRATION_FIELD_CONTEXT,\n validateEmail,\n validatePassword,\n} from '../../providers/auth-extension.providers';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n confirmPassword: string;\n phone: string;\n}\n\ninterface ICompanyFormModel {\n createNewCompany: boolean;\n companySlug: string;\n branchSlug: string;\n newCompanyName: string;\n newCompanyPhone: string;\n newCompanyAddress: string;\n}\n\n@Component({\n selector: 'lib-register-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen py-8\"\n >\n <div class=\"flex flex-col items-center justify-center\">\n <div\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"py-8 px-4 sm:py-10 sm:px-8 md:py-12 md:px-12 w-full sm:w-[650px] max-w-[95vw] sm:max-w-[90vw]\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\"\n >\n <div class=\"text-center mb-6\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.register.create.account' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">{{ 'auth.register.subtitle' | translate }}</span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"name\" class=\"block font-medium mb-2\">{{ 'auth.register.full.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"userForm.name\"\n [placeholder]=\"'auth.register.name.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"name\"\n />\n </div>\n\n <div>\n <label for=\"phone\" class=\"block font-medium mb-2\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"userForm.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"tel\"\n />\n </div>\n </div>\n\n <div class=\"mb-4\">\n <label for=\"email\" class=\"block font-medium mb-2\">{{ 'administration.user.email' | translate }} *</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"userForm.email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"email\"\n />\n @if (emailValidationError() && userFormModel().email) {\n <small class=\"text-danger block mt-1\">{{\n emailValidationError()\n }}</small>\n }\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"password\" class=\"block font-medium mb-2\">{{ 'administration.user.password' | translate }} *</label>\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"userForm.password\"\n [placeholder]=\"'shared.min.characters' | translate: { count: passwordMinLength() }\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (passwordValidationError() && userFormModel().password) {\n <small class=\"text-danger block mt-1\">{{\n passwordValidationError()\n }}</small>\n }\n </div>\n\n <div>\n <label for=\"confirmPassword\" class=\"block font-medium mb-2\">{{ 'auth.register.confirm.password' | translate }} *</label>\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n [formField]=\"userForm.confirmPassword\"\n [placeholder]=\"'auth.register.confirm.password.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch() && userFormModel().confirmPassword) {\n <small class=\"text-danger block mt-2\">{{ 'auth.register.passwords.do.not.match' | translate }}</small>\n }\n </div>\n </div>\n\n @if (extraFields().length > 0) {\n <div class=\"border-t border-surface pt-4 mt-4 mb-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (field of extraFields(); track field.key) {\n <div [class]=\"field.containerClass ?? ''\">\n <label [for]=\"field.key\" class=\"block font-medium mb-2\">\n {{ field.label }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"field.component; injector: getFieldInjector(field)\"\n ></ng-container>\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"getFieldTemplateContext(field)\"\n ></ng-container>\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n pInputText\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n class=\"w-full\"\n />\n }\n @case ('number') {\n <input\n pInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).valueAsNumber\n )\n \"\n class=\"w-full\"\n />\n }\n @case ('textarea') {\n <textarea\n pInputTextarea\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n class=\"w-full\"\n rows=\"3\"\n ></textarea>\n }\n @case ('select') {\n <select\n [id]=\"field.key\"\n class=\"p-select-native w-full\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (change)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n >\n <option value=\"\">\n {{ field.placeholder ?? ('shared.select' | translate) }}\n </option>\n @for (opt of field.options; track opt.value) {\n <option [value]=\"opt.value\">\n {{ opt.label }}\n </option>\n }\n </select>\n }\n @case ('checkbox') {\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [id]=\"field.key\"\n [checked]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n false\n \"\n (change)=\"\n updateExtraField(\n field.key,\n $any($event.target).checked\n )\n \"\n />\n <span>{{\n field.placeholder ?? field.label\n }}</span>\n </label>\n }\n @case ('date') {\n <input\n pInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n class=\"w-full\"\n />\n }\n }\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{\n extraFieldsValidationError()\n }}</small>\n }\n </div>\n }\n\n @if (companyFeatureEnabled()) {\n <div class=\"border-t border-surface pt-6 mt-6\">\n <div class=\"text-center mb-6\">\n <div class=\"text-2xl font-medium mb-2 text-color\">\n {{ 'administration.company.details' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n @if (hasDefaultCompany()) {\n {{ 'auth.register.join.default.company' | translate }}\n } @else {\n {{ 'auth.register.join.or.create.company' | translate }}\n }\n </span>\n </div>\n\n @if (!hasDefaultCompany()) {\n <div class=\"mb-4\">\n <label\n class=\"p-checkbox-native\"\n (click)=\"onCreateCompanyToggle()\"\n >\n <input\n type=\"checkbox\"\n [formField]=\"companyForm.createNewCompany\"\n />\n <span>{{ 'auth.register.create.new.company' | translate }}</span>\n </label>\n </div>\n }\n\n @if (!companyFormModel().createNewCompany) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"companySlug\" class=\"block font-medium mb-2\">{{ 'administration.company.code' | translate }}</label>\n @if (hasDefaultCompany()) {\n <input\n pInputText\n id=\"companySlug\"\n [value]=\"defaultCompanySlug()\"\n class=\"w-full bg-surface-100\"\n readonly\n />\n <small class=\"text-muted-color\">{{ 'auth.register.preconfigured.company' | translate }}</small>\n } @else {\n <input\n pInputText\n id=\"companySlug\"\n [formField]=\"companyForm.companySlug\"\n [placeholder]=\"'administration.company.code.placeholder' | translate\"\n class=\"w-full\"\n />\n <small class=\"text-muted-color\">{{ 'auth.register.enter.company.code' | translate }}</small>\n }\n </div>\n\n <div>\n <label for=\"branchSlug\" class=\"block font-medium mb-2\">{{ 'administration.branch.code' | translate }}</label>\n @if (hasDefaultBranch()) {\n <input\n pInputText\n id=\"branchSlug\"\n [value]=\"defaultBranchSlug()\"\n class=\"w-full bg-surface-100\"\n readonly\n />\n <small class=\"text-muted-color\">{{ 'auth.register.preconfigured.branch' | translate }}</small>\n } @else {\n <input\n pInputText\n id=\"branchSlug\"\n [formField]=\"companyForm.branchSlug\"\n [placeholder]=\"'administration.branch.code.placeholder' | translate\"\n class=\"w-full\"\n />\n }\n </div>\n </div>\n } @else {\n <div class=\"mb-4\">\n <label for=\"newCompanyName\" class=\"block font-medium mb-2\">{{ 'administration.company.name' | translate }} *</label>\n <input\n pInputText\n id=\"newCompanyName\"\n [formField]=\"companyForm.newCompanyName\"\n [placeholder]=\"'administration.company.name.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"newCompanyPhone\" class=\"block font-medium mb-2\">{{ 'administration.company.phone' | translate }}</label>\n <input\n pInputText\n id=\"newCompanyPhone\"\n [formField]=\"companyForm.newCompanyPhone\"\n [placeholder]=\"'administration.company.phone.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <div>\n <label for=\"newCompanyAddress\" class=\"block font-medium mb-2\">{{ 'administration.company.address' | translate }}</label>\n <input\n pInputText\n id=\"newCompanyAddress\"\n [formField]=\"companyForm.newCompanyAddress\"\n [placeholder]=\"'administration.company.address.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <p-button\n [label]=\"'auth.register.create.account' | translate\"\n styleClass=\"w-full mt-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{ 'auth.register.already.have.account' | translate }}</span>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n {{ 'auth.login.sign.in' | translate }}\n </a>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class RegisterPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n private readonly validationConfig = inject(AUTH_VALIDATION_CONFIG, {\n optional: true,\n });\n private readonly registrationExtension = inject(AUTH_REGISTRATION_EXTENSION, {\n optional: true,\n });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParamMap = toSignal(this.route.queryParamMap);\n private companySlugInitialized = false;\n\n readonly returnUrl = input<string>('');\n readonly isLoading = signal(false);\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly defaultCompanySlug = computed(() =>\n getDefaultCompanySlug(this.appConfig),\n );\n readonly defaultBranchSlug = computed(() =>\n getDefaultBranchSlug(this.appConfig),\n );\n readonly hasDefaultCompany = computed(() => !!this.defaultCompanySlug());\n readonly hasDefaultBranch = computed(() => !!this.defaultBranchSlug());\n\n readonly extraFields = computed<IRegistrationExtraField[]>(() => {\n if (!this.registrationExtension) return [];\n const fields = this.registrationExtension.getExtraFields();\n return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly extraFieldsModel = signal<Record<string, unknown>>({});\n\n private readonly emailErrorMessage = computed(\n () =>\n this.validationConfig?.email?.message ??\n this.translate('shared.invalid.email'),\n );\n readonly passwordMinLength = computed(\n () => this.validationConfig?.password?.minLength ?? 8,\n );\n private readonly passwordErrorMessage = computed(\n () =>\n this.validationConfig?.password?.message ??\n this.translate('auth.validation.password.min.length', { min: this.passwordMinLength() }),\n );\n\n readonly userFormModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n confirmPassword: '',\n phone: '',\n });\n readonly userForm = form(this.userFormModel, (f) => {\n required(f.name, { message: this.translate('auth.validation.name.required') });\n minLength(f.name, 2, { message: this.translate('auth.validation.name.min.length', { min: 2 }) });\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, { message: this.translate('auth.validation.password.required') });\n minLength(f.password, this.passwordMinLength(), {\n message: this.passwordErrorMessage(),\n });\n required(f.confirmPassword, { message: this.translate('auth.validation.confirm.password.required') });\n });\n\n readonly companyFormModel = signal<ICompanyFormModel>({\n createNewCompany: false,\n companySlug: '',\n branchSlug: '',\n newCompanyName: '',\n newCompanyPhone: '',\n newCompanyAddress: '',\n });\n readonly companyForm = form(this.companyFormModel);\n\n readonly emailValidationError = computed(() => {\n const email = this.userFormModel().email;\n if (!email) return null;\n return validateEmail(email, this.validationConfig?.email ?? undefined);\n });\n\n readonly passwordValidationError = computed(() => {\n const password = this.userFormModel().password;\n if (!password) return null;\n if (!this.validationConfig?.password) return null;\n return validatePassword(password, this.validationConfig.password);\n });\n\n readonly extraFieldsValidationError = computed(() => {\n if (!this.registrationExtension?.validateExtraFields) return null;\n return this.registrationExtension.validateExtraFields(\n this.extraFieldsModel(),\n );\n });\n\n readonly passwordsMatch = computed(() => {\n const model = this.userFormModel();\n return model.password === model.confirmPassword;\n });\n\n readonly isFormValid = computed(() => {\n const userModel = this.userFormModel();\n const emailError = this.emailValidationError();\n const passwordError = this.passwordValidationError();\n const extraFieldsError = this.extraFieldsValidationError();\n\n const userValid =\n userModel.name.trim().length >= 2 &&\n userModel.email.includes('@') &&\n !emailError &&\n userModel.password.length >= this.passwordMinLength() &&\n !passwordError &&\n userModel.confirmPassword.length > 0 &&\n this.passwordsMatch() &&\n !extraFieldsError;\n\n const extraFieldsValid = this.validateRequiredExtraFields();\n\n if (!isCompanyFeatureEnabled(this.appConfig))\n return userValid && extraFieldsValid;\n\n const companyModel = this.companyFormModel();\n if (companyModel.createNewCompany) {\n return (\n userValid &&\n extraFieldsValid &&\n companyModel.newCompanyName.trim().length > 0\n );\n }\n return userValid && extraFieldsValid;\n });\n\n private validateRequiredExtraFields(): boolean {\n const fields = this.extraFields();\n const values = this.extraFieldsModel();\n\n for (const field of fields) {\n if (field.required) {\n const value = values[field.key];\n if (value === undefined || value === null || value === '') {\n return false;\n }\n }\n }\n return true;\n }\n\n updateExtraField(key: string, value: unknown): void {\n this.extraFieldsModel.update((model) => ({ ...model, [key]: value }));\n }\n\n getFieldTemplateContext(field: IRegistrationExtraField): IRegistrationFieldTemplateContext {\n return {\n field,\n value: this.extraFieldsModel()[field.key] ?? field.defaultValue,\n updateValue: (value: unknown) => this.updateExtraField(field.key, value),\n };\n }\n\n private readonly parentInjector = inject(Injector);\n\n getFieldInjector(field: IRegistrationExtraField): Injector {\n return Injector.create({\n providers: [\n {\n provide: REGISTRATION_FIELD_CONTEXT,\n useValue: this.getFieldTemplateContext(field),\n },\n ],\n parent: field.injector ?? this.parentInjector,\n });\n }\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (!params || this.companySlugInitialized) return;\n\n this.companySlugInitialized = true;\n\n const configCompanySlug = this.defaultCompanySlug();\n const configBranchSlug = this.defaultBranchSlug();\n const queryCompanySlug = params.get('companySlug');\n\n const companySlug = configCompanySlug || queryCompanySlug || '';\n const branchSlug = configBranchSlug || '';\n\n if (companySlug || branchSlug) {\n this.companyFormModel.update((model) => ({\n ...model,\n companySlug,\n branchSlug,\n }));\n }\n });\n }\n\n onCreateCompanyToggle(): void {\n const currentValue = this.companyFormModel().createNewCompany;\n if (!currentValue) {\n this.companyFormModel.update((model) => ({\n ...model,\n createNewCompany: true,\n companySlug: '',\n branchSlug: '',\n }));\n } else {\n this.companyFormModel.update((model) => ({\n ...model,\n createNewCompany: false,\n newCompanyName: '',\n newCompanyPhone: '',\n newCompanyAddress: '',\n }));\n }\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const userModel = this.userFormModel();\n const companyModel = this.companyFormModel();\n\n let registrationData: Record<string, unknown> = {\n name: userModel.name,\n email: userModel.email,\n password: userModel.password,\n phone: userModel.phone || undefined,\n };\n\n const extraFieldsData = this.extraFieldsModel();\n if (Object.keys(extraFieldsData).length > 0) {\n registrationData['additionalFields'] = extraFieldsData;\n }\n\n if (this.registrationExtension?.transformRegistrationData) {\n registrationData =\n this.registrationExtension.transformRegistrationData(registrationData);\n }\n\n if (isCompanyFeatureEnabled(this.appConfig)) {\n if (companyModel.createNewCompany) {\n registrationData['newCompanyName'] =\n companyModel.newCompanyName || undefined;\n registrationData['newCompanyPhone'] =\n companyModel.newCompanyPhone || undefined;\n registrationData['newCompanyAddress'] =\n companyModel.newCompanyAddress || undefined;\n } else {\n registrationData['companySlug'] = companyModel.companySlug || undefined;\n registrationData['branchSlug'] = companyModel.branchSlug || undefined;\n }\n }\n\n this.authApi\n .register(registrationData as unknown as IRegistrationRequest)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (response.requiresEmailVerification) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('auth.register.success'),\n detail: this.translate('auth.verify.email.sent'),\n life: 5000,\n });\n this.router.navigate(['/auth/login']);\n return;\n }\n\n if (response.accessToken) {\n this.authState.setLoginState({\n accessToken: response.accessToken,\n refreshToken: response.refreshToken!,\n user: response.user,\n company: response.company,\n branch: response.branch,\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.register.success'),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { finalize } from 'rxjs';\nimport {\n form,\n FormField,\n required,\n minLength,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IResetPasswordFormModel {\n newPassword: string;\n confirmPassword: string;\n}\n\ntype PageState = 'form' | 'success' | 'invalid-token';\n\n@Component({\n selector: 'lib-reset-password-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('form') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.reset.password.title' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n {{ 'auth.reset.password.subtitle' | translate }}\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"newPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'auth.reset.password.new.password' | translate }}\n </label>\n <input\n pInputText\n id=\"newPassword\"\n type=\"password\"\n [placeholder]=\"'auth.reset.password.new.password.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-4\"\n [formField]=\"resetForm.newPassword\"\n autocomplete=\"new-password\" />\n\n <label for=\"confirmPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'auth.reset.password.confirm.password' | translate }}\n </label>\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n [placeholder]=\"'auth.reset.password.confirm.password.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-2\"\n [formField]=\"resetForm.confirmPassword\"\n autocomplete=\"new-password\" />\n\n @if (passwordMismatch()) {\n <small class=\"text-danger block mb-4\">{{ 'auth.register.passwords.do.not.match' | translate }}</small>\n }\n\n <p-button\n [label]=\"'auth.reset.password.reset.password' | translate\"\n styleClass=\"w-full mt-4 mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!canSubmit() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </form>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-6xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.reset.password.success' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.reset.password.success.message' | translate }}\n </p>\n <a routerLink=\"/auth/login\">\n <p-button [label]=\"'auth.login.sign.in' | translate\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-6xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.reset.password.invalid.link' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.reset.password.invalid.link.message' | translate }}\n </p>\n <a routerLink=\"/auth/forgot-password\">\n <p-button [label]=\"'auth.reset.password.request.new.link' | translate\" styleClass=\"w-full mb-4\" />\n </a>\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ResetPasswordPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParams = toSignal(this.route.queryParams);\n private tokenInitialized = false;\n\n private token = '';\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('form');\n readonly formModel = signal<IResetPasswordFormModel>({ newPassword: '', confirmPassword: '' });\n readonly resetForm = form(this.formModel, (f) => {\n required(f.newPassword, { message: this.translate('auth.validation.password.required') });\n minLength(f.newPassword, 8, { message: this.translate('auth.validation.password.min.length', { min: 8 }) });\n required(f.confirmPassword, { message: this.translate('auth.validation.confirm.password.required') });\n });\n readonly passwordMismatch = computed(() => {\n const model = this.formModel();\n return model.confirmPassword.length > 0 && model.newPassword !== model.confirmPassword;\n });\n readonly canSubmit = computed(() => this.resetForm().valid() && !this.passwordMismatch());\n\n constructor() {\n effect(() => {\n const params = this.queryParams();\n if (!params || this.tokenInitialized) return;\n\n this.tokenInitialized = true;\n this.token = params['token'] || '';\n if (!this.token) {\n this.pageState.set('invalid-token');\n }\n });\n }\n\n onSubmit(): void {\n if (!this.canSubmit()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n const newPassword = this.formModel().newPassword;\n\n this.authApi\n .resetPassword(this.token, newPassword)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: () => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.password.reset.success'),\n });\n this.pageState.set('success');\n },\n error: (error) => {\n const message = error.error?.message || '';\n // Show invalid-token state for expired/invalid token errors\n if (message.toLowerCase().includes('expired') || message.toLowerCase().includes('invalid')) {\n this.pageState.set('invalid-token');\n }\n // Other errors handled by global interceptor\n },\n });\n }\n}\n","import { Component, computed, DestroyRef, effect, inject, Injector, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required, email as emailValidator } from '@angular/forms/signals';\nimport { finalize, forkJoin, of } from 'rxjs';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IUser, ICreateUserRequest, IUpdateUserRequest } from '../../interfaces/user.interface';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserPermissionApiService } from '../../services/user-permission-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport {\n AUTH_USER_FORM_EXTENSION,\n IUserFormExtraField,\n IUserFormFieldTemplateContext,\n USER_FORM_FIELD_CONTEXT,\n} from '../../providers/auth-extension.providers';\n\n/** User form model interface */\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n phone: string;\n isActive: boolean;\n emailVerified: boolean;\n}\n\n/**\n * User Form Component\n * Handles creating and editing users.\n * When company feature is enabled, automatically assigns new users to current company/branch.\n */\n@Component({\n selector: 'lib-user-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? ('administration.user.edit' | translate) : ('administration.user.new' | translate) }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'administration.user.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'administration.user.name.placeholder' | translate\" />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">{{ 'administration.user.email' | translate }} *</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"formTree.email\"\n [placeholder]=\"'auth.email.placeholder' | translate\" />\n </div>\n\n <!-- Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"password\" class=\"font-medium\">\n {{ 'administration.user.password' | translate }} {{ isEditMode() ? ('administration.user.password.optional' | translate) : '*' }}\n </label>\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"formTree.password\"\n [placeholder]=\"'administration.user.password.placeholder' | translate\" />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\" />\n </div>\n\n <!-- Extra Fields (Admin-editable) -->\n @if (hasExtraFields()) {\n <div class=\"md:col-span-2 border-t border-surface pt-4 mt-2\">\n <div class=\"text-sm font-medium text-muted-color mb-4\">\n <i class=\"pi pi-sliders-h mr-2\"></i>{{ 'auth.profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <p-skeleton height=\"2.5rem\" />\n <p-skeleton height=\"2.5rem\" />\n </div>\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (field of extraFields(); track field.key) {\n <div class=\"flex flex-col gap-2\">\n <label [for]=\"field.key\" class=\"font-medium text-color\">\n {{ field.label }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container *ngComponentOutlet=\"field.component; injector: getFieldInjector(field)\" />\n } @else if (field.template) {\n <ng-container [ngTemplateOutlet]=\"field.template\" [ngTemplateOutletContext]=\"getFieldTemplateContext(field)\" />\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n pInputText\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n @case ('number') {\n <input\n pInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).valueAsNumber)\"\n class=\"w-full\" />\n }\n @case ('textarea') {\n <textarea\n pInputTextarea\n [id]=\"field.key\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\"\n rows=\"3\"></textarea>\n }\n @case ('select') {\n <select\n [id]=\"field.key\"\n class=\"p-select-native w-full\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"updateExtraField(field.key, $event)\">\n <option value=\"\">{{ field.placeholder ?? ('shared.select' | translate) }}</option>\n @for (opt of field.options; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n }\n @case ('checkbox') {\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [id]=\"field.key\"\n [checked]=\"getExtraFieldValue(field.key) ?? false\"\n (change)=\"updateExtraField(field.key, $any($event.target).checked)\" />\n <span>{{ field.placeholder ?? field.label }}</span>\n </label>\n }\n @case ('date') {\n <input\n pInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n }\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{ extraFieldsValidationError() }}</small>\n }\n }\n </div>\n }\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.emailVerified\" />\n <span>{{ 'administration.user.email.verified' | translate }}</span>\n </label>\n </div>\n\n <!-- Company Info (when company feature enabled) -->\n @if (companyFeatureEnabled() && !isEditMode()) {\n <div class=\"md:col-span-2 p-3 bg-primary/10 rounded-lg border border-primary/20\">\n <div class=\"flex items-center gap-2 text-primary\">\n <i class=\"pi pi-info-circle\"></i>\n <span class=\"text-sm\">\n {{ 'administration.user.auto.assign.to' | translate }}\n <strong>{{ currentCompanyName() }}</strong>\n @if (currentBranchName()) {\n / <strong>{{ currentBranchName() }}</strong>\n }\n </span>\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class UserFormComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly userService = inject(UserApiService);\n private readonly permissionService = inject(UserPermissionApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, { optional: true });\n private readonly parentInjector = inject(Injector);\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private userLoadTriggered = false;\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing user data when editing */\n readonly existingUser = signal<IUser | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingUser());\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Current company name */\n readonly currentCompanyName = computed(() => this.authState.companyName());\n\n /** Current branch name */\n readonly currentBranchName = computed(() => this.authState.branchName());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n phone: '',\n isActive: true,\n emailVerified: false,\n });\n\n /** Form with validation schema */\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('auth.validation.name.required') });\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.translate('shared.invalid.email') });\n });\n\n readonly isLoadingExtraFields = signal(false);\n readonly extraFieldsModel = signal<Record<string, unknown>>({});\n readonly originalExtraFieldsModel = signal<Record<string, unknown>>({});\n\n readonly extraFields = computed<IUserFormExtraField[]>(() => {\n if (!this.userFormExtension?.getExtraFields) return [];\n return this.userFormExtension.getExtraFields().sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly hasExtraFields = computed(() => this.extraFields().length > 0);\n\n readonly extraFieldsValidationError = computed(() => {\n if (!this.userFormExtension?.validateExtraFields) return null;\n return this.userFormExtension.validateExtraFields(this.extraFieldsModel());\n });\n\n readonly isExtraFieldsDirty = computed(() => {\n const current = this.extraFieldsModel();\n const original = this.originalExtraFieldsModel();\n return JSON.stringify(current) !== JSON.stringify(original);\n });\n\n updateExtraField(key: string, value: unknown): void {\n this.extraFieldsModel.update((model) => ({ ...model, [key]: value }));\n }\n\n getExtraFieldValue(key: string): unknown {\n return this.extraFieldsModel()[key];\n }\n\n getFieldTemplateContext(field: IUserFormExtraField): IUserFormFieldTemplateContext {\n return {\n field,\n value: this.extraFieldsModel()[field.key],\n updateValue: (value: unknown) => this.updateExtraField(field.key, value),\n };\n }\n\n getFieldInjector(field: IUserFormExtraField): Injector {\n return Injector.create({\n providers: [{ provide: USER_FORM_FIELD_CONTEXT, useValue: this.getFieldTemplateContext(field) }],\n parent: field.injector ?? this.parentInjector,\n });\n }\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n const isEdit = this.isEditMode();\n\n // Basic validation\n const nameValid = model.name.trim().length > 0;\n const emailValid = model.email.includes('@');\n\n const passwordValid = isEdit ? true : model.password.length >= 8;\n\n return nameValid && emailValid && passwordValid;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.userLoadTriggered) return;\n\n this.userLoadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadUser(id);\n }\n });\n }\n\n loadUser(id: string): void {\n this.isLoading.set(true);\n this.userService.findById(id)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingUser.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n this.loadExtraFields(id);\n }\n },\n error: () => this.router.navigate(['/administration/users']),\n });\n }\n\n private loadExtraFields(userId: string): void {\n if (!this.userFormExtension?.getExtraFieldValues) return;\n\n this.isLoadingExtraFields.set(true);\n this.userFormExtension\n .getExtraFieldValues(userId)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingExtraFields.set(false))\n )\n .subscribe({\n next: (values) => {\n this.extraFieldsModel.set(values);\n this.originalExtraFieldsModel.set(values);\n },\n error: () => {\n const defaults: Record<string, unknown> = {};\n for (const field of this.extraFields()) {\n if (field.key) defaults[field.key] = undefined;\n }\n this.extraFieldsModel.set(defaults);\n this.originalExtraFieldsModel.set(defaults);\n },\n });\n }\n\n private toFormModel(user: IUser): IUserFormModel {\n return {\n name: user.name,\n email: user.email,\n password: '',\n phone: user.phone || '',\n isActive: user.isActive,\n emailVerified: user.emailVerified,\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n if (this.isEditMode() && this.existingUser()) {\n this.updateUser();\n } else {\n this.createUser();\n }\n }\n\n private updateUser(): void {\n const model = this.formModel();\n const userId = this.existingUser()!.id;\n const updateData: IUpdateUserRequest = {\n id: userId,\n name: model.name,\n email: model.email,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n if (model.password) {\n updateData.password = model.password;\n }\n\n const userUpdate$ = this.userService.update(updateData);\n const extraFieldsUpdate$ = this.isExtraFieldsDirty() && this.userFormExtension?.saveExtraFieldValues\n ? this.userFormExtension.saveExtraFieldValues(userId, this.extraFieldsModel())\n : of(undefined);\n\n forkJoin([userUpdate$, extraFieldsUpdate$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: () => this.onSaveSuccess(this.translate('user.update.success')),\n });\n }\n\n private createUser(): void {\n const model = this.formModel();\n const createData: ICreateUserRequest = {\n name: model.name,\n email: model.email,\n password: model.password,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n this.userService.insert(createData)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n const userId = response.data.id;\n if (this.companyFeatureEnabled()) {\n this.assignUserToCompanyAndBranch(userId);\n }\n this.saveExtraFieldsForNewUser(userId);\n }\n this.onSaveSuccess(this.translate('user.create.success'));\n },\n });\n }\n\n private saveExtraFieldsForNewUser(userId: string): void {\n const extraFields = this.extraFieldsModel();\n const hasExtraData = Object.keys(extraFields).length > 0 && Object.values(extraFields).some(v => v !== undefined && v !== '');\n\n if (!hasExtraData || !this.userFormExtension?.saveExtraFieldValues) return;\n\n this.userFormExtension.saveExtraFieldValues(userId, extraFields)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: message });\n this.router.navigate(['/administration/users']);\n }\n\n /**\n * Assign user to current company and branch\n */\n private assignUserToCompanyAndBranch(userId: string): void {\n const company = this.authState.company();\n const branch = this.authState.branch();\n\n if (!company) return;\n\n // Assign to company\n this.permissionService.assignUserToCompany(userId, company.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // If branch exists, assign to branch\n if (branch) {\n this.permissionService.assignUserToBranch(userId, branch.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n // Silently fail - user was created successfully\n });\n }\n },\n // Silently fail - user was created successfully\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/users']);\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { ICompany } from '../interfaces/company.interface';\nimport { IUser } from '../interfaces/user.interface';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\ninterface CompanyWithAssignment extends ICompany {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-company-permission-dialog',\n imports: [\n AngularModule,\n PrimeModule,\n DialogModule,\n ProgressSpinnerModule,\n TranslatePipe,\n ],\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'auth.permission.manage.company' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color\">\n {{ 'auth.permission.user' | translate }}:\n <strong>{{ user()?.name }}</strong> ({{ user()?.email }})\n </p>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (company of companies(); track company.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"company.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'company-' + company.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onCompanyToggle(company)\"\n />\n <label\n [for]=\"'company-' + company.id\"\n class=\"ml-3 flex-1 cursor-pointer\"\n >\n <div class=\"font-semibold\">{{ company.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ company.slug }}</div>\n </label>\n </div>\n } @empty {\n <div class=\"text-center py-4 text-muted-color\">\n {{ 'administration.company.no.companies' | translate }}\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n [label]=\"'shared.close' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\"\n />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserCompanyPermissionDialogComponent {\n private readonly companyApi = inject(CompanyApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, params) ?? key;\n }\n\n readonly visible = input.required<boolean>();\n readonly user = input.required<IUser | null>();\n readonly closed = output<void>();\n readonly permissionsChanged = output<void>();\n\n readonly isLoading = signal(false);\n readonly isSaving = signal(false);\n readonly companies = signal<CompanyWithAssignment[]>([]);\n\n private assignedCompanyIds = new Set<string>();\n\n constructor() {\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadData();\n }\n });\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isLoading.set(true);\n try {\n const companiesResponse = await firstValueFrom(\n this.companyApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id),\n );\n\n this.assignedCompanyIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n this.assignedCompanyIds.add(permission.companyId);\n });\n }\n\n const companiesWithStatus: CompanyWithAssignment[] = (\n companiesResponse.data || []\n ).map((company) => ({\n ...company,\n isAssigned: this.assignedCompanyIds.has(company.id),\n }));\n\n this.companies.set(companiesWithStatus);\n } catch {\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onCompanyToggle(company: CompanyWithAssignment): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (company.isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToCompany(currentUser.id, company.id),\n );\n\n if (response.success) {\n this.assignedCompanyIds.add(company.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.company.assigned', {\n name: company.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromCompany(currentUser.id, company.id),\n );\n\n if (response.success) {\n this.assignedCompanyIds.delete(company.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.company.revoked', {\n name: company.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n company.isAssigned = !company.isAssigned;\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { IBranch } from '../interfaces/branch.interface';\nimport { IUser } from '../interfaces/user.interface';\nimport { BranchApiService } from '../services/branch-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\ninterface BranchWithAssignment extends IBranch {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-branch-permission-dialog',\n imports: [\n AngularModule,\n PrimeModule,\n DialogModule,\n ProgressSpinnerModule,\n TranslatePipe,\n ],\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'auth.permission.manage.branch' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color mb-3\">\n {{ 'auth.permission.user' | translate }}:\n <strong>{{ user()?.name }}</strong> ({{ user()?.email }})\n </p>\n <div class=\"flex items-center gap-2\">\n <label class=\"text-sm font-medium min-w-[70px]\"\n >{{ 'administration.branch.company' | translate }}:</label\n >\n <p-select\n [options]=\"companies()\"\n [(ngModel)]=\"selectedCompanyId\"\n (onChange)=\"onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administration.company.select' | translate\"\n styleClass=\"w-full\"\n [disabled]=\"isLoading() || isSaving()\"\n />\n </div>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (branch of branches(); track branch.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"branch.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'branch-' + branch.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onBranchToggle(branch)\"\n />\n <label\n [for]=\"'branch-' + branch.id\"\n class=\"ml-3 flex-1 cursor-pointer\"\n >\n <div class=\"font-semibold\">{{ branch.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ branch.slug }}</div>\n </label>\n </div>\n } @empty {\n <div class=\"text-center py-4 text-muted-color\">\n @if (companies().length === 0) {\n {{ 'auth.permission.no.company' | translate }}<br />\n <span class=\"text-xs\">{{\n 'auth.permission.assign.company.first' | translate\n }}</span>\n } @else if (!selectedCompanyId) {\n {{ 'auth.permission.select.company.for.branches' | translate }}\n } @else {\n {{ 'administration.branch.no.branches' | translate }}\n }\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n [label]=\"'shared.close' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\"\n />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserBranchPermissionDialogComponent {\n private readonly branchApi = inject(BranchApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, params) ?? key;\n }\n\n readonly visible = input.required<boolean>();\n readonly user = input.required<IUser | null>();\n readonly closed = output<void>();\n readonly permissionsChanged = output<void>();\n\n readonly isLoading = signal(false);\n readonly isSaving = signal(false);\n readonly branches = signal<BranchWithAssignment[]>([]);\n readonly companies = signal<Array<{ id: string; name: string }>>([]);\n\n selectedCompanyId: string | null = null;\n private assignedBranchIds = new Set<string>();\n\n constructor() {\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadUserCompaniesAndData();\n }\n });\n }\n\n private async loadUserCompaniesAndData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n try {\n const companiesResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id),\n );\n\n const userCompanies = (companiesResponse.data || []).map(\n (permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n }),\n );\n\n this.companies.set(userCompanies);\n this.selectedCompanyId = null;\n this.branches.set([]);\n } catch {}\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n const companyId = this.selectedCompanyId;\n\n if (!currentUser || !companyId) return;\n\n this.isLoading.set(true);\n try {\n const branchesResponse = await firstValueFrom(\n this.branchApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { companyId },\n select: [],\n sort: {},\n }),\n );\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserBranches(currentUser.id),\n );\n\n this.assignedBranchIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n if (permission.companyId === companyId) {\n this.assignedBranchIds.add(permission.branchId);\n }\n });\n }\n\n const branchesWithStatus: BranchWithAssignment[] = (\n branchesResponse.data || []\n ).map((branch) => ({\n ...branch,\n isAssigned: this.assignedBranchIds.has(branch.id),\n }));\n\n this.branches.set(branchesWithStatus);\n } catch {\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId) {\n this.loadData();\n }\n }\n\n async onBranchToggle(branch: BranchWithAssignment): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (branch.isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToBranch(currentUser.id, branch.id),\n );\n\n if (response.success) {\n this.assignedBranchIds.add(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.branch.assigned', {\n name: branch.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromBranch(currentUser.id, branch.id),\n );\n\n if (response.success) {\n this.assignedBranchIds.delete(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.branch.revoked', {\n name: branch.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n branch.isAssigned = !branch.isAssigned;\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { Component, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, HasPermissionDirective, PrimeModule, TranslatePipe, USER_PERMISSIONS } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { IUser } from '../../interfaces/user.interface';\nimport {\n AUTH_USER_DETAIL_CONFIG,\n AUTH_USER_LIST_EXTENSION,\n IUserListExtraAction,\n IUserListExtraColumn,\n} from '../../providers/auth-extension.providers';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserCompanyPermissionDialogComponent } from '../../components/user-company-permission-dialog.component';\nimport { UserBranchPermissionDialogComponent } from '../../components/user-branch-permission-dialog.component';\n\n@Component({\n selector: 'lib-user-list',\n imports: [\n AngularModule,\n PrimeModule,\n HasPermissionDirective,\n TranslatePipe,\n UserCompanyPermissionDialogComponent,\n UserBranchPermissionDialogComponent,\n ],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">{{ 'administration.user.title' | translate }}</h2>\n <p-button *hasPermission=\"USER_PERMISSIONS.CREATE\" [label]=\"'administration.user.add' | translate\" icon=\"pi pi-plus\" (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"users()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>{{ 'administration.user.name' | translate }}</th>\n <th>{{ 'administration.user.email' | translate }}</th>\n <th>{{ 'administration.user.phone' | translate }}</th>\n <th>{{ 'administration.user.email.verified' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n @for (col of extraColumns(); track col.key) {\n <th [class]=\"col.styleClass ?? ''\" [style.width]=\"col.width ?? 'auto'\">\n {{ col.header }}\n </th>\n }\n <th class=\"w-[180px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-user>\n <tr>\n <td>{{ user.name }}</td>\n <td>{{ user.email }}</td>\n <td>{{ user.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"user.emailVerified ? ('shared.verified' | translate) : ('shared.unverified' | translate)\"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\" />\n </td>\n <td>\n <p-tag\n [value]=\"user.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"user.isActive ? 'success' : 'danger'\" />\n </td>\n @for (col of extraColumns(); track col.key) {\n <td [class]=\"col.styleClass ?? ''\">\n @if (col.template) {\n <ng-container [ngTemplateOutlet]=\"col.template\" [ngTemplateOutletContext]=\"{ $implicit: user }\" />\n } @else if (col.field) {\n {{ getFieldValue(user, col.field) ?? '-' }}\n }\n </td>\n }\n <td>\n <div class=\"flex gap-1 flex-wrap\">\n @if (hasUserDetailView()) {\n <p-button\n icon=\"pi pi-eye\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.view.details' | translate\"\n (onClick)=\"onViewDetails(user)\" />\n }\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.edit' | translate\"\n (onClick)=\"onEdit(user)\" />\n @if (companyFeatureEnabled()) {\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [pTooltip]=\"'administration.permission.company.permissions' | translate\"\n (onClick)=\"onManageCompanyPermissions(user)\" />\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-sitemap\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [pTooltip]=\"'administration.permission.branch.permissions' | translate\"\n (onClick)=\"onManageBranchPermissions(user)\" />\n }\n @for (action of extraActions(); track action.key) {\n @if (isActionVisible(action, user)) {\n <p-button\n [icon]=\"action.icon\"\n [rounded]=\"true\"\n [text]=\"true\"\n [severity]=\"action.severity ?? 'secondary'\"\n [pTooltip]=\"action.label\"\n [disabled]=\"isActionDisabled(action, user)\"\n (onClick)=\"onExtraAction(action, user)\" />\n }\n }\n <p-button\n *hasPermission=\"USER_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [pTooltip]=\"'shared.delete' | translate\"\n (onClick)=\"onDelete(user)\" />\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td [attr.colspan]=\"tableColspan()\" class=\"text-center py-8\">\n {{ 'administration.user.no.users' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n\n @if (companyFeatureEnabled()) {\n <lib-user-company-permission-dialog\n [visible]=\"showCompanyDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showCompanyDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n\n <lib-user-branch-permission-dialog\n [visible]=\"showBranchDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showBranchDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n }\n\n @if (hasUserDetailView() && showUserDetailDialog()) {\n <p-dialog\n [header]=\"'administration.user.details' | translate\"\n [visible]=\"showUserDetailDialog()\"\n [modal]=\"true\"\n [style]=\"{ width: userDetailConfig?.width ?? '600px' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n (onHide)=\"closeUserDetailDialog()\">\n @if (selectedUser(); as user) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.name' | translate }}</label>\n <span class=\"text-color\">{{ user.name }}</span>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.email' | translate }}</label>\n <span class=\"text-color\">{{ user.email }}</span>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.phone' | translate }}</label>\n <span class=\"text-color\">{{ user.phone || '-' }}</span>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'shared.status' | translate }}</label>\n <p-tag\n [value]=\"user.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"user.isActive ? 'success' : 'danger'\" />\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.email.verified' | translate }}</label>\n <p-tag\n [value]=\"user.emailVerified ? ('shared.verified' | translate) : ('shared.unverified' | translate)\"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\" />\n </div>\n @for (col of extraColumns(); track col.key) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ col.header }}</label>\n <span class=\"text-color\">{{ getFieldValue(user, col.field ?? col.key) ?? '-' }}</span>\n </div>\n }\n </div>\n <div class=\"flex justify-end gap-2 mt-6\">\n @if (userDetailConfig?.allowEdit) {\n <p-button\n [label]=\"'shared.edit' | translate\"\n icon=\"pi pi-pencil\"\n (onClick)=\"onEdit(user); closeUserDetailDialog()\" />\n }\n <p-button\n [label]=\"'shared.close' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"closeUserDetailDialog()\" />\n </div>\n }\n </p-dialog>\n }\n `,\n})\nexport class UserListComponent {\n readonly USER_PERMISSIONS = USER_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly userService = inject(UserApiService);\n\n private readonly userListExtension = inject(AUTH_USER_LIST_EXTENSION, { optional: true });\n readonly userDetailConfig = inject(AUTH_USER_DETAIL_CONFIG, { optional: true });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly users = this.userService.data;\n readonly isLoading = this.userService.isLoading;\n readonly total = this.userService.total;\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n readonly extraColumns = computed<IUserListExtraColumn[]>(() => {\n if (!this.userListExtension) return [];\n const columns = this.userListExtension.getExtraColumns();\n return columns.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly extraActions = computed<IUserListExtraAction[]>(() => {\n if (!this.userListExtension) return [];\n const actions = this.userListExtension.getExtraActions();\n return actions.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly hasUserDetailView = computed(() => !!this.userDetailConfig);\n readonly tableColspan = computed(() => 6 + this.extraColumns().length);\n\n readonly showCompanyDialog = signal(false);\n readonly showBranchDialog = signal(false);\n readonly showUserDetailDialog = signal(false);\n readonly selectedUser = signal<IUser | null>(null);\n\n getFieldValue(user: IUser, field: string): unknown {\n const parts = field.split('.');\n let value: unknown = user;\n for (const part of parts) {\n if (value === null || value === undefined) return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n return value;\n }\n\n isActionVisible(action: IUserListExtraAction, user: IUser): boolean {\n return action.isVisible ? action.isVisible(user) : true;\n }\n\n isActionDisabled(action: IUserListExtraAction, user: IUser): boolean {\n return action.isDisabled ? action.isDisabled(user) : false;\n }\n\n onExtraAction(action: IUserListExtraAction, user: IUser): void {\n action.onClick(user);\n }\n\n onViewDetails(user: IUser): void {\n if (!this.userDetailConfig) return;\n\n if (this.userDetailConfig.viewMode === 'page') {\n this.router.navigate(['/administration/users', user.id]);\n } else {\n this.selectedUser.set(user);\n this.showUserDetailDialog.set(true);\n }\n }\n\n closeUserDetailDialog(): void {\n this.showUserDetailDialog.set(false);\n this.selectedUser.set(null);\n }\n\n loadUsers(): void {\n this.userService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 10 },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n this.userService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/users/new']);\n }\n\n onEdit(user: IUser): void {\n this.router.navigate(['/administration/users', user.id]);\n }\n\n onManageCompanyPermissions(user: IUser): void {\n this.openPermissionDialog(user, this.showCompanyDialog);\n }\n\n onManageBranchPermissions(user: IUser): void {\n this.openPermissionDialog(user, this.showBranchDialog);\n }\n\n private openPermissionDialog(user: IUser, dialogSignal: typeof this.showCompanyDialog): void {\n this.selectedUser.set(user);\n dialogSignal.set(true);\n }\n\n onDelete(user: IUser): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', { name: user.name }),\n header: this.translate('administration.user.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.userService.deleteAsync({ id: user.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('administration.user.delete.success'),\n });\n this.userService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n makeStateKey,\n PLATFORM_ID,\n signal,\n TransferState,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { finalize } from 'rxjs';\nimport {\n form,\n FormField,\n required,\n email as emailValidator,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\nconst VERIFY_EMAIL_KEY = makeStateKey<'success' | 'error'>('verify-email-result');\n\ninterface IResendFormModel {\n email: string;\n}\n\ntype PageState = 'verifying' | 'success' | 'invalid-token' | 'resend';\n\n@Component({\n selector: 'lib-verify-email-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('verifying') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-spin pi-spinner text-8xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.verifying' | translate }}\n </div>\n <p class=\"text-muted-color font-medium\">\n {{ 'auth.verify.email.please.wait' | translate }}\n </p>\n </div>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-8xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.success' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.success.message' | translate }}\n </p>\n <a routerLink=\"/auth/login\">\n <p-button [label]=\"'auth.login.sign.in' | translate\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-8xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.failed' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.invalid.link' | translate }}\n </p>\n <p-button\n [label]=\"'auth.verify.email.resend.email' | translate\"\n styleClass=\"w-full mb-4\"\n (onClick)=\"showResendForm()\" />\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </div>\n }\n\n @case ('resend') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.resend.title' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n {{ 'auth.verify.email.resend.subtitle' | translate }}\n </span>\n </div>\n\n @if (!resendSuccess()) {\n <form (ngSubmit)=\"onResend()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'administration.user.email' | translate }}\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.verify.email.email.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"resendForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n [label]=\"'auth.verify.email.resend' | translate\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isResendFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-8xl text-primary\"></i>\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.email.sent' | translate: { email: submittedEmail() } }}\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class VerifyEmailPageComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly transferState = inject(TransferState);\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParams = toSignal(this.route.queryParams);\n private verificationTriggered = false;\n\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('verifying');\n readonly resendSuccess = signal(false);\n readonly submittedEmail = signal('');\n readonly resendFormModel = signal<IResendFormModel>({ email: '' });\n readonly resendForm = form(this.resendFormModel, (f) => {\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.translate('shared.invalid.email') });\n });\n readonly isResendFormValid = computed(() => this.resendForm().valid());\n\n constructor() {\n effect(() => {\n const params = this.queryParams();\n if (!params || this.verificationTriggered) return;\n\n this.verificationTriggered = true;\n const token = params['token'] || '';\n if (!token) {\n this.pageState.set('resend');\n return;\n }\n\n // Check if we already have result from SSR (avoid duplicate API call)\n const cachedResult = this.transferState.get(VERIFY_EMAIL_KEY, null);\n if (cachedResult) {\n this.transferState.remove(VERIFY_EMAIL_KEY);\n this.handleVerificationResult(cachedResult === 'success');\n return;\n }\n\n this.verifyEmail(token);\n });\n }\n\n private verifyEmail(token: string): void {\n this.authApi\n .verifyEmail(token)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // Store result for browser hydration (SSR only)\n if (!isPlatformBrowser(this.platformId)) {\n this.transferState.set(VERIFY_EMAIL_KEY, 'success');\n }\n this.handleVerificationResult(true);\n },\n error: () => {\n if (!isPlatformBrowser(this.platformId)) {\n this.transferState.set(VERIFY_EMAIL_KEY, 'error');\n }\n this.handleVerificationResult(false);\n },\n });\n }\n\n private handleVerificationResult(success: boolean): void {\n if (success) {\n this.pageState.set('success');\n if (isPlatformBrowser(this.platformId)) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.verify.email.success'),\n });\n }\n } else {\n this.pageState.set('invalid-token');\n }\n }\n\n showResendForm(): void {\n this.pageState.set('resend');\n this.resendSuccess.set(false);\n }\n\n onResend(): void {\n if (!this.isResendFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.invalid.email'),\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.resendFormModel().email;\n\n // Always show success (security: don't reveal if email exists)\n this.authApi\n .resendVerification(email)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.handleResendComplete(email))\n )\n .subscribe();\n }\n\n private handleResendComplete(email: string): void {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.verify.email.sent'),\n });\n this.submittedEmail.set(email);\n this.resendSuccess.set(true);\n }\n}\n","// =============================================================================\n// @flusys/ng-auth - Authentication Package\n// =============================================================================\n\n// Interfaces (matching NestJS auth API)\nexport * from './interfaces/auth.interface';\nexport * from './interfaces/branch.interface';\nexport * from './interfaces/company.interface';\nexport * from './interfaces/user-permission.interface';\nexport * from './interfaces/user.interface';\n\n// Services (matching NestJS auth API)\nexport * from './services/auth-api.service';\nexport * from './services/auth-init.service';\nexport * from './services/auth-state.service';\nexport * from './services/branch-api.service';\nexport * from './services/company-api.service';\nexport * from './services/token-refresh-state.service';\nexport * from './services/user-api.service';\nexport * from './services/user-permission-api.service';\n\n// Guards\nexport * from './guards/auth.guard';\n\n// Interceptors\nexport * from './interceptors/auth.interceptor';\nexport * from './interceptors/token-refresh.interceptor';\n\n// Routes\nexport * from './routes/auth.routes';\n\n// Adapters (consolidated by target package)\nexport * from './adapters/auth-layout-providers.adapter';\nexport * from './adapters/auth-shared-providers.adapter';\n\n// Providers\nexport * from './providers/auth-layout.providers';\nexport * from './providers/auth-providers';\nexport * from './providers/auth-extension.providers';\n\n// Constants\nexport * from './constants/auth-endpoints.const';\nexport * from './constants/messages';\n\n// Pages (components)\nexport * from './pages/administration/administration-page.component';\nexport * from './pages/branch/branch-form.component';\nexport * from './pages/branch/branch-list.component';\nexport * from './pages/company/company-form.component';\nexport * from './pages/company/company-list.component';\nexport * from './pages/forgot-password/forgot-password-page.component';\nexport * from './pages/login/login-page.component';\nexport * from './pages/profile/profile-page.component';\nexport * from './pages/register/register-page.component';\nexport * from './pages/reset-password/reset-password-page.component';\nexport * from './pages/users/user-form.component';\nexport * from './pages/users/user-list.component';\nexport * from './pages/verify-email/verify-email-page.component';\n\n// Components (dialogs)\nexport * from './components/user-branch-permission-dialog.component';\nexport * from './components/user-company-permission-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","catchError","tap","i4","i1","i2","i3","i5","emailValidator","i6","i7","i8"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-auth.mjs","sources":["../../../projects/ng-auth/interfaces/auth.interface.ts","../../../projects/ng-auth/services/auth-api.service.ts","../../../projects/ng-auth/services/auth-state.service.ts","../../../projects/ng-auth/services/auth-init.service.ts","../../../projects/ng-auth/services/branch-api.service.ts","../../../projects/ng-auth/services/company-api.service.ts","../../../projects/ng-auth/services/token-refresh-state.service.ts","../../../projects/ng-auth/services/user-api.service.ts","../../../projects/ng-auth/services/user-permission-api.service.ts","../../../projects/ng-auth/constants/auth-endpoints.const.ts","../../../projects/ng-auth/guards/auth.guard.ts","../../../projects/ng-auth/interceptors/auth.interceptor.ts","../../../projects/ng-auth/interceptors/token-refresh.interceptor.ts","../../../projects/ng-auth/constants/messages.ts","../../../projects/ng-auth/routes/auth.routes.ts","../../../projects/ng-auth/adapters/auth-layout-providers.adapter.ts","../../../projects/ng-auth/adapters/auth-shared-providers.adapter.ts","../../../projects/ng-auth/providers/auth-layout.providers.ts","../../../projects/ng-auth/providers/auth-providers.ts","../../../projects/ng-auth/providers/auth-extension.providers.ts","../../../projects/ng-auth/pages/administration/administration-page.component.ts","../../../projects/ng-auth/pages/branch/branch-form.component.ts","../../../projects/ng-auth/pages/branch/branch-list.component.ts","../../../projects/ng-auth/pages/company/company-form.component.ts","../../../projects/ng-auth/pages/company/company-list.component.ts","../../../projects/ng-auth/pages/forgot-password/forgot-password-page.component.ts","../../../projects/ng-auth/pages/login/login-page.component.ts","../../../projects/ng-auth/pages/profile/profile-page.component.ts","../../../projects/ng-auth/pages/register/register-page.component.ts","../../../projects/ng-auth/pages/reset-password/reset-password-page.component.ts","../../../projects/ng-auth/pages/users/user-form.component.ts","../../../projects/ng-auth/components/user-company-permission-dialog.component.ts","../../../projects/ng-auth/components/user-branch-permission-dialog.component.ts","../../../projects/ng-auth/pages/users/user-list.component.ts","../../../projects/ng-auth/pages/verify-email/verify-email-page.component.ts","../../../projects/ng-auth/public-api.ts","../../../projects/ng-auth/flusys-ng-auth.ts"],"sourcesContent":["export interface ILoginRequest {\n email: string;\n password: string;\n}\n\nexport interface IRegistrationRequest {\n name: string;\n email: string;\n password: string;\n phone?: string;\n companySlug?: string;\n branchSlug?: string;\n newCompanyName?: string;\n newCompanyPhone?: string;\n newCompanyAddress?: string;\n additionalFields?: Record<string, unknown>;\n}\n\nexport interface ISelectRequest {\n sessionId: string;\n companyId: string;\n branchId: string;\n}\n\nexport interface ISwitchCompanyRequest {\n companyId: string;\n branchId: string;\n}\n\nexport interface IChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\nexport interface IUserInfo {\n id: string;\n email: string;\n name?: string;\n phone?: string | null;\n profilePictureId?: string | null;\n companyId?: string;\n branchId?: string;\n companyLogoId?: string;\n branchLogoId?: string;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug?: string;\n logoId?: string | null;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug?: string;\n logoId?: string | null;\n}\n\nexport interface IBranchSelectionInfo {\n id: string;\n name: string;\n slug: string;\n logoId?: string | null;\n}\n\nexport interface ICompanyWithBranches {\n id: string;\n name: string;\n slug: string;\n logoId?: string | null;\n branches: IBranchSelectionInfo[];\n}\n\nexport interface ILoginResponse {\n accessToken: string;\n refreshToken: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IMeResponse {\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IRegistrationResponse {\n accessToken?: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n requiresEmailVerification?: boolean;\n}\n\nexport interface ICompanySelectionResponse {\n requiresSelection: true;\n sessionId: string;\n expiresAt: Date | string;\n user: IUserInfo;\n companies: ICompanyWithBranches[];\n}\n\nexport interface IRefreshTokenResponse {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport interface ILoginRequiresEmailVerification {\n requiresEmailVerification: true;\n email: string;\n message: string;\n}\n\nexport type AuthResponse = ILoginResponse | ICompanySelectionResponse | ILoginRequiresEmailVerification;\n\nexport function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification {\n return 'requiresEmailVerification' in response && response.requiresEmailVerification === true;\n}\n\nexport function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse {\n return 'requiresSelection' in response && response.requiresSelection === true;\n}\n\nexport function isLoginResponse(response: AuthResponse): response is ILoginResponse {\n return 'accessToken' in response && !('requiresSelection' in response) && !('requiresEmailVerification' in response);\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl } from '@flusys/ng-core';\nimport { IMessageResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n AuthResponse,\n IChangePasswordRequest,\n ILoginRequest,\n ILoginResponse,\n IMeResponse,\n IRefreshTokenResponse,\n IRegistrationRequest,\n IRegistrationResponse,\n ISelectRequest,\n ISwitchCompanyRequest,\n} from '../interfaces/auth.interface';\n\n/**\n * Auth API Service\n * Handles all authentication-related API calls matching NestJS auth endpoints\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthApiService {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl: string;\n\n constructor() {\n this.baseUrl = getServiceUrl(this.appConfig, 'auth');\n }\n\n /**\n * Login with email and password\n * Returns either:\n * - ILoginResponse (direct login success)\n * - ICompanySelectionResponse (requires company/branch selection)\n */\n login(data: ILoginRequest): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.baseUrl}/login`, data);\n }\n\n /**\n * Register new user\n * Supports simple registration and company-based registration\n * Returns RegistrationResponse directly (not wrapped in SingleResponse)\n */\n register(data: IRegistrationRequest): Observable<IRegistrationResponse> {\n return this.http.post<IRegistrationResponse>(\n `${this.baseUrl}/register`,\n data,\n );\n }\n\n /**\n * Select company and branch after login\n * Used when login returns requiresSelection: true\n * Returns LoginResponse directly (not wrapped)\n */\n select(data: ISelectRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/select`, data);\n }\n\n /**\n * Switch company/branch for logged-in user\n * Returns LoginResponse directly (not wrapped)\n */\n switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(\n `${this.baseUrl}/switch-company`,\n data,\n );\n }\n\n /**\n * Refresh access token\n * Refresh token is sent via HTTP-only cookie\n * Returns RefreshTokenResponse directly (not wrapped)\n */\n refresh(): Observable<IRefreshTokenResponse> {\n return this.http.post<IRefreshTokenResponse>(`${this.baseUrl}/refresh`, {});\n }\n\n /**\n * Get current user info\n * Returns only user data (no tokens) - IMeResponse\n */\n me(): Observable<IMeResponse> {\n return this.http.post<IMeResponse>(`${this.baseUrl}/me`, {});\n }\n\n /**\n * Logout current user\n */\n logout(): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/logout`, {});\n }\n\n /**\n * Change password for logged-in user\n */\n changePassword(data: IChangePasswordRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/change-password`,\n data,\n );\n }\n\n /**\n * Send forgot password email\n */\n forgotPassword(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/forgot-password`, {\n email,\n });\n }\n\n /**\n * Reset password with token\n */\n resetPassword(\n token: string,\n newPassword: string,\n ): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/reset-password`, {\n token,\n newPassword,\n });\n }\n\n /**\n * Resend verification email (unauthenticated)\n */\n resendVerification(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/resend-verification`,\n { email },\n );\n }\n\n /**\n * Verify email with token\n * Returns IMessageResponse for existing user verification\n * Returns IRegistrationResponse for pending registration completion\n */\n verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse> {\n return this.http.post<IMessageResponse | IRegistrationResponse>(`${this.baseUrl}/verify-email`, {\n token,\n });\n }\n}\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ICompanySelectionResponse,\n ICompanyWithBranches,\n ILoginResponse,\n IUserInfo,\n} from '../interfaces/auth.interface';\n\n/**\n * Storage keys (static constants)\n * NOTE: Access token is NOT stored - kept in memory only for security (XSS protection)\n * Only token expiry is stored to know when refresh is needed on page load\n */\nconst STORAGE = {\n TOKEN_EXPIRY: 'tokenExpiresAt', // Store expiry time, not the token itself\n COMPANY_ID: 'selectedCompanyId',\n BRANCH_ID: 'selectedBranchId',\n} as const;\n\n/**\n * Auth State Service\n * Minimal signal-based state management for authentication\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n // DI Injection\n private readonly appConfig = inject(APP_CONFIG);\n private readonly router = inject(Router);\n private readonly platform = inject(PlatformService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n // Core State (private writable, public readonly)\n private readonly _user = signal<IUserInfo | null>(null);\n private readonly _accessToken = signal<string>(''); // Memory-only, not persisted\n private readonly _tokenExpiresAt = signal<number | null>(null); // Token expiry timestamp\n private readonly _company = signal<ICompanyInfo | null>(null);\n private readonly _branch = signal<IBranchInfo | null>(null);\n\n readonly user = this._user.asReadonly();\n readonly accessToken = this._accessToken.asReadonly();\n readonly tokenExpiresAt = this._tokenExpiresAt.asReadonly();\n readonly company = this._company.asReadonly();\n readonly branch = this._branch.asReadonly();\n\n // Company Selection State (temporary during login flow)\n private readonly _selectionSessionId = signal<string | null>(null);\n private readonly _availableCompanies = signal<ICompanyWithBranches[]>([]);\n private readonly _selectionExpiresAt = signal<Date | null>(null);\n\n readonly selectionSessionId = this._selectionSessionId.asReadonly();\n readonly availableCompanies = this._availableCompanies.asReadonly();\n\n // Computed States\n readonly isAuthenticated = computed(\n () => !!this._accessToken() && !!this._user(),\n );\n readonly requiresCompanySelection = computed(\n () => !!this._selectionSessionId() && this._availableCompanies().length > 0,\n );\n readonly userName = computed(() => this._user()?.name ?? this.translateAdapter?.translate('auth.user.default.name') ?? 'User');\n readonly companyName = computed(() => this._company()?.name ?? '');\n readonly branchName = computed(() => this._branch()?.name ?? '');\n\n /**\n * Check if token is expired or will expire soon (within 30 seconds).\n * Used to proactively refresh token before requests fail.\n */\n readonly isTokenExpired = computed(() => {\n const expiresAt = this._tokenExpiresAt();\n if (!expiresAt) return true;\n // Consider expired 30 seconds before actual expiry\n return Date.now() >= expiresAt - 30000;\n });\n\n // Config-derived states\n readonly tenantId = computed(\n () => this.appConfig.multiTenant.tenantId ?? null,\n );\n\n constructor() {\n // Auto-persist token expiry (NOT the token itself - security)\n effect(() => {\n const expiresAt = this._tokenExpiresAt();\n expiresAt\n ? this.store(STORAGE.TOKEN_EXPIRY, expiresAt.toString())\n : this.remove(STORAGE.TOKEN_EXPIRY);\n });\n\n // Auto-persist company/branch IDs\n effect(() => {\n const companyId = this._company()?.id;\n const branchId = this._branch()?.id;\n companyId\n ? this.store(STORAGE.COMPANY_ID, companyId)\n : this.remove(STORAGE.COMPANY_ID);\n branchId\n ? this.store(STORAGE.BRANCH_ID, branchId)\n : this.remove(STORAGE.BRANCH_ID);\n });\n\n // Load initial state from storage (expiry only, not token)\n this.loadFromStorage();\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n setLoginState(response: ILoginResponse): void {\n this._accessToken.set(response.accessToken);\n this._user.set(response.user);\n this._company.set(response.company ?? null);\n this._branch.set(response.branch ?? null);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(response.accessToken);\n this._tokenExpiresAt.set(expiry);\n this.clearSelectionState();\n }\n\n setSelectionState(response: ICompanySelectionResponse): void {\n this._selectionSessionId.set(response.sessionId);\n this._availableCompanies.set(response.companies);\n this._selectionExpiresAt.set(new Date(response.expiresAt));\n this._user.set(response.user);\n }\n\n clearSelectionState(): void {\n this._selectionSessionId.set(null);\n this._availableCompanies.set([]);\n this._selectionExpiresAt.set(null);\n }\n\n resetState(): void {\n this._user.set(null);\n this._accessToken.set('');\n this._tokenExpiresAt.set(null);\n this._company.set(null);\n this._branch.set(null);\n this.clearSelectionState();\n Object.values(STORAGE).forEach((key) => this.remove(key));\n }\n\n // ==========================================================================\n // Individual Setters (for external use where needed)\n // ==========================================================================\n\n setUser(user: IUserInfo | null): void {\n this._user.set(user);\n }\n\n setAccessToken(token: string): void {\n this._accessToken.set(token);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(token);\n this._tokenExpiresAt.set(expiry);\n }\n\n setCompany(company: ICompanyInfo | null): void {\n this._company.set(company);\n }\n\n setBranch(branch: IBranchInfo | null): void {\n this._branch.set(branch);\n }\n\n // ==========================================================================\n // Navigation Helpers\n // ==========================================================================\n\n navigateToLogin(returnUrl?: string): void {\n this.router.navigate(\n ['/auth/login'],\n returnUrl ? { queryParams: { returnUrl } } : {},\n );\n }\n\n navigateAfterLogin(returnUrl?: string): void {\n // Validate returnUrl to prevent open redirect attacks\n const safeUrl = this.isValidReturnUrl(returnUrl) ? returnUrl : '/';\n this.router.navigateByUrl(safeUrl);\n }\n\n /** Validates a return URL to prevent open redirect attacks */\n private isValidReturnUrl(url: string | undefined): url is string {\n if (!url) return false;\n // Must start with '/' and not contain protocol indicators\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n }\n\n // Storage accessors (used by components)\n getStoredCompanyId(): string | null {\n return this.get(STORAGE.COMPANY_ID);\n }\n\n getStoredBranchId(): string | null {\n return this.get(STORAGE.BRANCH_ID);\n }\n\n // Storage helpers\n private loadFromStorage(): void {\n if (this.platform.isServer) return;\n // Load token expiry (NOT the token - it's memory-only for security)\n const expiryStr = this.get(STORAGE.TOKEN_EXPIRY);\n if (expiryStr) {\n this._tokenExpiresAt.set(parseInt(expiryStr, 10));\n }\n }\n\n /**\n * Decode JWT expiry without verification (client-side only).\n * Returns expiry timestamp in milliseconds.\n */\n private decodeTokenExpiry(token: string): number | null {\n try {\n if (!token) return null;\n const payload = token.split('.')[1];\n if (!payload) return null;\n // Convert base64url to base64 and add padding\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const decoded = JSON.parse(atob(padded));\n return decoded.exp ? decoded.exp * 1000 : null; // Convert to milliseconds\n } catch {\n return null;\n }\n }\n\n private store(key: string, value: string): void {\n if (!this.platform.isServer) localStorage.setItem(key, value);\n }\n\n private get(key: string): string | null {\n return !this.platform.isServer ? localStorage.getItem(key) : null;\n }\n\n private remove(key: string): void {\n if (!this.platform.isServer) localStorage.removeItem(key);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n catchError,\n finalize,\n map,\n Observable,\n of,\n shareReplay,\n switchMap,\n tap,\n timeout,\n} from 'rxjs';\nimport { AuthApiService } from './auth-api.service';\nimport { AuthStateService } from './auth-state.service';\n\n/**\n * Auth Initialization Service\n * Handles app startup authentication flow:\n * 1. Check if user has valid session (via refresh token cookie)\n * 2. Restore user state from /auth/me\n * 3. Handle company selection if needed\n *\n * IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthInitService {\n private readonly authState = inject(AuthStateService);\n private readonly authApi = inject(AuthApiService);\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n\n /** Whether initial auth check has completed */\n readonly initialized = signal(false);\n\n /** Whether auth check is in progress */\n readonly loading = signal(false);\n\n /** Error from auth check */\n readonly error = signal<string | null>(null);\n\n /** Cached initialization observable to prevent duplicate calls */\n private initializationCache$: Observable<boolean> | null = null;\n\n /**\n * Initialize authentication state on app startup.\n *\n * Flow:\n * 1. If already authenticated with user data -> done\n * 2. Try refresh token (via cookie) -> get new access token\n * 3. Call /auth/me to get user info\n * 4. Update state accordingly\n *\n * Uses shareReplay to prevent duplicate initialization calls.\n */\n initialize(): Observable<boolean> {\n /**\n * 1. Already authenticated with full state\n */\n if (this.authState.isAuthenticated() && this.authState.user()) {\n this.initialized.set(true);\n return of(true);\n }\n\n /**\n * 2. Prevent infinite retry loops\n */\n if (this.initialized()) {\n return of(this.authState.isAuthenticated());\n }\n\n /**\n * 3. Reuse in-flight initialization\n */\n if (this.initializationCache$) {\n return this.initializationCache$;\n }\n\n this.loading.set(true);\n this.error.set(null);\n\n /**\n * 4. Start initialization\n * Timeout after 5 seconds to prevent app stability issues\n */\n this.initializationCache$ = this.authApi.refresh().pipe(\n timeout(5000),\n switchMap((refreshResponse) => {\n // Set access token from refresh\n this.authState.setAccessToken(refreshResponse.accessToken);\n // Fetch user profile\n return this.authApi.me().pipe(\n map((meResponse) => {\n const { user, company, branch } = meResponse;\n\n this.authState.setUser(user);\n\n if (this.appConfig.enableCompanyFeature) {\n this.authState.setCompany(company ?? null);\n this.authState.setBranch(branch ?? null);\n }\n\n return true;\n }),\n );\n }),\n\n tap(() => {\n this.initialized.set(true);\n this.loading.set(false);\n }),\n\n catchError((err) => {\n this.loading.set(false);\n // Always mark as initialized to prevent retry loops\n this.initialized.set(true);\n\n const errorMessage =\n err?.error?.message || err?.message || 'Authentication failed';\n\n const isCompanyError =\n errorMessage.includes('no company assigned') ||\n errorMessage.includes('Company with ID') ||\n errorMessage.includes('Please select a company') ||\n errorMessage.includes('Branch with ID');\n\n this.error.set(errorMessage);\n\n if (isCompanyError && this.appConfig.enableCompanyFeature) {\n // Keep token, force company selection\n this.authState.setUser(null);\n this.authState.setCompany(null);\n this.authState.setBranch(null);\n } else {\n // Full logout - but keep initialized=true to prevent retry\n this.authState.resetState();\n }\n\n return of(false);\n }),\n\n shareReplay({ bufferSize: 1, refCount: true }),\n\n finalize(() => {\n // IMPORTANT: allow re-initialization later\n this.initializationCache$ = null;\n }),\n );\n\n return this.initializationCache$;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateBranchRequest, IUpdateBranchRequest, IBranch } from '../interfaces/branch.interface';\n\n/**\n * Branch API Service\n * Signal-based service for branch CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class BranchApiService extends ApiResourceService<\n ICreateBranchRequest | IUpdateBranchRequest,\n IBranch\n> {\n private readonly _currentCompanyId = signal<string | null>(null);\n\n constructor() {\n super('branch', inject(HttpClient), 'administration');\n }\n\n setCurrentCompanyId(companyId: string | null): void {\n this._currentCompanyId.set(companyId);\n }\n\n fetchByCompany(companyId: string, search = ''): void {\n this.setCurrentCompanyId(companyId);\n this.fetchList(search, { filter: { companyId } });\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateCompanyRequest, IUpdateCompanyRequest, ICompany } from '../interfaces/company.interface';\n\n/**\n * Company API Service\n * Signal-based service for company CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class CompanyApiService extends ApiResourceService<\n ICreateCompanyRequest | IUpdateCompanyRequest,\n ICompany\n> {\n constructor() {\n super('company', inject(HttpClient), 'administration');\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Token Refresh State Service\n * Manages token refresh state for SSR-safe request queuing.\n * Uses BehaviorSubject for RxJS interop (multi-subscriber async coordination).\n */\n@Injectable({ providedIn: 'root' })\nexport class TokenRefreshStateService {\n private readonly _isRefreshing = signal(false);\n readonly isRefreshing = this._isRefreshing.asReadonly();\n\n private readonly _refreshTokenSubject = new BehaviorSubject<string | null>(null);\n readonly refreshTokenSubject$ = this._refreshTokenSubject.asObservable();\n\n startRefresh(): void {\n this._isRefreshing.set(true);\n this._refreshTokenSubject.next(null);\n }\n\n completeRefresh(newToken: string): void {\n this._isRefreshing.set(false);\n this._refreshTokenSubject.next(newToken);\n }\n\n failRefresh(): void {\n this._isRefreshing.set(false);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ICreateUserRequest, IUpdateUserRequest, IUser } from '../interfaces/user.interface';\n\n/**\n * User API Service\n * Signal-based service for user CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class UserApiService extends ApiResourceService<\n ICreateUserRequest | IUpdateUserRequest,\n IUser\n> {\n constructor() {\n super('users', inject(HttpClient), 'administration');\n }\n\n updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>> {\n return this.http.post<ISingleResponse<IUser>>(`${this.baseUrl}/profile`, data);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { Observable } from 'rxjs';\nimport {\n IAssignUserBranchRequest,\n IAssignUserCompanyRequest,\n IBatchOperationResponse,\n IUserBranchesResponse,\n IUserCompaniesResponse,\n} from '../interfaces/user-permission.interface';\n\n/**\n * User Permission API Service\n * Handles user-company and user-branch permission assignments.\n * Endpoint: POST /administration/permissions/*\n */\n@Injectable({ providedIn: 'root' })\nexport class UserPermissionApiService {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl = `${getServiceUrl(this.appConfig, 'administration')}/permissions`;\n\n // Company Permissions\n assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(`${this.baseUrl}/user-company/assign`, data);\n }\n\n assignUserToCompany(userId: string, companyId: string): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: true }] });\n }\n\n revokeUserFromCompany(userId: string, companyId: string): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: false }] });\n }\n\n getUserCompanies(userId: string): Observable<IUserCompaniesResponse> {\n return this.http.post<IUserCompaniesResponse>(`${this.baseUrl}/get-user-company`, { userId });\n }\n\n // Branch Permissions\n assignUserBranches(data: IAssignUserBranchRequest): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(`${this.baseUrl}/user-branch/assign`, data);\n }\n\n assignUserToBranch(userId: string, branchId: string): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: true }] });\n }\n\n revokeUserFromBranch(userId: string, branchId: string): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: false }] });\n }\n\n getUserBranches(userId: string, companyId?: string): Observable<IUserBranchesResponse> {\n return this.http.post<IUserBranchesResponse>(`${this.baseUrl}/get-user-branch`, {\n userId,\n ...(companyId && { companyId }),\n });\n }\n}\n","/**\n * Authentication API Endpoints\n *\n * Centralized endpoint definitions to prevent inconsistencies across interceptors\n * and services. All auth-related endpoints should be referenced from here.\n */\nexport const AUTH_ENDPOINTS = {\n LOGIN: '/auth/login',\n LOGOUT: '/auth/logout',\n REFRESH: '/auth/refresh',\n REGISTER: '/auth/register',\n ME: '/auth/me',\n SELECT: '/auth/select',\n SWITCH_COMPANY: '/auth/switch-company',\n CHANGE_PASSWORD: '/auth/change-password',\n VERIFY_EMAIL: '/auth/verify-email',\n FORGOT_PASSWORD: '/auth/forgot-password',\n RESET_PASSWORD: '/auth/reset-password',\n RESEND_VERIFICATION: '/auth/resend-verification',\n} as const;\n\n/** Check if a URL matches a specific endpoint */\nexport function isEndpoint(url: string, endpoint: string): boolean {\n return url.includes(endpoint);\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router, UrlTree } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { AUTH_ENDPOINTS } from '../constants/auth-endpoints.const';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\n\nfunction isValidReturnUrl(url: unknown): url is string {\n if (typeof url !== 'string' || !url) return false;\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n}\n\n/** Protects routes requiring authentication */\nexport const authGuard: CanActivateFn = (route, state) => {\n const authState = inject(AuthStateService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!authState.isAuthenticated()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], { queryParams: { returnUrl: state.url } });\n }\n\n if (appConfig.enableCompanyFeature) {\n if (authState.requiresCompanySelection() || !authState.company()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], { queryParams: { returnUrl: state.url } });\n }\n }\n\n return true;\n};\n\n/** Protects auth routes from authenticated users, restores session first */\nexport const guestGuard: CanActivateFn = (route): boolean | UrlTree | Observable<boolean | UrlTree> => {\n const authState = inject(AuthStateService);\n const authInit = inject(AuthInitService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n const checkAndRedirect = (): boolean | UrlTree => {\n if (authState.requiresCompanySelection()) return true;\n\n if (authState.isAuthenticated()) {\n if (appConfig.enableCompanyFeature && !authState.company()) return true;\n const returnUrl = route.queryParams['returnUrl'];\n return router.createUrlTree([isValidReturnUrl(returnUrl) ? returnUrl : '/']);\n }\n\n return true;\n };\n\n if (authInit.initialized()) return checkAndRedirect();\n\n return authInit.initialize().pipe(\n map(() => checkAndRedirect()),\n catchError(() => of(true)),\n );\n};\n\n/** Protects routes requiring company feature to be enabled */\nexport const companyFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!appConfig.enableCompanyFeature) return router.createUrlTree(['/']);\n return true;\n};\n\n/** Protects routes requiring email feature to be enabled */\nexport const emailFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!appConfig.services.email?.enabled) return router.createUrlTree([AUTH_ENDPOINTS.LOGIN]);\n return true;\n};\n\n/** Protects routes requiring sign-up feature to be enabled */\nexport const signUpFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (appConfig.enableSignUp === false) return router.createUrlTree([AUTH_ENDPOINTS.LOGIN]);\n return true;\n};\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { CookieService } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { AUTH_ENDPOINTS, isEndpoint } from '../constants/auth-endpoints.const';\nimport { AuthStateService } from '../services/auth-state.service';\n\n/** Endpoints that need withCredentials for cookie handling */\nconst COOKIE_ENDPOINTS = [\n AUTH_ENDPOINTS.LOGIN,\n AUTH_ENDPOINTS.LOGOUT,\n AUTH_ENDPOINTS.REFRESH,\n AUTH_ENDPOINTS.REGISTER,\n AUTH_ENDPOINTS.SELECT,\n AUTH_ENDPOINTS.SWITCH_COMPANY,\n AUTH_ENDPOINTS.VERIFY_EMAIL,\n] as const;\n\n/**\n * Auth Interceptor - Adds auth headers and cookie credentials to requests\n */\nexport function authInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const authState = inject(AuthStateService);\n const cookieService = inject(CookieService);\n const appConfig = inject(APP_CONFIG);\n\n const headers: Record<string, string> = {};\n\n // Add tenant header if multi-tenant mode\n if (appConfig.multiTenant.enabled) {\n const tenantId = authState.tenantId();\n if (tenantId) {\n headers[appConfig.multiTenant.tenantHeader] = tenantId;\n }\n }\n\n // Add Bearer token if available\n const token = authState.accessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // Check if this endpoint needs withCredentials for cookies\n const needsCredentials = COOKIE_ENDPOINTS.some((ep) => isEndpoint(req.url, ep));\n\n if (needsCredentials) {\n headers['cookie'] = cookieService.get();\n return next(req.clone({ withCredentials: true, setHeaders: headers }));\n }\n\n if (Object.keys(headers).length > 0) {\n return next(req.clone({ setHeaders: headers }));\n }\n\n return next(req);\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { MessageService } from 'primeng/api';\nimport { catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\nimport { AUTH_ENDPOINTS, isEndpoint } from '../constants/auth-endpoints.const';\nimport { AuthApiService } from '../services/auth-api.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { TokenRefreshStateService } from '../services/token-refresh-state.service';\n\n/** Token Refresh Interceptor - Proactive and reactive token refresh with request queuing */\nexport function tokenRefreshInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const authState = inject(AuthStateService);\n const authApi = inject(AuthApiService);\n const messageService = inject(MessageService);\n const platformId = inject(PLATFORM_ID);\n const isBrowser = isPlatformBrowser(platformId);\n const refreshState = inject(TokenRefreshStateService);\n const translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n const t = (key: string) => translateAdapter?.translate(key) ?? key;\n\n // Skip refresh for these endpoints to prevent infinite loops\n const isRefreshRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REFRESH);\n const isLoginRequest = isEndpoint(req.url, AUTH_ENDPOINTS.LOGIN);\n const isSelectRequest = isEndpoint(req.url, AUTH_ENDPOINTS.SELECT);\n const isRegisterRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REGISTER);\n\n // Don't intercept auth-related endpoints\n if (isRefreshRequest || isLoginRequest || isSelectRequest || isRegisterRequest) {\n return next(req);\n }\n\n // PROACTIVE REFRESH: Check if token is expired or expiring soon\n if (authState.isTokenExpired() && authState.tokenExpiresAt() !== null) {\n // Token is expired/expiring - refresh proactively before request\n return handleTokenRefresh(\n req,\n next,\n authState,\n authApi,\n messageService,\n isBrowser,\n refreshState,\n t,\n );\n }\n\n // Token is valid - proceed with request, handle 401 reactively\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n // Only handle 401 errors\n if (error.status !== 401) {\n return throwError(() => error);\n }\n\n // Handle 401 by refreshing token\n return handleTokenRefresh(\n req,\n next,\n authState,\n authApi,\n messageService,\n isBrowser,\n refreshState,\n t,\n );\n }),\n );\n}\n\nfunction handleTokenRefresh(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n authState: AuthStateService,\n authApi: AuthApiService,\n messageService: MessageService,\n isBrowser: boolean,\n refreshState: TokenRefreshStateService,\n t: (key: string) => string,\n): Observable<HttpEvent<unknown>> {\n if (refreshState.isRefreshing()) {\n return refreshState.refreshTokenSubject$.pipe(\n filter((token) => token !== null),\n take(1),\n switchMap((token) => next(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }))),\n );\n }\n\n refreshState.startRefresh();\n\n return authApi.refresh().pipe(\n switchMap((response) => {\n const newToken = response.accessToken;\n authState.setAccessToken(newToken);\n refreshState.completeRefresh(newToken);\n return next(req.clone({ setHeaders: { Authorization: `Bearer ${newToken}` } }));\n }),\n catchError((refreshError) => {\n refreshState.failRefresh();\n return handleRefreshFailure(authState, messageService, isBrowser, refreshError, t);\n }),\n );\n}\n\nfunction handleRefreshFailure(\n authState: AuthStateService,\n messageService: MessageService,\n isBrowser: boolean,\n error: HttpErrorResponse,\n t: (key: string) => string,\n): Observable<never> {\n if (isBrowser) {\n messageService.add({ severity: 'error', summary: t('auth.session.expired.title'), detail: t('auth.session.please.login.again') });\n }\n authState.resetState();\n authState.navigateToLogin();\n\n return throwError(() => error);\n}\n","export const AUTH_MESSAGES: Record<string, string> = {\n // Administration\n 'administration.title': 'Administration',\n 'administration.subtitle': 'Manage users, companies, and branches',\n\n // Users\n 'administration.user.title': 'Users',\n 'administration.user.add': 'Add User',\n 'administration.user.new': 'New User',\n 'administration.user.create': 'Create User',\n 'administration.user.edit': 'Edit User',\n 'administration.user.name': 'Name',\n 'administration.user.email': 'Email',\n 'administration.user.phone': 'Phone',\n 'administration.user.password': 'Password',\n 'administration.user.password.optional': '(leave blank to keep current)',\n 'administration.user.password.placeholder': 'Enter password',\n 'administration.user.name.placeholder': 'Enter full name',\n 'administration.user.email.placeholder': 'Enter email address',\n 'administration.user.phone.placeholder': 'Enter phone number',\n 'administration.user.email.verified': 'Email Verified',\n 'administration.user.no.users': 'No users found',\n 'administration.user.details': 'User Details',\n 'administration.user.auto.assign.to': 'Auto-assign to',\n 'administration.user.delete.title': 'Delete User',\n 'administration.user.delete.success': 'User deleted successfully',\n\n // Companies\n 'administration.company.title': 'Companies',\n 'administration.company.add': 'Add Company',\n 'administration.company.new': 'New Company',\n 'administration.company.create': 'Create Company',\n 'administration.company.edit': 'Edit Company',\n 'administration.company.select': 'Select Company',\n 'administration.company.name': 'Company Name',\n 'administration.company.name.placeholder': 'Enter company name',\n 'administration.company.slug': 'Company Slug',\n 'administration.company.slug.placeholder': 'Enter company slug',\n 'administration.company.code': 'Company Code',\n 'administration.company.code.placeholder': 'Enter company code',\n 'administration.company.details': 'Company Details',\n 'administration.company.phone': 'Phone',\n 'administration.company.phone.placeholder': 'Enter phone number',\n 'administration.company.email.placeholder': 'Enter email address',\n 'administration.company.address': 'Address',\n 'administration.company.address.placeholder': 'Enter address',\n 'administration.company.website': 'Website',\n 'administration.company.website.placeholder': 'Enter website URL',\n 'administration.company.no.companies': 'No companies found',\n 'administration.company.delete.title': 'Delete Company',\n 'administration.company.delete.success': 'Company deleted successfully',\n 'administration.company.slug.required': 'Company slug is required',\n\n // Branches\n 'administration.branch.title': 'Branches',\n 'administration.branch.add': 'Add Branch',\n 'administration.branch.new': 'New Branch',\n 'administration.branch.create': 'Create Branch',\n 'administration.branch.edit': 'Edit Branch',\n 'administration.branch.name': 'Branch Name',\n 'administration.branch.name.placeholder': 'Enter branch name',\n 'administration.branch.slug': 'Branch Slug',\n 'administration.branch.slug.placeholder': 'Enter branch slug',\n 'administration.branch.code': 'Branch Code',\n 'administration.branch.code.placeholder': 'Enter branch code',\n 'administration.branch.company': 'Company',\n 'administration.branch.email.placeholder': 'Enter email address',\n 'administration.branch.phone.placeholder': 'Enter phone number',\n 'administration.branch.address': 'Address',\n 'administration.branch.address.placeholder': 'Enter address',\n 'administration.branch.no.branches': 'No branches found',\n 'administration.branch.select.company.first': 'Please select a company first',\n 'administration.branch.view.branches': 'View Branches',\n 'administration.branch.delete.title': 'Delete Branch',\n 'administration.branch.delete.success': 'Branch deleted successfully',\n 'administration.branch.slug.required': 'Branch slug is required',\n\n // Permission dialogs (administration)\n 'administration.permission.company.permissions': 'Company Permissions',\n 'administration.permission.branch.permissions': 'Branch Permissions',\n\n // Login\n 'auth.login.title': 'Login',\n 'auth.login.subtitle': 'Welcome back! Please login to continue.',\n 'auth.login.sign.in': 'Sign In',\n 'auth.login.sign.in.to.continue': 'Sign in to continue to your account',\n 'auth.login.success': 'Login successful',\n 'auth.login.welcome': 'Welcome back!',\n 'auth.login.welcome.user': 'Welcome back, {{name}}!',\n 'auth.login.failed': 'Login failed. Please check your credentials.',\n 'auth.login.account.locked': 'Your account has been locked. Please contact support.',\n 'auth.login.account.inactive': 'Your account is inactive. Please contact support.',\n 'auth.login.email.not.verified': 'Please verify your email before logging in',\n 'auth.login.email': 'Email Address',\n 'auth.login.password': 'Password',\n 'auth.login.email.placeholder': 'Enter your email',\n 'auth.login.password.placeholder': 'Enter your password',\n 'auth.login.remember.me': 'Remember me',\n 'auth.login.forgot.password': 'Forgot Password?',\n 'auth.login.no.account': \"Don't have an account?\",\n 'auth.login.sign.up': 'Sign Up',\n 'auth.login.select.company': 'Select Company',\n 'auth.login.select.company.message': 'Please select a company and branch to continue',\n 'auth.login.select.company.option': 'Select a company',\n 'auth.login.select.branch.option': 'Select a branch',\n 'auth.login.remember.selection': 'Remember my selection',\n 'auth.login.back.to.sign.in': 'Back to Sign In',\n 'auth.login.verify.email.message': 'Please verify your email to complete registration',\n 'auth.login.resend.verification': 'Resend Verification Email',\n\n // Logout\n 'auth.logout.success': 'Logged out successfully',\n 'auth.logout.confirm': 'Are you sure you want to logout?',\n\n // Registration\n 'auth.register.title': 'Create Account',\n 'auth.register.create.account': 'Create Account',\n 'auth.register.subtitle': 'Fill in your details to create an account.',\n 'auth.register.success': 'Account created successfully',\n 'auth.register.failed': 'Registration failed. Please try again.',\n 'auth.register.email.exists': 'Email already exists',\n 'auth.register.full.name': 'Full Name',\n 'auth.register.name.placeholder': 'Enter your full name',\n 'auth.register.email.placeholder': 'Enter your email address',\n 'auth.register.password.placeholder': 'Create a password',\n 'auth.register.confirm.password': 'Confirm Password',\n 'auth.register.confirm.password.placeholder': 'Confirm your password',\n 'auth.register.passwords.do.not.match': 'Passwords do not match',\n 'auth.register.already.have.account': 'Already have an account?',\n 'auth.register.join.default.company': 'Join Default Company',\n 'auth.register.join.or.create.company': 'Join or Create Company',\n 'auth.register.create.new.company': 'Create New Company',\n 'auth.register.preconfigured.company': 'Pre-configured Company',\n 'auth.register.preconfigured.branch': 'Pre-configured Branch',\n 'auth.register.enter.company.code': 'Enter company code to join',\n 'auth.register.min.characters': 'Min. {{count}} characters',\n\n // Password\n 'auth.password.forgot': 'Forgot Password?',\n 'auth.password.reset': 'Reset Password',\n 'auth.password.reset.success': 'Password reset successfully',\n 'auth.password.reset.failed': 'Password reset failed',\n 'auth.password.reset.email.sent': 'Password reset email sent',\n 'auth.password.change': 'Change Password',\n 'auth.password.change.success': 'Password changed successfully',\n 'auth.password.change.failed': 'Failed to change password',\n 'auth.password.current.password': 'Current Password',\n 'auth.password.new.password': 'New Password',\n 'auth.password.confirm.password': 'Confirm Password',\n 'auth.password.requirements': 'Password must be at least 8 characters with uppercase, lowercase, and numbers.',\n\n // Session\n 'auth.session.expired': 'Your session has expired. Please login again.',\n 'auth.session.invalid': 'Invalid session. Please login again.',\n 'auth.session.expired.title': 'Session Expired',\n 'auth.session.please.login.again': 'Please log in again.',\n\n // Verification\n 'auth.verify.email': 'Verify Email',\n 'auth.verify.email.sent': 'Verification email sent. Please check your inbox.',\n 'auth.verify.email.success': 'Email Verified',\n 'auth.verify.email.success.message': 'Your email has been verified successfully. You can now login to your account.',\n 'auth.verify.email.failed': 'Verification Failed',\n 'auth.verify.email.verifying': 'Verifying Email',\n 'auth.verify.email.please.wait': 'Please wait while we verify your email address...',\n 'auth.verify.email.invalid.link': 'This verification link is invalid or has expired.',\n 'auth.verify.email.resend.email': 'Resend Verification Email',\n 'auth.verify.email.resend.title': 'Resend Verification',\n 'auth.verify.email.resend.subtitle': 'Enter your email to receive a new verification link.',\n 'auth.verify.email.email.placeholder': 'Enter your email address',\n 'auth.verify.email.email.sent': 'Verification email sent. Please check your inbox.',\n 'auth.verify.email.resend': 'Resend Email',\n 'auth.verify.resend': 'Resend Verification Email',\n\n // Forgot Password Page\n 'auth.forgot.password.title': 'Forgot Password',\n 'auth.forgot.password.subtitle': 'Enter your email address and we will send you a reset link.',\n 'auth.forgot.password.email.placeholder': 'Enter your email address',\n 'auth.forgot.password.send.reset.link': 'Send Reset Link',\n 'auth.forgot.password.remember.password': 'Remember your password?',\n 'auth.forgot.password.check.email': 'Check Your Email',\n 'auth.forgot.password.email.sent.to': 'We sent a password reset link to {{email}}',\n 'auth.forgot.password.didnt.receive': \"Didn't receive the email?\",\n 'auth.forgot.password.try.again': 'Try Again',\n\n // Reset Password Page\n 'auth.reset.password.title': 'Reset Password',\n 'auth.reset.password.subtitle': 'Enter your new password below.',\n 'auth.reset.password.new.password': 'New Password',\n 'auth.reset.password.new.password.placeholder': 'Enter your new password',\n 'auth.reset.password.confirm.password': 'Confirm Password',\n 'auth.reset.password.confirm.password.placeholder': 'Confirm your new password',\n 'auth.reset.password.reset.password': 'Reset Password',\n 'auth.reset.password.success': 'Password Reset Successful',\n 'auth.reset.password.success.message': 'Your password has been reset successfully. You can now login with your new password.',\n 'auth.reset.password.invalid.link': 'Invalid Reset Link',\n 'auth.reset.password.invalid.link.message': 'This password reset link is invalid or has expired.',\n 'auth.reset.password.request.new.link': 'Request New Link',\n\n // Profile Page\n 'auth.profile.title': 'Profile',\n 'auth.profile.subtitle': 'Manage your account settings and preferences.',\n 'auth.profile.storage.not.enabled': 'Profile picture upload is not available. Storage service is not configured.',\n 'auth.profile.name.placeholder': 'Enter your full name',\n 'auth.profile.additional.info': 'Additional Information',\n 'auth.profile.employment.info': 'Employment Information',\n 'auth.profile.managed.by.admin': 'This field is managed by an administrator.',\n 'auth.profile.security': 'Security',\n 'auth.profile.current.password': 'Current Password',\n 'auth.profile.new.password': 'New Password',\n 'auth.profile.confirm.password': 'Confirm New Password',\n 'auth.profile.change.password': 'Change Password',\n 'auth.profile.company.branch': 'Company & Branch',\n 'auth.profile.update.success': 'Profile updated successfully',\n 'auth.profile.password.changed': 'Password changed successfully',\n 'auth.profile.picture.updated': 'Profile picture updated',\n\n // Two-Factor Authentication\n 'auth.two.factor.title': 'Two-Factor Authentication',\n 'auth.two.factor.enter.code': 'Enter the code from your authenticator app',\n 'auth.two.factor.invalid.code': 'Invalid verification code',\n 'auth.two.factor.setup': 'Set up Two-Factor Authentication',\n 'auth.two.factor.enabled': 'Two-Factor Authentication enabled',\n 'auth.two.factor.disabled': 'Two-Factor Authentication disabled',\n\n // Form labels\n 'auth.field.email': 'Email Address',\n 'auth.field.password': 'Password',\n 'auth.field.remember.me': 'Remember me',\n 'auth.field.first.name': 'First Name',\n 'auth.field.last.name': 'Last Name',\n 'auth.field.full.name': 'Full Name',\n 'auth.field.username': 'Username',\n\n // Common placeholders\n 'auth.email.placeholder': 'Enter email address',\n 'auth.phone.placeholder': 'Enter phone number',\n\n // Buttons\n 'auth.button.login': 'Login',\n 'auth.button.logout': 'Logout',\n 'auth.button.register': 'Register',\n 'auth.button.create.account': 'Create Account',\n 'auth.button.reset.password': 'Reset Password',\n 'auth.button.send.reset.link': 'Send Reset Link',\n 'auth.button.back.to.login': 'Back to Login',\n\n // Token messages (API keys)\n 'auth.token.refresh.success': 'Token refreshed successfully',\n 'auth.token.invalid': 'Invalid token',\n 'auth.token.expired': 'Token has expired',\n\n // Company selection messages (API keys)\n 'auth.login.requires.selection': 'Please select a company and branch to continue',\n 'auth.company.select.success': 'Company selected successfully',\n 'auth.company.switch.success': 'Switched company successfully',\n 'auth.company.list.success': 'User companies retrieved successfully',\n 'auth.branch.list.success': 'Company branches retrieved successfully',\n 'auth.me.success': 'User info retrieved successfully',\n\n // Email verification (API keys)\n 'email.verification.sent': 'Verification email sent',\n 'email.verification.success': 'Email verified successfully',\n 'email.verification.failed': 'Email verification failed',\n 'email.verification.token.invalid': 'Invalid verification token',\n 'email.verification.token.expired': 'Verification token has expired',\n 'email.verification.not.enabled': 'Email verification is not enabled',\n 'email.verification.resend.success': 'Verification email resent successfully',\n 'email.verification.resend.throttled': 'Please wait before requesting another verification email',\n\n // User CRUD messages (API keys)\n 'user.create.success': 'User created successfully',\n 'user.create.many.success': '{{count}} users created successfully',\n 'user.get.success': 'User retrieved successfully',\n 'user.get.all.success': 'Users retrieved successfully',\n 'user.update.success': 'User updated successfully',\n 'user.update.many.success': '{{count}} users updated successfully',\n 'user.delete.success': 'User deleted successfully',\n 'user.restore.success': 'User restored successfully',\n 'user.not.found': 'User not found',\n 'user.profile.success': 'Profile retrieved successfully',\n 'user.profile.update.success': 'Profile updated successfully',\n 'user.profile.extras.success': 'Profile extras retrieved successfully',\n 'user.profile.sections.success': 'Profile sections retrieved successfully',\n 'user.profile.section.data.success': 'Profile section data retrieved successfully',\n 'user.profile.section.update.success': 'Profile section updated successfully',\n 'user.profile.completion.success': 'Profile completion retrieved successfully',\n 'user.email.verify.success': 'Email verified successfully',\n 'user.phone.verify.success': 'Phone verified successfully',\n 'user.status.update.success': 'User status updated successfully',\n\n // Company CRUD messages (API keys)\n 'company.create.success': 'Company created successfully',\n 'company.create.many.success': '{{count}} companies created successfully',\n 'company.get.success': 'Company retrieved successfully',\n 'company.get.all.success': 'Companies retrieved successfully',\n 'company.update.success': 'Company updated successfully',\n 'company.update.many.success': '{{count}} companies updated successfully',\n 'company.delete.success': 'Company deleted successfully',\n 'company.restore.success': 'Company restored successfully',\n 'company.not.found': 'Company not found',\n\n // Branch CRUD messages (API keys)\n 'branch.create.success': 'Branch created successfully',\n 'branch.create.many.success': '{{count}} branches created successfully',\n 'branch.get.success': 'Branch retrieved successfully',\n 'branch.get.all.success': 'Branches retrieved successfully',\n 'branch.update.success': 'Branch updated successfully',\n 'branch.update.many.success': '{{count}} branches updated successfully',\n 'branch.delete.success': 'Branch deleted successfully',\n 'branch.restore.success': 'Branch restored successfully',\n 'branch.not.found': 'Branch not found',\n\n // User permission messages (API keys)\n 'user.permission.company.assign.success': 'Company permission assigned successfully',\n 'user.permission.company.list.success': 'User companies retrieved successfully',\n 'user.permission.branch.assign.success': 'Branch permission assigned successfully',\n 'user.permission.branch.list.success': 'User branches retrieved successfully',\n 'user.permission.batch.success': 'Processed {{added}} additions and {{removed}} removals',\n 'user.permission.already.assigned': 'User already assigned to this {{type}}',\n 'user.permission.not.found': '{{type}} permission not found',\n\n // Additional API keys\n 'auth.token.required': 'Refresh token is required',\n 'auth.token.revoked': 'Token has been revoked',\n 'auth.token.too.large': 'Refresh token too large (≈{{size}} bytes)',\n 'auth.company.no.access': '{{entity}} belongs to another company',\n 'auth.company.not.found': 'Company not found',\n 'auth.company.required': 'Company is required',\n 'auth.company.feature.not.enabled': 'This feature is not enabled for your company',\n 'auth.branch.no.access': 'No access to this branch',\n 'auth.branch.not.found': 'Branch not found',\n 'auth.email.not.configured': 'Email service is not configured',\n 'auth.email.send.failed': 'Failed to send email',\n 'auth.session.not.available': 'Session not available',\n 'auth.profile.access.denied': 'Access to profile denied',\n 'auth.profile.sections.not.supported': 'Profile sections not supported',\n 'auth.logout.service.unavailable': 'Logout service unavailable',\n 'auth.password.change.invalid.current': 'Current password is incorrect',\n 'auth.password.change.current.required': 'Current password is required',\n 'auth.password.reset.token.expired': 'Password reset token has expired',\n 'auth.password.reset.token.used': 'Password reset token has already been used',\n 'auth.login.invalid.credentials': 'Invalid email or password',\n 'auth.login.account.deactivated': 'Your account has been deactivated',\n 'auth.register.company.already.assigned': 'Company already assigned',\n\n // Permission dialogs\n 'auth.permission.manage.company': 'Manage Company Permissions',\n 'auth.permission.manage.branch': 'Manage Branch Permissions',\n 'auth.permission.user': 'User',\n 'auth.permission.company.assigned': 'Assigned {{name}}',\n 'auth.permission.company.revoked': 'Revoked {{name}}',\n 'auth.permission.branch.assigned': 'Assigned {{name}}',\n 'auth.permission.branch.revoked': 'Revoked {{name}}',\n 'auth.permission.no.company': 'This user has no company permissions assigned.',\n 'auth.permission.assign.company.first': 'Assign company permissions first before managing branch access.',\n 'auth.permission.select.company.for.branches': 'Please select a company to view branches.',\n\n // Validation messages\n 'auth.validation.email.required': 'Email is required',\n 'auth.validation.email.invalid': 'Please enter a valid email address',\n 'auth.validation.password.required': 'Password is required',\n 'auth.validation.name.required': 'Name is required',\n 'auth.validation.name.min.length': 'Name must be at least {{min}} characters',\n 'auth.validation.password.min.length': 'Password must be at least 8 characters',\n 'auth.validation.password.max.length': 'Password exceeds maximum length',\n 'auth.validation.password.pattern': 'Password does not meet requirements',\n 'auth.validation.password.require.uppercase': 'Password must contain at least one uppercase letter',\n 'auth.validation.password.require.lowercase': 'Password must contain at least one lowercase letter',\n 'auth.validation.password.require.number': 'Password must contain at least one number',\n 'auth.validation.password.require.special': 'Password must contain at least one special character',\n 'auth.validation.confirm.password.required': 'Please confirm your password',\n 'auth.validation.company.required': 'Please select a company',\n 'auth.validation.branch.required': 'Please select a branch',\n};\n","import { Routes } from '@angular/router';\nimport {\n permissionGuard,\n USER_PERMISSIONS,\n COMPANY_PERMISSIONS,\n BRANCH_PERMISSIONS,\n SHARED_MESSAGES,\n resolveTranslationModule,\n} from '@flusys/ng-shared';\nimport { AUTH_MESSAGES } from '../constants/messages';\nimport {\n authGuard,\n companyFeatureGuard,\n emailFeatureGuard,\n guestGuard,\n signUpFeatureGuard,\n} from '../guards/auth.guard';\n\n/**\n * Auth Routes Configuration\n * Public routes for authentication (login, register, etc.)\n *\n * Note: Company selection is now handled within the login page as a multi-step flow.\n */\nexport const AUTH_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['auth'], fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES } }) },\n children: [\n {\n path: 'login',\n loadComponent: () =>\n import('../pages/login/login-page.component').then(\n (m) => m.LoginPageComponent,\n ),\n canActivate: [guestGuard],\n },\n {\n path: 'register',\n loadComponent: () =>\n import('../pages/register/register-page.component').then(\n (m) => m.RegisterPageComponent,\n ),\n canActivate: [signUpFeatureGuard, guestGuard],\n },\n {\n path: 'forgot-password',\n loadComponent: () =>\n import('../pages/forgot-password/forgot-password-page.component').then(\n (m) => m.ForgotPasswordPageComponent,\n ),\n canActivate: [emailFeatureGuard, guestGuard],\n },\n {\n path: 'reset-password',\n loadComponent: () =>\n import('../pages/reset-password/reset-password-page.component').then(\n (m) => m.ResetPasswordPageComponent,\n ),\n canActivate: [emailFeatureGuard, guestGuard],\n },\n {\n path: 'verify-email',\n loadComponent: () =>\n import('../pages/verify-email/verify-email-page.component').then(\n (m) => m.VerifyEmailPageComponent,\n ),\n canActivate: [emailFeatureGuard],\n },\n {\n path: '',\n redirectTo: 'login',\n pathMatch: 'full',\n },\n ],\n },\n];\n\n/**\n * Administration Routes Configuration\n * Protected routes for company, branch, user management and permissions\n * Uses tabbed interface - all under /administration with child routes\n */\nexport const ADMINISTRATION_ROUTES: Routes = [\n {\n path: '',\n canActivate: [authGuard],\n resolve: { translations: resolveTranslationModule({ modules: ['auth'], fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/administration/administration-page.component').then(\n (m) => m.AdministrationPageComponent,\n ),\n children: [\n // Users tab\n {\n path: 'users',\n canActivate: [permissionGuard(USER_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/users/user-list.component').then(\n (m) => m.UserListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n ],\n },\n // Company tab (requires company feature)\n {\n path: 'company',\n canActivate: [companyFeatureGuard, permissionGuard(COMPANY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/company/company-list.component').then(\n (m) => m.CompanyListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n ],\n },\n // Branch tab (requires company feature)\n {\n path: 'branch',\n canActivate: [companyFeatureGuard, permissionGuard(BRANCH_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/branch/branch-list.component').then(\n (m) => m.BranchListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n ],\n },\n // Default redirect to users\n {\n path: '',\n redirectTo: 'users',\n pathMatch: 'full',\n },\n ],\n },\n];\n\n/**\n * Profile Routes Configuration\n * Protected route for user profile management\n */\nexport const PROFILE_ROUTES: Routes = [\n {\n path: '',\n canActivate: [authGuard],\n resolve: { translations: resolveTranslationModule({ modules: ['auth'], fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/profile/profile-page.component').then(\n (m) => m.ProfilePageComponent,\n ),\n },\n];\n","import { computed, inject, Injectable, Signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ILayoutAuthApi,\n ILayoutAuthState,\n IUserInfo as ILayoutUserInfo,\n} from '@flusys/ng-layout';\nimport { Observable, of } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\nimport { AuthApiService } from '../services/auth-api.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\n/**\n * Auth Layout Provider Adapters\n *\n * Implements provider interfaces from ng-layout using ng-auth services.\n * Bridges auth state and API to layout components.\n *\n * @example\n * // In app.config.ts\n * import { provideAuthLayoutIntegration } from '@flusys/ng-auth';\n * providers: [...provideAuthLayoutIntegration()]\n */\n\n// =============================================================================\n// Layout State Adapter\n// =============================================================================\n\n@Injectable({ providedIn: 'root' })\nexport class AuthLayoutStateAdapter implements ILayoutAuthState {\n private readonly authState = inject(AuthStateService);\n\n readonly currentCompanyInfo: Signal<ICompanyInfo | null> = computed(() => {\n const company = this.authState.company();\n if (company) {\n return {\n id: company.id,\n name: company.name,\n slug: company.slug ?? '',\n imageId: company.logoId ?? '',\n };\n }\n return null;\n });\n\n readonly currentBranchInfo: Signal<IBranchInfo | null> = computed(() => {\n const branch = this.authState.branch();\n if (branch) {\n return {\n id: branch.id,\n name: branch.name,\n slug: branch.slug ?? '',\n imageId: branch.logoId ?? undefined,\n };\n }\n return null;\n });\n\n readonly loginUserData: Signal<ILayoutUserInfo | null> = computed(() => {\n const user = this.authState.user();\n if (user) {\n return {\n id: user.id,\n name: user.name ?? this.authState.userName(),\n email: user.email,\n };\n }\n return null;\n });\n}\n\n// =============================================================================\n// Layout API Adapter\n// =============================================================================\n\n@Injectable({ providedIn: 'root' })\nexport class AuthLayoutApiAdapter implements ILayoutAuthApi {\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly router = inject(Router);\n\n logOut(): Observable<any> {\n return this.authApi.logout().pipe(\n tap(() => {\n this.authState.resetState();\n }),\n );\n }\n\n navigateLogin(withUrl?: boolean): void {\n if (withUrl) {\n const currentUrl = this.router.url;\n this.authState.navigateToLogin(currentUrl);\n } else {\n this.authState.navigateToLogin();\n }\n }\n\n switchCompany(companyId: string, branchId: string): Observable<any> {\n return this.authApi.switchCompany({ companyId, branchId }).pipe(\n tap(() => {\n window.location.reload();\n }),\n );\n }\n\n getUserCompanies(): Observable<ICompanyInfo[]> {\n const userId = this.authState.user()?.id;\n if (!userId) {\n return of([]);\n }\n\n return this.permissionApi.getUserCompanies(userId).pipe(\n map((response) =>\n (response.data || []).map((permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n slug: permission.companySlug ?? '',\n imageId: '',\n })),\n ),\n );\n }\n\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]> {\n const userId = this.authState.user()?.id;\n if (!userId) {\n return of([]);\n }\n\n return this.permissionApi.getUserBranches(userId, companyId).pipe(\n map((response) =>\n (response.data || []).map((permission) => ({\n id: permission.branchId,\n name: permission.branchName,\n slug: permission.branchSlug ?? '',\n })),\n ),\n );\n }\n}\n","import { inject, Injectable, Signal } from '@angular/core';\nimport {\n IAuthStateProvider,\n ICompanyApiProvider,\n ICompanyBasicInfo,\n IListResponse,\n ISingleResponse,\n IUserBasicInfo,\n IUserPermissionProvider,\n IUserProvider,\n} from '@flusys/ng-shared';\nimport { map, Observable } from 'rxjs';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserApiService } from '../services/user-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\n/**\n * Auth Shared Provider Adapters\n *\n * Implements provider interfaces from ng-shared using ng-auth services.\n * Allows IAM, Storage, and Form-Builder packages to access auth data\n * without depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * import { provideAuthProviders } from '@flusys/ng-auth';\n * providers: [...provideAuthProviders()]\n */\n\n// =============================================================================\n// User Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthUserProviderAdapter implements IUserProvider {\n private readonly userApi = inject(UserApiService);\n\n getUsers(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n companyId?: string;\n branchId?: string;\n isActive?: boolean;\n [key: string]: any;\n }): Observable<IListResponse<IUserBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n filter: {\n ...(filter?.companyId && { companyId: filter.companyId }),\n ...(filter?.branchId && { branchId: filter.branchId }),\n ...(filter?.isActive !== undefined && { isActive: filter.isActive }),\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.userApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((user) => ({\n id: user.id,\n name: user.name ?? user.email,\n email: user.email,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n\n// =============================================================================\n// Company API Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {\n private readonly companyApi = inject(CompanyApiService);\n\n getCompanies(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n }): Observable<IListResponse<ICompanyBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.companyApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((company) => ({\n id: company.id,\n name: company.name,\n slug: company.slug,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n\n// =============================================================================\n// User Permission Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {\n private readonly userPermissionApi = inject(UserPermissionApiService);\n\n getUserBranchPermissions(\n userId: string,\n companyId?: string,\n ): Observable<ISingleResponse<any>> {\n return this.userPermissionApi.getUserBranches(\n userId,\n companyId,\n ) as Observable<ISingleResponse<any>>;\n }\n}\n\n// =============================================================================\n// Auth State Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthStateProviderAdapter implements IAuthStateProvider {\n private readonly authState = inject(AuthStateService);\n private readonly authInit = inject(AuthInitService);\n\n get isAuthenticated(): Signal<boolean> {\n return this.authState.isAuthenticated;\n }\n\n initialize(): Observable<void> {\n return this.authInit.initialize().pipe(map(() => undefined));\n }\n}\n","import { Provider } from '@angular/core';\nimport { LAYOUT_AUTH_API, LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AuthLayoutApiAdapter, AuthLayoutStateAdapter } from '../adapters/auth-layout-providers.adapter';\n\n/** Provides auth integration for ng-layout */\nexport function provideAuthLayoutIntegration(): Provider[] {\n return [\n { provide: LAYOUT_AUTH_STATE, useClass: AuthLayoutStateAdapter },\n { provide: LAYOUT_AUTH_API, useClass: AuthLayoutApiAdapter },\n ];\n}\n","import { Provider } from '@angular/core';\nimport { AUTH_STATE_PROVIDER, COMPANY_API_PROVIDER, USER_PERMISSION_PROVIDER, USER_PROVIDER } from '@flusys/ng-shared';\nimport {\n AuthCompanyApiProviderAdapter,\n AuthStateProviderAdapter,\n AuthUserPermissionProviderAdapter,\n AuthUserProviderAdapter,\n} from '../adapters/auth-shared-providers.adapter';\n\n/** Provides auth implementations for ng-shared provider interfaces */\nexport function provideAuthProviders(): Provider[] {\n return [\n { provide: USER_PROVIDER, useClass: AuthUserProviderAdapter },\n { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter },\n { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter },\n { provide: AUTH_STATE_PROVIDER, useClass: AuthStateProviderAdapter },\n ];\n}\n","import { Injector, InjectionToken, TemplateRef, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { ILogicNode } from '@flusys/ng-shared';\nimport { IUser } from '../interfaces/user.interface';\n\nexport interface IEmailValidationConfig {\n pattern?: RegExp;\n message?: string;\n messageKey?: string;\n messageParam?: Record<string, string | number>;\n}\n\nexport interface IPasswordValidationConfig {\n minLength?: number;\n maxLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n pattern?: RegExp;\n message?: string;\n messageKey?: string;\n messageParam?: Record<string, string | number>;\n}\n\nexport interface IAuthValidationConfig {\n email?: IEmailValidationConfig;\n password?: IPasswordValidationConfig;\n}\n\nexport const AUTH_VALIDATION_CONFIG = new InjectionToken<IAuthValidationConfig>(\n 'AUTH_VALIDATION_CONFIG'\n);\n\nexport interface IRegistrationFieldTemplateContext {\n field: IRegistrationExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const REGISTRATION_FIELD_CONTEXT = new InjectionToken<IRegistrationFieldTemplateContext>(\n 'REGISTRATION_FIELD_CONTEXT'\n);\n\nexport interface IRegistrationExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';\n placeholder?: string;\n placeholderKey?: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: Array<{ label: string; labelKey?: string; value: unknown }>;\n pattern?: RegExp;\n validationMessage?: string;\n validationMessageKey?: string;\n validationMessageParam?: Record<string, string | number>;\n order?: number;\n containerClass?: string;\n template?: TemplateRef<IRegistrationFieldTemplateContext>;\n component?: Type<unknown>;\n injector?: Injector;\n}\n\nexport interface IRegistrationExtensionProvider {\n getExtraFields(): IRegistrationExtraField[];\n transformRegistrationData?(data: Record<string, unknown>): Record<string, unknown>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_REGISTRATION_EXTENSION = new InjectionToken<IRegistrationExtensionProvider>(\n 'AUTH_REGISTRATION_EXTENSION'\n);\n\nexport interface IUserListExtraColumn {\n key: string;\n header: string;\n headerKey?: string;\n field?: string;\n template?: TemplateRef<{ $implicit: IUser }>;\n styleClass?: string;\n width?: string;\n sortable?: boolean;\n order?: number;\n}\n\nexport interface IUserListExtraAction {\n key: string;\n label: string;\n labelKey?: string;\n icon: string;\n severity?: 'info' | 'success' | 'warn' | 'danger' | 'secondary' | 'contrast';\n permission?: string;\n onClick: (user: IUser) => void;\n isVisible?: (user: IUser) => boolean;\n isDisabled?: (user: IUser) => boolean;\n order?: number;\n}\n\nexport interface IUserListExtensionProvider {\n getExtraColumns(): IUserListExtraColumn[];\n getExtraActions(): IUserListExtraAction[];\n enrichUserData?(users: IUser[]): Observable<IUser[]>;\n}\n\nexport const AUTH_USER_LIST_EXTENSION = new InjectionToken<IUserListExtensionProvider>(\n 'AUTH_USER_LIST_EXTENSION'\n);\n\nexport interface IProfileExtraSection {\n key: string;\n title: string;\n titleKey?: string;\n icon?: string;\n order?: number;\n component?: Type<unknown>;\n template?: TemplateRef<{ user: IUser }>;\n collapsible?: boolean;\n collapsed?: boolean;\n editPermission?: string | ILogicNode;\n}\n\nexport interface IProfileFieldTemplateContext {\n field: IProfileExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const PROFILE_FIELD_CONTEXT = new InjectionToken<IProfileFieldTemplateContext>(\n 'PROFILE_FIELD_CONTEXT'\n);\n\nexport interface IProfileExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';\n placeholder?: string;\n placeholderKey?: string;\n editable?: boolean;\n required?: boolean;\n options?: Array<{ label: string; labelKey?: string; value: unknown }>;\n pattern?: RegExp;\n validationMessage?: string;\n validationMessageKey?: string;\n validationMessageParam?: Record<string, string | number>;\n order?: number;\n sectionKey?: string;\n template?: TemplateRef<IProfileFieldTemplateContext>;\n component?: Type<unknown>;\n injector?: Injector;\n}\n\nexport interface IProfileExtensionProvider {\n getExtraSections?(): IProfileExtraSection[];\n getExtraFields?(): IProfileExtraField[];\n getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;\n saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_PROFILE_EXTENSION = new InjectionToken<IProfileExtensionProvider>(\n 'AUTH_PROFILE_EXTENSION'\n);\n\nexport interface IUserFormFieldTemplateContext {\n field: IUserFormExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const USER_FORM_FIELD_CONTEXT = new InjectionToken<IUserFormFieldTemplateContext>(\n 'USER_FORM_FIELD_CONTEXT'\n);\n\nexport interface IUserFormExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';\n placeholder?: string;\n placeholderKey?: string;\n required?: boolean;\n options?: Array<{ label: string; labelKey?: string; value: unknown }>;\n pattern?: RegExp;\n validationMessage?: string;\n validationMessageKey?: string;\n validationMessageParam?: Record<string, string | number>;\n order?: number;\n template?: TemplateRef<IUserFormFieldTemplateContext>;\n component?: Type<unknown>;\n injector?: Injector;\n}\n\nexport interface IUserFormExtensionProvider {\n getExtraFields?(): IUserFormExtraField[];\n getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;\n saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_USER_FORM_EXTENSION = new InjectionToken<IUserFormExtensionProvider>(\n 'AUTH_USER_FORM_EXTENSION'\n);\n\nexport type UserDetailViewMode = 'dialog' | 'sidebar' | 'page';\n\nexport interface IUserDetailViewConfig {\n viewMode: UserDetailViewMode;\n allowEdit?: boolean;\n width?: string;\n component?: Type<unknown>;\n tabs?: Array<{\n key: string;\n label: string;\n labelKey?: string;\n icon?: string;\n component?: Type<unknown>;\n template?: TemplateRef<{ user: IUser }>;\n }>;\n}\n\nexport const AUTH_USER_DETAIL_CONFIG = new InjectionToken<IUserDetailViewConfig>(\n 'AUTH_USER_DETAIL_CONFIG'\n);\n\nexport function validatePassword(password: string, config: IPasswordValidationConfig): string | null {\n const minLen = config.minLength ?? 8;\n const maxLen = config.maxLength;\n\n if (password.length < minLen) {\n return config.message ?? 'auth.validation.password.min.length';\n }\n if (maxLen && password.length > maxLen) {\n return config.message ?? 'auth.validation.password.max.length';\n }\n\n if (config.pattern) {\n if (!config.pattern.test(password)) {\n return config.message ?? 'auth.validation.password.pattern';\n }\n } else {\n if (config.requireUppercase && !/[A-Z]/.test(password)) {\n return config.message ?? 'auth.validation.password.require.uppercase';\n }\n if (config.requireLowercase && !/[a-z]/.test(password)) {\n return config.message ?? 'auth.validation.password.require.lowercase';\n }\n if (config.requireNumbers && !/\\d/.test(password)) {\n return config.message ?? 'auth.validation.password.require.number';\n }\n if (config.requireSpecialChars && !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) {\n return config.message ?? 'auth.validation.password.require.special';\n }\n }\n\n return null;\n}\n\nexport function validateEmail(email: string, config?: IEmailValidationConfig): string | null {\n const pattern = config?.pattern ?? /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const message = config?.message ?? 'auth.validation.email.invalid';\n\n if (!pattern.test(email)) return message;\n return null;\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n PermissionValidatorService,\n TranslatePipe,\n USER_PERMISSIONS,\n COMPANY_PERMISSIONS,\n BRANCH_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { CommonModule } from '@angular/common';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n requiresCompanyFeature?: boolean;\n}\n\n/**\n * Administration Page Component\n * Unified administration page with tabs for:\n * - Users (always visible) - includes permission management via dialogs\n * - Companies (only if company feature enabled)\n * - Branches (only if company feature enabled)\n */\n@Component({\n selector: 'lib-administration-page',\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">{{ 'administration.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1\">{{ 'administration.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <div>\n <router-outlet />\n </div>\n </div>\n `,\n})\nexport class AdministrationPageComponent {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'users',\n labelKey: 'administration.user.title',\n icon: 'pi pi-users',\n route: 'users',\n permission: USER_PERMISSIONS.READ,\n },\n {\n id: 'companies',\n labelKey: 'administration.company.title',\n icon: 'pi pi-building',\n route: 'company',\n permission: COMPANY_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n {\n id: 'branches',\n labelKey: 'administration.branch.title',\n icon: 'pi pi-sitemap',\n route: 'branch',\n permission: BRANCH_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n ];\n\n /** Check if company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Visible tabs based on config and permissions */\n readonly visibleTabs = computed(() => {\n return this.allTabs.filter((tab) => {\n const hasCompanyFeature = !tab.requiresCompanyFeature || this.companyFeatureEnabled();\n const hasPermission = this.permissionValidator.hasPermission(tab.permission);\n return hasCompanyFeature && hasPermission;\n });\n });\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranch,\n ICreateBranchRequest,\n IUpdateBranchRequest,\n} from '../../interfaces/branch.interface';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Branch form model interface */\ninterface IBranchFormModel {\n companyId: string;\n name: string;\n slug: string;\n email: string;\n phone: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Branch Form Component\n * Handles creating and editing branches.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? ('administration.branch.edit' | translate) : ('administration.branch.new' | translate) }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Company Selection -->\n @if (!isEditMode()) {\n <div class=\"flex flex-col gap-2\">\n <label for=\"companyId\" class=\"font-medium\">{{ 'administration.company.title' | translate }} *</label>\n <select\n id=\"companyId\"\n class=\"p-select-native w-full\"\n [formField]=\"branchForm.companyId\">\n <option value=\"\">{{ 'administration.company.select' | translate }}</option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'administration.branch.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"branchForm.name\"\n (blur)=\"generateSlug()\"\n [placeholder]=\"'administration.branch.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">{{ 'administration.branch.slug' | translate }} *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"branchForm.slug\"\n [placeholder]=\"'administration.branch.slug.placeholder' | translate\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">{{ 'administration.user.email' | translate }}</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"branchForm.email\"\n [placeholder]=\"'administration.branch.email.placeholder' | translate\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"branchForm.phone\"\n [placeholder]=\"'administration.branch.phone.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"branchForm.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">{{ 'administration.branch.address' | translate }}</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"branchForm.address\"\n [placeholder]=\"'administration.branch.address.placeholder' | translate\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class BranchFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // Route params as signals\n private readonly routeParams = toSignal(this.route.paramMap);\n private readonly queryParams = toSignal(this.route.queryParamMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing branch data when editing */\n readonly existingBranch = signal<IBranch | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingBranch());\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IBranchFormModel>({\n companyId: '',\n name: '',\n slug: '',\n email: '',\n phone: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly branchForm = form(this.formModel, (f) => {\n required(f.companyId, { message: this.translate('auth.validation.company.required') });\n required(f.name, { message: this.translate('shared.name.required') });\n required(f.slug, { message: this.translate('administration.branch.slug.required') });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.companyId.trim().length > 0 &&\n model.name.trim().length > 0 &&\n model.slug.trim().length > 0\n );\n });\n\n constructor() {\n // Load companies on initialization\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n const query = this.queryParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadBranch(id);\n } else {\n // Set company from query params or current company\n const queryCompanyId = query?.get('companyId');\n const currentCompanyId = this.authState.company()?.id;\n const companyId = queryCompanyId || currentCompanyId;\n\n if (companyId) {\n this.formModel.update((m) => ({ ...m, companyId }));\n }\n }\n });\n }\n\n async loadBranch(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.branchService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingBranch.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n } catch {\n this.router.navigate(['/administration/branch']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private toFormModel(branch: IBranch): IBranchFormModel {\n return {\n companyId: branch.companyId,\n name: branch.name,\n slug: branch.slug,\n email: branch.email || '',\n phone: branch.phone || '',\n address: branch.address || '',\n isActive: branch.isActive,\n };\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n if (this.isEditMode() && this.existingBranch()) {\n await this.updateBranch();\n } else {\n await this.createBranch();\n }\n this.navigateToList();\n } catch {\n // Error handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async updateBranch(): Promise<void> {\n const model = this.formModel();\n const updateData: IUpdateBranchRequest = {\n id: this.existingBranch()!.id,\n name: model.name,\n slug: model.slug,\n ...this.buildOptionalFields(model),\n };\n await this.branchService.updateAsync(updateData);\n this.onSaveSuccess(this.translate('branch.update.success'));\n }\n\n private async createBranch(): Promise<void> {\n const model = this.formModel();\n const createData: ICreateBranchRequest = {\n companyId: model.companyId,\n name: model.name,\n slug: model.slug,\n ...this.buildOptionalFields(model),\n };\n await this.branchService.insertAsync(createData);\n this.onSaveSuccess(this.translate('branch.create.success'));\n }\n\n private buildOptionalFields(model: IBranchFormModel) {\n return {\n email: model.email || undefined,\n phone: model.phone || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: message });\n }\n\n private getTargetCompanyId(): string | null {\n return this.existingBranch()?.companyId || this.formModel().companyId || null;\n }\n\n private navigateToList(): void {\n const companyId = this.getTargetCompanyId();\n this.router.navigate(['/administration/branch'], {\n queryParams: companyId ? { companyId } : {},\n });\n }\n\n onCancel(): void {\n this.navigateToList();\n }\n}\n","import { Component, effect, inject, signal, untracked } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, BRANCH_PERMISSIONS, HasPermissionDirective, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { IBranch } from '../../interfaces/branch.interface';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/**\n * Branch List Component\n * Displays a list of branches for a company with CRUD operations.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-list',\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <div class=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\">\n <h2 class=\"text-xl font-semibold m-0\">{{ 'administration.branch.title' | translate }}</h2>\n @if (companies().length > 1) {\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event); onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administration.company.select' | translate\"\n styleClass=\"w-full sm:w-64\" />\n }\n </div>\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.CREATE\"\n [label]=\"'administration.branch.add' | translate\"\n icon=\"pi pi-plus\"\n [disabled]=\"!selectedCompanyId()\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"branches()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>{{ 'administration.branch.name' | translate }}</th>\n <th>{{ 'administration.branch.slug' | translate }}</th>\n <th>{{ 'administration.user.email' | translate }}</th>\n <th>{{ 'administration.user.phone' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-branch>\n <tr>\n <td>{{ branch.name }}</td>\n <td>{{ branch.slug }}</td>\n <td>{{ branch.email || '-' }}</td>\n <td>{{ branch.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"branch.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"branch.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.edit' | translate\"\n (onClick)=\"onEdit(branch)\" />\n @if (!branch.readOnly) {\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [pTooltip]=\"'shared.delete' | translate\"\n (onClick)=\"onDelete(branch)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n @if (!selectedCompanyId()) {\n {{ 'administration.branch.select.company.first' | translate }}\n } @else {\n {{ 'administration.branch.no.branches' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class BranchListComponent {\n // Permission constants for template\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParamMap = toSignal(this.route.queryParamMap);\n private initialized = false;\n\n /** Selected company ID (signal for zoneless change detection) */\n readonly selectedCompanyId = signal<string | null>(null);\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n /** Branches from service */\n readonly branches = this.branchService.data;\n\n /** Loading state from service */\n readonly isLoading = this.branchService.isLoading;\n\n /** Total count from service */\n readonly total = this.branchService.total;\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (this.initialized) return;\n\n this.initialized = true;\n\n // Use untracked to avoid nested effect error when initializing resources\n untracked(() => {\n // Load companies for dropdown\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Check for company ID from query params or use current company\n // p-table's onLazyLoad will handle the initial data fetch\n const queryCompanyId = params?.get('companyId') || null;\n const currentCompanyId = this.authState.company()?.id;\n\n this.selectedCompanyId.set(queryCompanyId || currentCompanyId || null);\n });\n });\n }\n\n loadBranches(): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.branchService.fetchByCompany(companyId, '');\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId()) {\n this.loadBranches();\n }\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n\n // Use fetchByCompany to maintain company context\n this.branchService.setCurrentCompanyId(companyId);\n this.branchService.fetchList('', {\n filter: { companyId },\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/branch/new'], {\n queryParams: { companyId: this.selectedCompanyId() },\n });\n }\n\n onEdit(branch: IBranch): void {\n this.router.navigate(['/administration/branch', branch.id]);\n }\n\n onDelete(branch: IBranch): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', { name: branch.name }),\n header: this.translate('administration.branch.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.branchService.deleteAsync({ id: branch.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('administration.branch.delete.success'),\n });\n this.branchService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n ICompany,\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n} from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Company form model interface */\ninterface ICompanyFormModel {\n name: string;\n slug: string;\n email: string;\n phone: string;\n website: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Company Form Component\n * Handles creating and editing companies.\n */\n@Component({\n selector: 'lib-company-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? ('administration.company.edit' | translate) : ('administration.company.new' | translate) }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'administration.company.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"companyForm.name\"\n (blur)=\"generateSlug()\"\n [placeholder]=\"'administration.company.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">{{ 'administration.company.slug' | translate }} *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"companyForm.slug\"\n [placeholder]=\"'administration.company.slug.placeholder' | translate\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">{{ 'administration.user.email' | translate }}</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"companyForm.email\"\n [placeholder]=\"'administration.company.email.placeholder' | translate\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"companyForm.phone\"\n [placeholder]=\"'administration.company.phone.placeholder' | translate\"\n />\n </div>\n\n <!-- Website -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"website\" class=\"font-medium\">{{ 'administration.company.website' | translate }}</label>\n <input\n pInputText\n id=\"website\"\n [formField]=\"companyForm.website\"\n [placeholder]=\"'administration.company.website.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"companyForm.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">{{ 'administration.company.address' | translate }}</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"companyForm.address\"\n [placeholder]=\"'administration.company.address.placeholder' | translate\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class CompanyFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly companyService = inject(CompanyApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n // Route params as signal\n private readonly routeParams = toSignal(this.route.paramMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing company data when editing */\n readonly existingCompany = signal<ICompany | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingCompany());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<ICompanyFormModel>({\n name: '',\n slug: '',\n email: '',\n phone: '',\n website: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly companyForm = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('shared.name.required') });\n required(f.slug, { message: this.translate('administration.company.slug.required') });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0 && model.slug.trim().length > 0;\n });\n\n constructor() {\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadCompany(id);\n }\n });\n }\n\n private async loadCompany(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.companyService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingCompany.set(response.data);\n this.formModel.set({\n name: response.data.name,\n slug: response.data.slug,\n email: response.data.email || '',\n phone: response.data.phone || '',\n website: response.data.website || '',\n address: response.data.address || '',\n isActive: response.data.isActive,\n });\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/administration/company']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const isEdit = this.isEditMode() && this.existingCompany();\n\n if (isEdit) {\n const updateData: IUpdateCompanyRequest = {\n id: this.existingCompany()!.id,\n ...this.buildCompanyData(),\n };\n await this.companyService.updateAsync(updateData);\n } else {\n await this.companyService.insertAsync(this.buildCompanyData());\n }\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: isEdit ? this.translate('company.update.success') : this.translate('company.create.success'),\n });\n this.router.navigate(['/administration/company']);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/company']);\n }\n\n /** Build company data from form model */\n private buildCompanyData(): ICreateCompanyRequest {\n const model = this.formModel();\n return {\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n website: model.website || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, BRANCH_PERMISSIONS, COMPANY_PERMISSIONS, HasPermissionDirective, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/**\n * Company List Component\n * Displays a list of companies with CRUD operations.\n * Only visible when company feature is enabled.\n */\n@Component({\n selector: 'lib-company-list',\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">{{ 'administration.company.title' | translate }}</h2>\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.CREATE\"\n [label]=\"'administration.company.add' | translate\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"companies()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>{{ 'administration.company.name' | translate }}</th>\n <th>{{ 'administration.company.slug' | translate }}</th>\n <th>{{ 'administration.user.email' | translate }}</th>\n <th>{{ 'administration.user.phone' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-company>\n <tr>\n <td>{{ company.name }}</td>\n <td>{{ company.slug }}</td>\n <td>{{ company.email || '-' }}</td>\n <td>{{ company.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"company.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"company.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.edit' | translate\"\n (onClick)=\"onEdit(company)\" />\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.READ\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [pTooltip]=\"'administration.branch.view.branches' | translate\"\n (onClick)=\"onViewBranches(company)\" />\n @if (!company.readOnly) {\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [pTooltip]=\"'shared.delete' | translate\"\n (onClick)=\"onDelete(company)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n {{ 'administration.company.no.companies' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class CompanyListComponent {\n // Permission constants for template\n readonly COMPANY_PERMISSIONS = COMPANY_PERMISSIONS;\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly companyService = inject(CompanyApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n /** Companies from service */\n readonly companies = this.companyService.data;\n\n /** Loading state from service */\n readonly isLoading = this.companyService.isLoading;\n\n /** Total count from service */\n readonly total = this.companyService.total;\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n this.companyService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/company/new']);\n }\n\n onEdit(company: ICompany): void {\n this.router.navigate(['/administration/company', company.id]);\n }\n\n onViewBranches(company: ICompany): void {\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId: company.id },\n });\n }\n\n onDelete(company: ICompany): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', { name: company.name }),\n header: this.translate('administration.company.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.companyService.deleteAsync({ id: company.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('administration.company.delete.success'),\n });\n this.companyService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required, email as emailValidator } from '@angular/forms/signals';\nimport { finalize, tap } from 'rxjs';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IForgotPasswordFormModel {\n email: string;\n}\n\n@Component({\n selector: 'lib-forgot-password-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @if (!emailSent()) {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.forgot.password.title' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n {{ 'auth.forgot.password.subtitle' | translate }}\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'administration.user.email' | translate }}\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.forgot.password.email.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"forgotForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n [label]=\"'auth.forgot.password.send.reset.link' | translate\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <span class=\"font-medium\">{{ 'auth.forgot.password.remember.password' | translate }}</span>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.sign.in' | translate }}\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.forgot.password.check.email' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.forgot.password.email.sent.to' | translate: { email: submittedEmail() } }}\n </p>\n <p class=\"text-sm text-muted-color mb-6\">\n {{ 'auth.forgot.password.didnt.receive' | translate }}\n <span\n class=\"text-primary cursor-pointer font-semibold\"\n (click)=\"resetForm()\">\n {{ 'auth.forgot.password.try.again' | translate }}\n </span>.\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ForgotPasswordPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly emailSent = signal(false);\n readonly submittedEmail = signal('');\n readonly formModel = signal<IForgotPasswordFormModel>({ email: '' });\n readonly forgotForm = form(this.formModel, (f) => {\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.translate('shared.invalid.email') });\n });\n readonly isFormValid = computed(() => this.forgotForm().valid());\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.invalid.email'),\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.formModel().email;\n\n // Always show success (security: don't reveal if email exists)\n this.authApi\n .forgotPassword(email)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n tap({ next: () => this.showEmailSent(email), error: () => this.showEmailSent(email) }),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe();\n }\n\n private showEmailSent(email: string): void {\n this.submittedEmail.set(email);\n this.emailSent.set(true);\n }\n\n resetForm(): void {\n this.emailSent.set(false);\n this.submittedEmail.set('');\n this.formModel.set({ email: '' });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n minLength,\n required,\n} from '@angular/forms/signals';\nimport {\n APP_CONFIG,\n isCompanyFeatureEnabled,\n isEmailFeatureEnabled,\n isSignUpEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n ISelectRequest,\n isEmailVerificationRequired,\n} from '../../interfaces/auth.interface';\nimport {\n AUTH_VALIDATION_CONFIG,\n validateEmail,\n validatePassword,\n} from '../../providers/auth-extension.providers';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\ninterface ILoginFormModel {\n email: string;\n password: string;\n rememberMe: boolean;\n}\n\ninterface ISelectionFormModel {\n companyId: string;\n branchId: string;\n rememberSelection: boolean;\n}\n\ntype LoginStep = 'credentials' | 'company-selection' | 'email-verification';\n\n@Component({\n selector: 'lib-login-page',\n imports: [\n AngularModule,\n PrimeModule,\n FormField,\n AppFloatingConfigurator,\n TranslatePipe,\n ],\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen\"\n >\n <div\n class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\"\n >\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\"\n >\n <!-- Step Indicator (only when company feature enabled) -->\n @if (companyFeatureEnabled()) {\n <div class=\"flex items-center justify-center mb-6 gap-2\">\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'credentials'\"\n [class.text-primary-contrast]=\"\n currentStep() === 'credentials'\n \"\n [class.bg-surface-200]=\"currentStep() !== 'credentials'\"\n [class.text-muted-color]=\"currentStep() !== 'credentials'\"\n >\n 1\n </div>\n <div class=\"w-12 h-0.5 bg-surface-200\"></div>\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'company-selection'\"\n [class.text-primary-contrast]=\"\n currentStep() === 'company-selection'\n \"\n [class.bg-surface-200]=\"currentStep() !== 'company-selection'\"\n [class.text-muted-color]=\"\n currentStep() !== 'company-selection'\n \"\n >\n 2\n </div>\n </div>\n }\n\n <!-- Step 1: Credentials -->\n @if (currentStep() === 'credentials') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.welcome' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">{{\n 'auth.login.sign.in.to.continue' | translate\n }}</span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.login.email' | translate }}\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.login.email.placeholder' | translate\"\n class=\"w-full md:w-[25rem]\"\n [formField]=\"loginForm.email\"\n autocomplete=\"email\"\n />\n @if (emailValidationError() && loginFormModel().email) {\n <small class=\"text-danger block mt-1\">{{\n emailValidationError()\n }}</small>\n }\n <div class=\"mb-4\"></div>\n\n <label\n for=\"password\"\n class=\"block font-medium text-lg mb-2 text-color\"\n >\n {{ 'auth.login.password' | translate }}\n </label>\n <div class=\"mb-4\">\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [placeholder]=\"'auth.login.password.placeholder' | translate\"\n class=\"w-full md:w-[25rem]\"\n [formField]=\"loginForm.password\"\n autocomplete=\"current-password\"\n />\n @if (passwordValidationError() && loginFormModel().password) {\n <small class=\"text-danger block mt-1\">{{\n passwordValidationError()\n }}</small>\n }\n </div>\n\n <div\n class=\"flex flex-col sm:flex-row items-start sm:items-center justify-between mt-2 mb-8 gap-4\"\n >\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"loginForm.rememberMe\" />\n <span>{{ 'auth.login.remember.me' | translate }}</span>\n </label>\n @if (emailFeatureEnabled()) {\n <span\n class=\"font-medium no-underline cursor-pointer text-primary\"\n style=\"margin-inline-start: 0.5rem;\"\n routerLink=\"/auth/forgot-password\"\n >\n {{ 'auth.login.forgot.password' | translate }}\n </span>\n }\n </div>\n\n <p-button\n [label]=\"'auth.login.sign.in' | translate\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isLoginFormValid() || isLoading()\"\n />\n\n @if (signUpEnabled()) {\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{\n 'auth.login.no.account' | translate\n }}</span>\n <a\n routerLink=\"/auth/register\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n {{ 'auth.login.sign.up' | translate }}\n </a>\n </div>\n }\n </form>\n }\n\n <!-- Email Verification Required -->\n @if (currentStep() === 'email-verification') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-warn\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.email.not.verified' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{\n 'auth.login.verify.email.message'\n | translate: { email: unverifiedEmail() }\n }}\n </p>\n <p-button\n [label]=\"'auth.login.resend.verification' | translate\"\n styleClass=\"w-full mb-4\"\n [loading]=\"isLoading()\"\n (onClick)=\"onResendVerification()\"\n />\n <div class=\"mt-4\">\n <span\n class=\"font-semibold text-primary cursor-pointer\"\n (click)=\"goBackToCredentials()\"\n >\n {{ 'auth.login.back.to.sign.in' | translate }}\n </span>\n </div>\n </div>\n }\n\n <!-- Step 2: Company Selection -->\n @if (currentStep() === 'company-selection') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.login.select.company' | translate }}\n </div>\n <div class=\"text-muted-color font-medium\">\n {{\n 'auth.login.select.company.message'\n | translate: { name: userName() }\n }}\n </div>\n </div>\n\n <form (ngSubmit)=\"onSelectCompany()\">\n <label\n for=\"company\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'administration.company.title' | translate }}\n </label>\n <select\n id=\"company\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.companyId\"\n (change)=\"onCompanyChange()\"\n >\n <option value=\"\">\n {{ 'auth.login.select.company.option' | translate }}\n </option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n\n <label\n for=\"branch\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'administration.branch.title' | translate }}\n </label>\n <select\n id=\"branch\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.branchId\"\n >\n <option value=\"\">\n {{ 'auth.login.select.branch.option' | translate }}\n </option>\n @for (branch of branches(); track branch.id) {\n <option [value]=\"branch.id\">{{ branch.name }}</option>\n }\n </select>\n\n <div class=\"flex items-center mt-2 mb-8\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"selectionForm.rememberSelection\"\n />\n <span>{{\n 'auth.login.remember.selection' | translate\n }}</span>\n </label>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <p-button\n [label]=\"'shared.back' | translate\"\n styleClass=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (onClick)=\"goBackToCredentials()\"\n />\n <p-button\n [label]=\"'shared.continue' | translate\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\"\n />\n </div>\n </form>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class LoginPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n\n private readonly validationConfig = inject(AUTH_VALIDATION_CONFIG, {\n optional: true,\n });\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly returnUrl = input<string>('');\n readonly currentStep = signal<LoginStep>('credentials');\n readonly isLoading = signal(false);\n readonly unverifiedEmail = signal('');\n\n readonly loginFormModel = signal<ILoginFormModel>({\n email: '',\n password: '',\n rememberMe: true,\n });\n\n private readonly emailErrorMessage = computed(\n () =>\n this.validationConfig?.email?.message ??\n this.translate('shared.invalid.email'),\n );\n private readonly passwordMinLength = computed(\n () => this.validationConfig?.password?.minLength ?? 8,\n );\n private readonly passwordErrorMessage = computed(\n () =>\n this.validationConfig?.password?.message ??\n this.translate('auth.validation.password.min.length', { min: this.passwordMinLength() }),\n );\n\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, { message: this.translate('auth.validation.password.required') });\n minLength(f.password, this.passwordMinLength(), {\n message: this.passwordErrorMessage(),\n });\n });\n\n readonly emailValidationError = computed(() => {\n const email = this.loginFormModel().email;\n if (!email) return null;\n return validateEmail(email, this.validationConfig?.email ?? undefined);\n });\n\n readonly passwordValidationError = computed(() => {\n const password = this.loginFormModel().password;\n if (!password) return null;\n if (!this.validationConfig?.password) return null;\n return validatePassword(password, this.validationConfig.password);\n });\n\n readonly isLoginFormValid = computed(() => {\n const formValid = this.loginForm().valid();\n const emailError = this.emailValidationError();\n const passwordError = this.passwordValidationError();\n return formValid && !emailError && !passwordError;\n });\n\n readonly selectionFormModel = signal<ISelectionFormModel>({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n\n readonly selectionForm = form(this.selectionFormModel, (f) => {\n required(f.companyId, { message: this.translate('auth.validation.company.required') });\n required(f.branchId, { message: this.translate('auth.validation.branch.required') });\n });\n\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly emailFeatureEnabled = computed(() =>\n isEmailFeatureEnabled(this.appConfig),\n );\n readonly signUpEnabled = computed(() => isSignUpEnabled(this.appConfig));\n\n private sessionId: string | null = null;\n readonly companies = signal<ICompanyWithBranches[]>([]);\n readonly userName = signal<string>('');\n\n readonly branches = computed<IBranchSelectionInfo[]>(() => {\n const companyId = this.selectionFormModel().companyId;\n if (!companyId) return [];\n const company = this.companies().find((c) => c.id === companyId);\n return company?.branches ?? [];\n });\n\n constructor() {\n effect(() => {\n if (this.authState.requiresCompanySelection()) {\n this.restorePendingSelectionState();\n }\n });\n }\n\n private restorePendingSelectionState(): void {\n const availableCompanies = this.authState.availableCompanies();\n const sessionId = this.authState.selectionSessionId();\n const name = this.authState.userName();\n\n if (availableCompanies.length > 0 && sessionId) {\n this.companies.set(availableCompanies);\n this.sessionId = sessionId;\n this.userName.set(name);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n }\n }\n\n onSubmit(): void {\n if (!this.isLoginFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.loginFormModel();\n const loginData: ILoginRequest = {\n email: formData.email,\n password: formData.password,\n };\n\n this.authApi\n .login(loginData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (isEmailVerificationRequired(response)) {\n this.unverifiedEmail.set(response.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n this.sessionId = response.sessionId;\n this.companies.set(response.companies);\n this.userName.set(response.user.name ?? response.user.email);\n this.authState.setSelectionState(response);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else {\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.login.success'),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n const message =\n error?.error?.message || this.translate('auth.login.failed');\n this.messageService.add({\n severity: 'error',\n summary: this.translate('auth.login.title'),\n detail: message,\n });\n },\n });\n }\n\n onCompanyChange(): void {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: '',\n }));\n\n const branches = this.branches();\n if (branches.length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: branches[0].id,\n }));\n }\n }\n\n onSelectCompany(): void {\n if (!this.isSelectionFormValid()) {\n this.messageService.add({\n severity: 'warn',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('auth.login.requires.selection'),\n });\n return;\n }\n\n if (!this.sessionId) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.error'),\n detail: this.translate('auth.session.expired'),\n });\n this.goBackToCredentials();\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.selectionFormModel();\n const selectData: ISelectRequest = {\n sessionId: this.sessionId,\n companyId: formData.companyId!,\n branchId: formData.branchId!,\n };\n\n this.authApi\n .select(selectData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.login.success'),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n goBackToCredentials(): void {\n this.sessionId = null;\n this.companies.set([]);\n this.unverifiedEmail.set('');\n this.selectionFormModel.set({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n this.authState.resetState();\n this.currentStep.set('credentials');\n }\n\n onResendVerification(): void {\n const email = this.unverifiedEmail();\n if (!email) return;\n\n this.isLoading.set(true);\n\n this.authApi\n .resendVerification(email)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.message || this.translate('auth.verify.email.sent'),\n });\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n private autoSelectIfSingle(): void {\n if (this.companies().length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: this.companies()[0].id,\n }));\n this.onCompanyChange();\n }\n\n const storedCompanyId = this.authState.getStoredCompanyId();\n const storedBranchId = this.authState.getStoredBranchId();\n\n if (storedCompanyId) {\n const company = this.companies().find((c) => c.id === storedCompanyId);\n if (company) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: storedCompanyId,\n }));\n if (storedBranchId) {\n const branch = company.branches.find((b) => b.id === storedBranchId);\n if (branch) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: storedBranchId,\n }));\n }\n }\n }\n }\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport {\n APP_CONFIG,\n getPermissionMode,\n isCompanyFeatureEnabled,\n isFeatureEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport {\n AngularModule,\n FILE_PROVIDER,\n FileUploaderComponent,\n FileUrlService,\n HasPermissionDirective,\n IProfileActionInfo,\n IProfileRoleInfo,\n PrimeModule,\n PROFILE_PERMISSION_PROVIDER,\n TranslatePipe,\n} from '@flusys/ng-shared';\nimport { catchError, finalize, forkJoin, of } from 'rxjs';\nimport { MessageService } from 'primeng/api';\nimport { IUpdateUserRequest } from '../../interfaces/user.interface';\nimport {\n AUTH_PROFILE_EXTENSION,\n AUTH_USER_FORM_EXTENSION,\n IProfileExtraField,\n IProfileExtraSection,\n IProfileFieldTemplateContext,\n IUserFormExtraField,\n PROFILE_FIELD_CONTEXT,\n} from '../../providers/auth-extension.providers';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { UserApiService } from '../../services/user-api.service';\n\ninterface IProfileFormModel {\n name: string;\n phone: string;\n}\n\ninterface IPasswordFormModel {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n@Component({\n selector: 'lib-profile-page',\n imports: [AngularModule, PrimeModule, FormField, FileUploaderComponent, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"mb-4 md:mb-6\">\n <h1 class=\"text-2xl font-bold text-color mb-2\">{{ 'auth.profile.title' | translate }}</h1>\n <p class=\"text-muted-color\">{{ 'auth.profile.subtitle' | translate }}</p>\n </div>\n\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex flex-col md:flex-row gap-4 md:gap-6\">\n <div class=\"flex flex-col items-center gap-4 md:w-72 lg:w-80 md:border-r md:border-surface-200 md:pr-6\">\n @if (profilePictureUrl()) {\n <p-avatar\n [image]=\"profilePictureUrl()!\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28\" />\n } @else {\n <p-avatar\n [label]=\"userInitials()\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28 text-3xl bg-primary text-primary-contrast\" />\n }\n <div class=\"text-center\">\n <div class=\"font-semibold text-color\">{{ userName() }}</div>\n <div class=\"text-muted-color text-sm\">{{ userEmail() }}</div>\n </div>\n @if (showUploadSection()) {\n <lib-file-uploader\n [acceptTypes]=\"['image/*']\"\n [multiple]=\"false\"\n [maxSizeMb]=\"5\"\n [showPreview]=\"false\"\n [uploadOptions]=\"profileUploadOptions\"\n (fileUploaded)=\"onProfilePictureUploaded($event)\"\n class=\"w-full\" />\n } @else {\n <div class=\"w-full p-3 bg-surface-100 rounded-lg text-center\">\n <i class=\"pi pi-info-circle text-muted-color mr-2\"></i>\n <span class=\"text-sm text-muted-color\">{{ 'auth.profile.storage.not.enabled' | translate }}</span>\n </div>\n }\n </div>\n\n <div class=\"flex-1\">\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-4\">\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-color\">{{ 'administration.user.email' | translate }}</label>\n <input\n pInputText\n [value]=\"userEmail()\"\n disabled\n class=\"bg-surface-50\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium text-color\">{{ 'administration.user.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'auth.profile.name.placeholder' | translate\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium text-color\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\" />\n </div>\n\n @if (editableFields().length > 0) {\n <div class=\"border-t border-surface pt-4 mt-2\">\n <div class=\"text-sm font-medium text-muted-color mb-4\">\n <i class=\"pi pi-pencil mr-2\"></i>{{ 'auth.profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <p-skeleton height=\"2rem\" styleClass=\"mb-2\" />\n <p-skeleton height=\"2rem\" />\n } @else {\n <div class=\"flex flex-col gap-4\">\n @for (field of editableFields(); track field.key) {\n <div class=\"flex flex-col gap-2\">\n <label [for]=\"field.key\" class=\"font-medium text-color\">\n {{ safeTranslate(field.labelKey, field.label) }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container *ngComponentOutlet=\"field.component; injector: getFieldInjector(field)\" />\n } @else if (field.template) {\n <ng-container [ngTemplateOutlet]=\"field.template\" [ngTemplateOutletContext]=\"getFieldTemplateContext(field)\" />\n } @else {\n <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ field: field }\" />\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{ extraFieldsValidationError() }}</small>\n }\n }\n </div>\n }\n\n @if (viewOnlyFields().length > 0) {\n <div class=\"border-t border-surface pt-4 mt-2\">\n <div class=\"flex items-center justify-between mb-4\">\n <div class=\"text-sm font-medium text-muted-color\">\n <i class=\"pi pi-eye mr-2\"></i>{{ 'auth.profile.employment.info' | translate }}\n </div>\n <p-tag [value]=\"'auth.profile.managed.by.admin' | translate\" severity=\"secondary\" />\n </div>\n @if (isLoadingExtraFields()) {\n <p-skeleton height=\"2rem\" styleClass=\"mb-2\" />\n <p-skeleton height=\"2rem\" />\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (field of viewOnlyFields(); track field.key) {\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm text-muted-color\">{{ safeTranslate(field.labelKey, field.label) }}</label>\n <span class=\"text-color font-medium\">\n @if (field.type === 'select') {\n {{ getSelectLabel(field, getAdminFieldValue(field.key)) }}\n } @else {\n {{ getAdminFieldValue(field.key) || '-' }}\n }\n </span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <ng-template #fieldTemplate let-field=\"field\">\n @switch (field.type) {\n @case ('text') {\n <input\n pInputText\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n @case ('number') {\n <input\n pInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).valueAsNumber)\"\n class=\"w-full\" />\n }\n @case ('textarea') {\n <textarea\n pInputTextarea\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\"\n rows=\"3\"></textarea>\n }\n @case ('select') {\n <select\n [id]=\"field.key\"\n class=\"p-select-native w-full\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{standalone: true}\"\n [disabled]=\"field.editable === false\"\n (ngModelChange)=\"updateExtraField(field.key, $event)\">\n <option value=\"\">{{ safeTranslate(field.placeholderKey, field.placeholder ?? ('shared.select' | translate)) }}</option>\n @for (opt of field.options; track opt.value) {\n <option [value]=\"opt.value\">{{ safeTranslate(opt.labelKey, opt.label) }}</option>\n }\n </select>\n }\n @case ('checkbox') {\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [id]=\"field.key\"\n [checked]=\"getExtraFieldValue(field.key) ?? false\"\n [disabled]=\"field.editable === false\"\n (change)=\"updateExtraField(field.key, $any($event.target).checked)\" />\n <span>{{ safeTranslate(field.placeholderKey, field.placeholder ?? safeTranslate(field.labelKey, field.label)) }}</span>\n </label>\n }\n @case ('date') {\n <input\n pInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n }\n </ng-template>\n\n <div class=\"flex justify-end pt-4\">\n <p-button\n [label]=\"'shared.save.changes' | translate\"\n icon=\"pi pi-check\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || !isFormDirty() || isLoading()\" />\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-lock text-primary\"></i>\n <span class=\"font-semibold text-color\">{{ 'auth.profile.security' | translate }}</span>\n </div>\n <form (ngSubmit)=\"onChangePassword()\" class=\"flex flex-col gap-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div class=\"flex flex-col gap-2\">\n <label for=\"currentPassword\" class=\"font-medium text-color\">{{ 'auth.profile.current.password' | translate }} *</label>\n <p-password\n id=\"currentPassword\"\n name=\"currentPassword\"\n [ngModel]=\"passwordModel().currentPassword\"\n (ngModelChange)=\"updatePasswordField('currentPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n [placeholder]=\"'shared.placeholder.current.password' | translate\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"newPassword\" class=\"font-medium text-color\">{{ 'auth.profile.new.password' | translate }} *</label>\n <p-password\n id=\"newPassword\"\n name=\"newPassword\"\n [ngModel]=\"passwordModel().newPassword\"\n (ngModelChange)=\"updatePasswordField('newPassword', $event)\"\n [feedback]=\"true\"\n [toggleMask]=\"true\"\n [placeholder]=\"'shared.min.characters' | translate: { count: 6 }\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"confirmPassword\" class=\"font-medium text-color\">{{ 'auth.profile.confirm.password' | translate }} *</label>\n <p-password\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n [ngModel]=\"passwordModel().confirmPassword\"\n (ngModelChange)=\"updatePasswordField('confirmPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n [placeholder]=\"'shared.placeholder.confirm.password' | translate\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n @if (!passwordsMatch()) {\n <small class=\"text-danger\">{{ 'auth.register.passwords.do.not.match' | translate }}</small>\n }\n </div>\n </div>\n\n <div class=\"flex justify-end\">\n <p-button\n [label]=\"'auth.profile.change.password' | translate\"\n icon=\"pi pi-key\"\n type=\"submit\"\n [loading]=\"isPasswordLoading()\"\n [disabled]=\"!isPasswordFormValid() || isPasswordLoading()\" />\n </div>\n </form>\n </div>\n\n @for (section of extraSections(); track section.key) {\n @if (section.editPermission) {\n <div *hasPermission=\"section.editPermission\" class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n @if (section.icon) {\n <i [class]=\"section.icon + ' text-primary'\"></i>\n }\n <span class=\"font-semibold text-color\">{{ safeTranslate(section.titleKey, section.title) }}</span>\n </div>\n <div class=\"section-content\">\n @if (section.component) {\n <ng-container *ngComponentOutlet=\"section.component\" />\n }\n </div>\n </div>\n } @else {\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n @if (section.icon) {\n <i [class]=\"section.icon + ' text-primary'\"></i>\n }\n <span class=\"font-semibold text-color\">{{ safeTranslate(section.titleKey, section.title) }}</span>\n </div>\n <div class=\"section-content\">\n @if (section.component) {\n <ng-container *ngComponentOutlet=\"section.component\" />\n }\n </div>\n </div>\n }\n }\n\n @if (showBottomRow()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-4 flex-1\">\n @if (showCompanySection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-building text-primary\"></i>\n <span class=\"font-semibold text-color\">{{ 'auth.profile.company.branch' | translate }}</span>\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-briefcase text-primary\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">{{ 'administration.company.title' | translate }}</div>\n <div class=\"font-medium text-color\">{{ companyName() || ('shared.not.assigned' | translate) }}</div>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-success/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-map-marker text-success\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">{{ 'administration.branch.title' | translate }}</div>\n <div class=\"font-medium text-color\">{{ branchName() || ('shared.not.assigned' | translate) }}</div>\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (showPermissionsSection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center justify-between mb-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-shield text-primary\"></i>\n <span class=\"font-semibold text-color\">{{ 'iam.permission.my.permissions' | translate }}</span>\n </div>\n <p-tag [value]=\"'shared.read.only' | translate\" severity=\"secondary\" />\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n @if (showRoles()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-users\"></i> {{ 'iam.role.title' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userRoles().length === 0) {\n <span class=\"text-muted-color text-sm\">{{ 'iam.role.no.roles.assigned' | translate }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (role of userRoles(); track role.id) {\n <p-tag [value]=\"role.name\" severity=\"info\" />\n }\n </div>\n }\n </div>\n }\n\n @if (showActions()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-bolt\"></i> {{ 'iam.action.direct.actions' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userActions().length === 0) {\n <span class=\"text-muted-color text-sm\">{{ 'iam.action.no.actions.assigned' | translate }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (action of userActions(); track action.id) {\n <p-tag [value]=\"action.name\" severity=\"success\" />\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n})\nexport class ProfilePageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authState = inject(AuthStateService);\n private readonly userService = inject(UserApiService);\n private readonly authApiService = inject(AuthApiService);\n private readonly fileUrlService = inject(FileUrlService);\n private readonly fileProvider = inject(FILE_PROVIDER, { optional: true });\n private readonly permissionProvider = inject(PROFILE_PERMISSION_PROVIDER, { optional: true });\n private readonly profileExtension = inject(AUTH_PROFILE_EXTENSION, { optional: true });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, { optional: true });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n /** Translate with fallback: if key returns unchanged, use fallback instead */\n safeTranslate(key: string | undefined, fallback: string): string {\n if (!key) return fallback;\n const translated = this.translate(key);\n return translated === key ? fallback : translated;\n }\n\n readonly isLoading = signal(false);\n readonly isLoadingPermissions = signal(false);\n readonly isLoadingExtraFields = signal(false);\n private readonly _profilePictureUrl = signal<string | null>(null);\n readonly profilePictureUrl = this._profilePictureUrl.asReadonly();\n\n private readonly _userRoles = signal<IProfileRoleInfo[]>([]);\n readonly userRoles = this._userRoles.asReadonly();\n private readonly _userActions = signal<IProfileActionInfo[]>([]);\n readonly userActions = this._userActions.asReadonly();\n\n readonly extraSections = computed<IProfileExtraSection[]>(() => {\n if (!this.profileExtension?.getExtraSections) return [];\n const sections = this.profileExtension.getExtraSections();\n return sections.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly editableFields = computed<IProfileExtraField[]>(() => {\n if (!this.profileExtension?.getExtraFields) return [];\n const fields = this.profileExtension.getExtraFields();\n return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly viewOnlyFields = computed<IUserFormExtraField[]>(() => {\n if (!this.userFormExtension?.getExtraFields) return [];\n const fields = this.userFormExtension.getExtraFields();\n return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly hasExtraContent = computed(() =>\n this.extraSections().length > 0 || this.editableFields().length > 0 || this.viewOnlyFields().length > 0\n );\n\n readonly extraFieldsModel = signal<Record<string, unknown>>({});\n readonly originalExtraFieldsModel = signal<Record<string, unknown>>({});\n readonly adminFieldsModel = signal<Record<string, unknown>>({});\n\n readonly isExtraFieldsDirty = computed(() => {\n const current = this.extraFieldsModel();\n const original = this.originalExtraFieldsModel();\n return JSON.stringify(current) !== JSON.stringify(original);\n });\n\n readonly extraFieldsValidationError = computed(() => {\n if (!this.profileExtension?.validateExtraFields) return null;\n return this.profileExtension.validateExtraFields(this.extraFieldsModel());\n });\n\n readonly userEmail = computed(() => this.authState.user()?.email ?? '');\n readonly userName = computed(() => this.authState.userName());\n readonly userInitials = computed(() => {\n const name = this.authState.user()?.name ?? '';\n return name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\n });\n readonly companyName = computed(() => this.authState.companyName());\n readonly branchName = computed(() => this.authState.branchName());\n\n readonly showUploadSection = computed(() =>\n isFeatureEnabled(this.appConfig, 'storage') && this.fileProvider !== null\n );\n readonly showCompanySection = computed(() => isCompanyFeatureEnabled(this.appConfig));\n readonly showPermissionsSection = computed(() =>\n isFeatureEnabled(this.appConfig, 'iam') && this.permissionProvider !== null\n );\n readonly permissionMode = computed(() => getPermissionMode(this.appConfig));\n readonly showRoles = computed(() => {\n const mode = this.permissionMode();\n return mode === 'rbac' || mode === 'full';\n });\n readonly showActions = computed(() => {\n const mode = this.permissionMode();\n return mode === 'direct' || mode === 'full';\n });\n readonly showBottomRow = computed(() => this.showCompanySection() || this.showPermissionsSection());\n\n private readonly originalFormModel = signal<IProfileFormModel>({ name: '', phone: '' });\n readonly formModel = signal<IProfileFormModel>({ name: '', phone: '' });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('auth.validation.name.required') });\n });\n\n readonly isFormValid = computed(() => this.formModel().name.trim().length > 0);\n\n readonly isFormDirty = computed(() => {\n const current = this.formModel();\n const original = this.originalFormModel();\n const basicDirty = current.name !== original.name || current.phone !== original.phone;\n return basicDirty || this.isExtraFieldsDirty();\n });\n\n updateExtraField(key: string, value: unknown): void {\n this.extraFieldsModel.update((model) => ({ ...model, [key]: value }));\n }\n\n getExtraFieldValue(key: string): unknown {\n return this.extraFieldsModel()[key];\n }\n\n getAdminFieldValue(key: string): unknown {\n return this.adminFieldsModel()[key];\n }\n\n getSelectLabel(field: IProfileExtraField | IUserFormExtraField, value: unknown): string {\n if (!value || !field.options) return '-';\n const option = field.options.find(opt => opt.value === value);\n return option?.label ?? String(value);\n }\n\n getFieldTemplateContext(field: IProfileExtraField): IProfileFieldTemplateContext {\n return {\n field,\n value: this.extraFieldsModel()[field.key],\n updateValue: (value: unknown) => this.updateExtraField(field.key, value),\n };\n }\n\n private readonly parentInjector = inject(Injector);\n\n getFieldInjector(field: IProfileExtraField): Injector {\n return Injector.create({\n providers: [{ provide: PROFILE_FIELD_CONTEXT, useValue: this.getFieldTemplateContext(field) }],\n parent: field.injector ?? this.parentInjector,\n });\n }\n\n readonly passwordModel = signal<IPasswordFormModel>({\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n });\n\n readonly isPasswordLoading = signal(false);\n\n readonly isPasswordFormValid = computed(() => {\n const model = this.passwordModel();\n return model.currentPassword.length > 0 && model.newPassword.length >= 6 && model.newPassword === model.confirmPassword;\n });\n\n readonly passwordsMatch = computed(() => {\n const model = this.passwordModel();\n return model.confirmPassword.length === 0 || model.newPassword === model.confirmPassword;\n });\n\n readonly profileUploadOptions = {\n folderPath: 'profile-pictures',\n compress: true,\n maxWidth: 400,\n maxHeight: 400,\n isPrivate: true,\n };\n\n constructor() {\n this.loadUserData();\n\n effect(() => {\n if (this.showPermissionsSection()) this.loadPermissions();\n });\n\n effect(() => {\n const user = this.authState.user();\n if (user && this.hasExtraContent()) this.loadExtraFields();\n });\n }\n\n private loadUserData(): void {\n const user = this.authState.user();\n if (user) {\n const initialValues: IProfileFormModel = { name: user.name ?? '', phone: user.phone ?? '' };\n this.originalFormModel.set(initialValues);\n this.formModel.set(initialValues);\n\n if (user.profilePictureId && isFeatureEnabled(this.appConfig, 'storage')) {\n this.fileUrlService\n .fetchSingleFileUrl(user.profilePictureId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((file) => this._profilePictureUrl.set(file?.url ?? null));\n }\n }\n }\n\n private loadPermissions(): void {\n const user = this.authState.user();\n const branch = this.authState.branch();\n\n if (!user || !this.permissionProvider) return;\n\n const loadRoles = this.showRoles();\n const loadActions = this.showActions();\n\n if (!loadRoles && !loadActions) return;\n\n this.isLoadingPermissions.set(true);\n\n const roles$ = loadRoles\n ? this.permissionProvider.getUserRoles(user.id, branch?.id).pipe(catchError(() => of({ data: [] as IProfileRoleInfo[] })))\n : of({ data: [] as IProfileRoleInfo[] });\n\n const actions$ = loadActions\n ? this.permissionProvider.getUserActions(user.id, branch?.id).pipe(catchError(() => of({ data: [] as IProfileActionInfo[] })))\n : of({ data: [] as IProfileActionInfo[] });\n\n forkJoin([roles$, actions$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingPermissions.set(false))\n )\n .subscribe(([rolesResponse, actionsResponse]) => {\n this._userRoles.set(rolesResponse.data ?? []);\n this._userActions.set(actionsResponse.data ?? []);\n });\n }\n\n private loadExtraFields(): void {\n const user = this.authState.user();\n if (!user) return;\n\n const hasProfileFields = !!this.profileExtension?.getExtraFieldValues;\n const hasAdminFields = !!this.userFormExtension?.getExtraFieldValues;\n\n if (!hasProfileFields && !hasAdminFields) return;\n\n this.isLoadingExtraFields.set(true);\n\n const profileFields$ = hasProfileFields\n ? this.profileExtension!.getExtraFieldValues!(user.id).pipe(\n catchError(() => {\n const defaults: Record<string, unknown> = {};\n for (const field of this.editableFields()) {\n if (field.key) defaults[field.key] = undefined;\n }\n return of(defaults);\n })\n )\n : of({} as Record<string, unknown>);\n\n const adminFields$ = hasAdminFields\n ? this.userFormExtension!.getExtraFieldValues!(user.id).pipe(\n catchError(() => {\n const defaults: Record<string, unknown> = {};\n for (const field of this.viewOnlyFields()) {\n if (field.key) defaults[field.key] = undefined;\n }\n return of(defaults);\n })\n )\n : of({} as Record<string, unknown>);\n\n forkJoin([profileFields$, adminFields$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingExtraFields.set(false))\n )\n .subscribe(([profileValues, adminValues]) => {\n this.extraFieldsModel.set(profileValues);\n this.originalExtraFieldsModel.set(profileValues);\n this.adminFieldsModel.set(adminValues);\n });\n }\n\n onProfilePictureUploaded(file: { id?: string; name: string; key: string; size: number; contentType: string }): void {\n const user = this.authState.user();\n if (!user || !file.id) return;\n\n const fileManagerId = file.id;\n\n this.userService\n .updateProfile({ id: user.id, profilePictureId: fileManagerId })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.authState.setUser({ ...user, profilePictureId: fileManagerId });\n this.fileUrlService\n .fetchSingleFileUrl(fileManagerId, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((fileInfo) => this._profilePictureUrl.set(fileInfo?.url ?? null));\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: this.translate('auth.profile.picture.updated') });\n }\n },\n error: () => {},\n });\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\n\n const extraFieldsError = this.extraFieldsValidationError();\n if (extraFieldsError) {\n this.messageService.add({ severity: 'error', summary: this.translate('shared.validation.error'), detail: extraFieldsError });\n return;\n }\n\n const user = this.authState.user();\n if (!user) return;\n\n this.isLoading.set(true);\n const model = this.formModel();\n\n const updateData: IUpdateUserRequest = {\n id: user.id,\n name: model.name,\n phone: model.phone || undefined,\n };\n\n const profileUpdate$ = this.userService.updateProfile(updateData);\n const extraFieldsUpdate$ = this.isExtraFieldsDirty() && this.profileExtension?.saveExtraFieldValues\n ? this.profileExtension.saveExtraFieldValues(user.id, this.extraFieldsModel())\n : of(undefined);\n\n forkJoin([profileUpdate$, extraFieldsUpdate$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: ([response]) => {\n if (response.success && response.data) {\n this.authState.setUser({ ...user, name: response.data.name, phone: response.data.phone ?? null });\n this.originalFormModel.set({ name: response.data.name, phone: response.data.phone ?? '' });\n this.originalExtraFieldsModel.set({ ...this.extraFieldsModel() });\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: this.translate('auth.profile.update.success') });\n }\n },\n error: () => {},\n });\n }\n\n updatePasswordField(field: keyof IPasswordFormModel, value: string): void {\n this.passwordModel.update((model) => ({ ...model, [field]: value }));\n }\n\n onChangePassword(): void {\n if (!this.isPasswordFormValid()) return;\n\n this.isPasswordLoading.set(true);\n const model = this.passwordModel();\n\n this.authApiService\n .changePassword({ currentPassword: model.currentPassword, newPassword: model.newPassword })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isPasswordLoading.set(false))\n )\n .subscribe({\n next: () => {\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: this.translate('auth.profile.password.changed') });\n this.passwordModel.set({ currentPassword: '', newPassword: '', confirmPassword: '' });\n },\n error: () => {},\n });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n minLength,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n APP_CONFIG,\n getDefaultBranchSlug,\n getDefaultCompanySlug,\n isCompanyFeatureEnabled,\n TRANSLATE_ADAPTER,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IRegistrationRequest } from '../../interfaces/auth.interface';\nimport {\n AUTH_REGISTRATION_EXTENSION,\n AUTH_VALIDATION_CONFIG,\n IRegistrationExtraField,\n IRegistrationFieldTemplateContext,\n REGISTRATION_FIELD_CONTEXT,\n validateEmail,\n validatePassword,\n} from '../../providers/auth-extension.providers';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n confirmPassword: string;\n phone: string;\n}\n\ninterface ICompanyFormModel {\n createNewCompany: boolean;\n companySlug: string;\n branchSlug: string;\n newCompanyName: string;\n newCompanyPhone: string;\n newCompanyAddress: string;\n}\n\n@Component({\n selector: 'lib-register-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen py-8\"\n >\n <div class=\"flex flex-col items-center justify-center\">\n <div\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"py-8 px-4 sm:py-10 sm:px-8 md:py-12 md:px-12 w-full sm:w-[650px] max-w-[95vw] sm:max-w-[90vw]\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\"\n >\n <div class=\"text-center mb-6\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.register.create.account' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">{{ 'auth.register.subtitle' | translate }}</span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"name\" class=\"block font-medium mb-2\">{{ 'auth.register.full.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"userForm.name\"\n [placeholder]=\"'auth.register.name.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"name\"\n />\n </div>\n\n <div>\n <label for=\"phone\" class=\"block font-medium mb-2\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"userForm.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"tel\"\n />\n </div>\n </div>\n\n <div class=\"mb-4\">\n <label for=\"email\" class=\"block font-medium mb-2\">{{ 'administration.user.email' | translate }} *</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"userForm.email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"email\"\n />\n @if (emailValidationError() && userFormModel().email) {\n <small class=\"text-danger block mt-1\">{{\n emailValidationError()\n }}</small>\n }\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"password\" class=\"block font-medium mb-2\">{{ 'administration.user.password' | translate }} *</label>\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"userForm.password\"\n [placeholder]=\"'shared.min.characters' | translate: { count: passwordMinLength() }\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (passwordValidationError() && userFormModel().password) {\n <small class=\"text-danger block mt-1\">{{\n passwordValidationError()\n }}</small>\n }\n </div>\n\n <div>\n <label for=\"confirmPassword\" class=\"block font-medium mb-2\">{{ 'auth.register.confirm.password' | translate }} *</label>\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n [formField]=\"userForm.confirmPassword\"\n [placeholder]=\"'auth.register.confirm.password.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch() && userFormModel().confirmPassword) {\n <small class=\"text-danger block mt-2\">{{ 'auth.register.passwords.do.not.match' | translate }}</small>\n }\n </div>\n </div>\n\n @if (extraFields().length > 0) {\n <div class=\"border-t border-surface pt-4 mt-4 mb-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (field of extraFields(); track field.key) {\n <div [class]=\"field.containerClass ?? ''\">\n <label [for]=\"field.key\" class=\"block font-medium mb-2\">\n {{ safeTranslate(field.labelKey, field.label) }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"field.component; injector: getFieldInjector(field)\"\n ></ng-container>\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"getFieldTemplateContext(field)\"\n ></ng-container>\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n pInputText\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n class=\"w-full\"\n />\n }\n @case ('number') {\n <input\n pInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).valueAsNumber\n )\n \"\n class=\"w-full\"\n />\n }\n @case ('textarea') {\n <textarea\n pInputTextarea\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n class=\"w-full\"\n rows=\"3\"\n ></textarea>\n }\n @case ('select') {\n <select\n [id]=\"field.key\"\n class=\"p-select-native w-full\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (change)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n >\n <option value=\"\">\n {{ safeTranslate(field.placeholderKey, field.placeholder ?? ('shared.select' | translate)) }}\n </option>\n @for (opt of field.options; track opt.value) {\n <option [value]=\"opt.value\">\n {{ safeTranslate(opt.labelKey, opt.label) }}\n </option>\n }\n </select>\n }\n @case ('checkbox') {\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [id]=\"field.key\"\n [checked]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n false\n \"\n (change)=\"\n updateExtraField(\n field.key,\n $any($event.target).checked\n )\n \"\n />\n <span>{{\n safeTranslate(field.placeholderKey, field.placeholder ?? safeTranslate(field.labelKey, field.label))\n }}</span>\n </label>\n }\n @case ('date') {\n <input\n pInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n (input)=\"\n updateExtraField(\n field.key,\n $any($event.target).value\n )\n \"\n class=\"w-full\"\n />\n }\n }\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{\n extraFieldsValidationError()\n }}</small>\n }\n </div>\n }\n\n @if (companyFeatureEnabled()) {\n <div class=\"border-t border-surface pt-6 mt-6\">\n <div class=\"text-center mb-6\">\n <div class=\"text-2xl font-medium mb-2 text-color\">\n {{ 'administration.company.details' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n @if (hasDefaultCompany()) {\n {{ 'auth.register.join.default.company' | translate }}\n } @else {\n {{ 'auth.register.join.or.create.company' | translate }}\n }\n </span>\n </div>\n\n @if (!hasDefaultCompany()) {\n <div class=\"mb-4\">\n <label\n class=\"p-checkbox-native\"\n (click)=\"onCreateCompanyToggle()\"\n >\n <input\n type=\"checkbox\"\n [formField]=\"companyForm.createNewCompany\"\n />\n <span>{{ 'auth.register.create.new.company' | translate }}</span>\n </label>\n </div>\n }\n\n @if (!companyFormModel().createNewCompany) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"companySlug\" class=\"block font-medium mb-2\">{{ 'administration.company.code' | translate }}</label>\n @if (hasDefaultCompany()) {\n <input\n pInputText\n id=\"companySlug\"\n [value]=\"defaultCompanySlug()\"\n class=\"w-full bg-surface-100\"\n readonly\n />\n <small class=\"text-muted-color\">{{ 'auth.register.preconfigured.company' | translate }}</small>\n } @else {\n <input\n pInputText\n id=\"companySlug\"\n [formField]=\"companyForm.companySlug\"\n [placeholder]=\"'administration.company.code.placeholder' | translate\"\n class=\"w-full\"\n />\n <small class=\"text-muted-color\">{{ 'auth.register.enter.company.code' | translate }}</small>\n }\n </div>\n\n <div>\n <label for=\"branchSlug\" class=\"block font-medium mb-2\">{{ 'administration.branch.code' | translate }}</label>\n @if (hasDefaultBranch()) {\n <input\n pInputText\n id=\"branchSlug\"\n [value]=\"defaultBranchSlug()\"\n class=\"w-full bg-surface-100\"\n readonly\n />\n <small class=\"text-muted-color\">{{ 'auth.register.preconfigured.branch' | translate }}</small>\n } @else {\n <input\n pInputText\n id=\"branchSlug\"\n [formField]=\"companyForm.branchSlug\"\n [placeholder]=\"'administration.branch.code.placeholder' | translate\"\n class=\"w-full\"\n />\n }\n </div>\n </div>\n } @else {\n <div class=\"mb-4\">\n <label for=\"newCompanyName\" class=\"block font-medium mb-2\">{{ 'administration.company.name' | translate }} *</label>\n <input\n pInputText\n id=\"newCompanyName\"\n [formField]=\"companyForm.newCompanyName\"\n [placeholder]=\"'administration.company.name.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"newCompanyPhone\" class=\"block font-medium mb-2\">{{ 'administration.company.phone' | translate }}</label>\n <input\n pInputText\n id=\"newCompanyPhone\"\n [formField]=\"companyForm.newCompanyPhone\"\n [placeholder]=\"'administration.company.phone.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <div>\n <label for=\"newCompanyAddress\" class=\"block font-medium mb-2\">{{ 'administration.company.address' | translate }}</label>\n <input\n pInputText\n id=\"newCompanyAddress\"\n [formField]=\"companyForm.newCompanyAddress\"\n [placeholder]=\"'administration.company.address.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <p-button\n [label]=\"'auth.register.create.account' | translate\"\n styleClass=\"w-full mt-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{ 'auth.register.already.have.account' | translate }}</span>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n {{ 'auth.login.sign.in' | translate }}\n </a>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class RegisterPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n private readonly validationConfig = inject(AUTH_VALIDATION_CONFIG, {\n optional: true,\n });\n private readonly registrationExtension = inject(AUTH_REGISTRATION_EXTENSION, {\n optional: true,\n });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n /** Translate with fallback: if key returns unchanged, use fallback instead */\n safeTranslate(key: string | undefined, fallback: string): string {\n if (!key) return fallback;\n const translated = this.translate(key);\n return translated === key ? fallback : translated;\n }\n\n private readonly queryParamMap = toSignal(this.route.queryParamMap);\n private companySlugInitialized = false;\n\n readonly returnUrl = input<string>('');\n readonly isLoading = signal(false);\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly defaultCompanySlug = computed(() =>\n getDefaultCompanySlug(this.appConfig),\n );\n readonly defaultBranchSlug = computed(() =>\n getDefaultBranchSlug(this.appConfig),\n );\n readonly hasDefaultCompany = computed(() => !!this.defaultCompanySlug());\n readonly hasDefaultBranch = computed(() => !!this.defaultBranchSlug());\n\n readonly extraFields = computed<IRegistrationExtraField[]>(() => {\n if (!this.registrationExtension) return [];\n const fields = this.registrationExtension.getExtraFields();\n return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly extraFieldsModel = signal<Record<string, unknown>>({});\n\n private readonly emailErrorMessage = computed(\n () =>\n this.validationConfig?.email?.message ??\n this.translate('shared.invalid.email'),\n );\n readonly passwordMinLength = computed(\n () => this.validationConfig?.password?.minLength ?? 8,\n );\n private readonly passwordErrorMessage = computed(\n () =>\n this.validationConfig?.password?.message ??\n this.translate('auth.validation.password.min.length', { min: this.passwordMinLength() }),\n );\n\n readonly userFormModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n confirmPassword: '',\n phone: '',\n });\n readonly userForm = form(this.userFormModel, (f) => {\n required(f.name, { message: this.translate('auth.validation.name.required') });\n minLength(f.name, 2, { message: this.translate('auth.validation.name.min.length', { min: 2 }) });\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, { message: this.translate('auth.validation.password.required') });\n minLength(f.password, this.passwordMinLength(), {\n message: this.passwordErrorMessage(),\n });\n required(f.confirmPassword, { message: this.translate('auth.validation.confirm.password.required') });\n });\n\n readonly companyFormModel = signal<ICompanyFormModel>({\n createNewCompany: false,\n companySlug: '',\n branchSlug: '',\n newCompanyName: '',\n newCompanyPhone: '',\n newCompanyAddress: '',\n });\n readonly companyForm = form(this.companyFormModel);\n\n readonly emailValidationError = computed(() => {\n const email = this.userFormModel().email;\n if (!email) return null;\n return validateEmail(email, this.validationConfig?.email ?? undefined);\n });\n\n readonly passwordValidationError = computed(() => {\n const password = this.userFormModel().password;\n if (!password) return null;\n if (!this.validationConfig?.password) return null;\n return validatePassword(password, this.validationConfig.password);\n });\n\n readonly extraFieldsValidationError = computed(() => {\n if (!this.registrationExtension?.validateExtraFields) return null;\n return this.registrationExtension.validateExtraFields(\n this.extraFieldsModel(),\n );\n });\n\n readonly passwordsMatch = computed(() => {\n const model = this.userFormModel();\n return model.password === model.confirmPassword;\n });\n\n readonly isFormValid = computed(() => {\n const userModel = this.userFormModel();\n const emailError = this.emailValidationError();\n const passwordError = this.passwordValidationError();\n const extraFieldsError = this.extraFieldsValidationError();\n\n const userValid =\n userModel.name.trim().length >= 2 &&\n userModel.email.includes('@') &&\n !emailError &&\n userModel.password.length >= this.passwordMinLength() &&\n !passwordError &&\n userModel.confirmPassword.length > 0 &&\n this.passwordsMatch() &&\n !extraFieldsError;\n\n const extraFieldsValid = this.validateRequiredExtraFields();\n\n if (!isCompanyFeatureEnabled(this.appConfig))\n return userValid && extraFieldsValid;\n\n const companyModel = this.companyFormModel();\n if (companyModel.createNewCompany) {\n return (\n userValid &&\n extraFieldsValid &&\n companyModel.newCompanyName.trim().length > 0\n );\n }\n return userValid && extraFieldsValid;\n });\n\n private validateRequiredExtraFields(): boolean {\n const fields = this.extraFields();\n const values = this.extraFieldsModel();\n\n for (const field of fields) {\n if (field.required) {\n const value = values[field.key];\n if (value === undefined || value === null || value === '') {\n return false;\n }\n }\n }\n return true;\n }\n\n updateExtraField(key: string, value: unknown): void {\n this.extraFieldsModel.update((model) => ({ ...model, [key]: value }));\n }\n\n getFieldTemplateContext(field: IRegistrationExtraField): IRegistrationFieldTemplateContext {\n return {\n field,\n value: this.extraFieldsModel()[field.key] ?? field.defaultValue,\n updateValue: (value: unknown) => this.updateExtraField(field.key, value),\n };\n }\n\n private readonly parentInjector = inject(Injector);\n\n getFieldInjector(field: IRegistrationExtraField): Injector {\n return Injector.create({\n providers: [\n {\n provide: REGISTRATION_FIELD_CONTEXT,\n useValue: this.getFieldTemplateContext(field),\n },\n ],\n parent: field.injector ?? this.parentInjector,\n });\n }\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (!params || this.companySlugInitialized) return;\n\n this.companySlugInitialized = true;\n\n const configCompanySlug = this.defaultCompanySlug();\n const configBranchSlug = this.defaultBranchSlug();\n const queryCompanySlug = params.get('companySlug');\n\n const companySlug = configCompanySlug || queryCompanySlug || '';\n const branchSlug = configBranchSlug || '';\n\n if (companySlug || branchSlug) {\n this.companyFormModel.update((model) => ({\n ...model,\n companySlug,\n branchSlug,\n }));\n }\n });\n }\n\n onCreateCompanyToggle(): void {\n const currentValue = this.companyFormModel().createNewCompany;\n if (!currentValue) {\n this.companyFormModel.update((model) => ({\n ...model,\n createNewCompany: true,\n companySlug: '',\n branchSlug: '',\n }));\n } else {\n this.companyFormModel.update((model) => ({\n ...model,\n createNewCompany: false,\n newCompanyName: '',\n newCompanyPhone: '',\n newCompanyAddress: '',\n }));\n }\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const userModel = this.userFormModel();\n const companyModel = this.companyFormModel();\n\n let registrationData: Record<string, unknown> = {\n name: userModel.name,\n email: userModel.email,\n password: userModel.password,\n phone: userModel.phone || undefined,\n };\n\n const extraFieldsData = this.extraFieldsModel();\n if (Object.keys(extraFieldsData).length > 0) {\n registrationData['additionalFields'] = extraFieldsData;\n }\n\n if (this.registrationExtension?.transformRegistrationData) {\n registrationData =\n this.registrationExtension.transformRegistrationData(registrationData);\n }\n\n if (isCompanyFeatureEnabled(this.appConfig)) {\n if (companyModel.createNewCompany) {\n registrationData['newCompanyName'] =\n companyModel.newCompanyName || undefined;\n registrationData['newCompanyPhone'] =\n companyModel.newCompanyPhone || undefined;\n registrationData['newCompanyAddress'] =\n companyModel.newCompanyAddress || undefined;\n } else {\n registrationData['companySlug'] = companyModel.companySlug || undefined;\n registrationData['branchSlug'] = companyModel.branchSlug || undefined;\n }\n }\n\n this.authApi\n .register(registrationData as unknown as IRegistrationRequest)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (response.requiresEmailVerification) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('auth.register.success'),\n detail: this.translate('auth.verify.email.sent'),\n life: 5000,\n });\n this.router.navigate(['/auth/login']);\n return;\n }\n\n if (response.accessToken) {\n this.authState.setLoginState({\n accessToken: response.accessToken,\n refreshToken: response.refreshToken!,\n user: response.user,\n company: response.company,\n branch: response.branch,\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.register.success'),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { finalize } from 'rxjs';\nimport {\n form,\n FormField,\n required,\n minLength,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IResetPasswordFormModel {\n newPassword: string;\n confirmPassword: string;\n}\n\ntype PageState = 'form' | 'success' | 'invalid-token';\n\n@Component({\n selector: 'lib-reset-password-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('form') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.reset.password.title' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n {{ 'auth.reset.password.subtitle' | translate }}\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"newPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'auth.reset.password.new.password' | translate }}\n </label>\n <input\n pInputText\n id=\"newPassword\"\n type=\"password\"\n [placeholder]=\"'auth.reset.password.new.password.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-4\"\n [formField]=\"resetForm.newPassword\"\n autocomplete=\"new-password\" />\n\n <label for=\"confirmPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'auth.reset.password.confirm.password' | translate }}\n </label>\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n [placeholder]=\"'auth.reset.password.confirm.password.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-2\"\n [formField]=\"resetForm.confirmPassword\"\n autocomplete=\"new-password\" />\n\n @if (passwordMismatch()) {\n <small class=\"text-danger block mb-4\">{{ 'auth.register.passwords.do.not.match' | translate }}</small>\n }\n\n <p-button\n [label]=\"'auth.reset.password.reset.password' | translate\"\n styleClass=\"w-full mt-4 mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!canSubmit() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </form>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-6xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.reset.password.success' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.reset.password.success.message' | translate }}\n </p>\n <a routerLink=\"/auth/login\">\n <p-button [label]=\"'auth.login.sign.in' | translate\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-6xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.reset.password.invalid.link' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.reset.password.invalid.link.message' | translate }}\n </p>\n <a routerLink=\"/auth/forgot-password\">\n <p-button [label]=\"'auth.reset.password.request.new.link' | translate\" styleClass=\"w-full mb-4\" />\n </a>\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ResetPasswordPageComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParams = toSignal(this.route.queryParams);\n private tokenInitialized = false;\n\n private token = '';\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('form');\n readonly formModel = signal<IResetPasswordFormModel>({ newPassword: '', confirmPassword: '' });\n readonly resetForm = form(this.formModel, (f) => {\n required(f.newPassword, { message: this.translate('auth.validation.password.required') });\n minLength(f.newPassword, 8, { message: this.translate('auth.validation.password.min.length', { min: 8 }) });\n required(f.confirmPassword, { message: this.translate('auth.validation.confirm.password.required') });\n });\n readonly passwordMismatch = computed(() => {\n const model = this.formModel();\n return model.confirmPassword.length > 0 && model.newPassword !== model.confirmPassword;\n });\n readonly canSubmit = computed(() => this.resetForm().valid() && !this.passwordMismatch());\n\n constructor() {\n effect(() => {\n const params = this.queryParams();\n if (!params || this.tokenInitialized) return;\n\n this.tokenInitialized = true;\n this.token = params['token'] || '';\n if (!this.token) {\n this.pageState.set('invalid-token');\n }\n });\n }\n\n onSubmit(): void {\n if (!this.canSubmit()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n const newPassword = this.formModel().newPassword;\n\n this.authApi\n .resetPassword(this.token, newPassword)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: () => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.password.reset.success'),\n });\n this.pageState.set('success');\n },\n error: (error) => {\n const message = error.error?.message || '';\n // Show invalid-token state for expired/invalid token errors\n if (message.toLowerCase().includes('expired') || message.toLowerCase().includes('invalid')) {\n this.pageState.set('invalid-token');\n }\n // Other errors handled by global interceptor\n },\n });\n }\n}\n","import { Component, computed, DestroyRef, effect, inject, Injector, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required, email as emailValidator } from '@angular/forms/signals';\nimport { finalize, forkJoin, of } from 'rxjs';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IUser, ICreateUserRequest, IUpdateUserRequest } from '../../interfaces/user.interface';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserPermissionApiService } from '../../services/user-permission-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport {\n AUTH_USER_FORM_EXTENSION,\n IUserFormExtraField,\n IUserFormFieldTemplateContext,\n USER_FORM_FIELD_CONTEXT,\n} from '../../providers/auth-extension.providers';\n\n/** User form model interface */\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n phone: string;\n isActive: boolean;\n emailVerified: boolean;\n}\n\n/**\n * User Form Component\n * Handles creating and editing users.\n * When company feature is enabled, automatically assigns new users to current company/branch.\n */\n@Component({\n selector: 'lib-user-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? ('administration.user.edit' | translate) : ('administration.user.new' | translate) }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">{{ 'administration.user.name' | translate }} *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'administration.user.name.placeholder' | translate\" />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">{{ 'administration.user.email' | translate }} *</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"formTree.email\"\n [placeholder]=\"'auth.email.placeholder' | translate\" />\n </div>\n\n <!-- Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"password\" class=\"font-medium\">\n {{ 'administration.user.password' | translate }} {{ isEditMode() ? ('administration.user.password.optional' | translate) : '*' }}\n </label>\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"formTree.password\"\n [placeholder]=\"'administration.user.password.placeholder' | translate\" />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{ 'administration.user.phone' | translate }}</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\" />\n </div>\n\n <!-- Extra Fields (Admin-editable) -->\n @if (hasExtraFields()) {\n <div class=\"md:col-span-2 border-t border-surface pt-4 mt-2\">\n <div class=\"text-sm font-medium text-muted-color mb-4\">\n <i class=\"pi pi-sliders-h mr-2\"></i>{{ 'auth.profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <p-skeleton height=\"2.5rem\" />\n <p-skeleton height=\"2.5rem\" />\n </div>\n } @else {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n @for (field of extraFields(); track field.key) {\n <div class=\"flex flex-col gap-2\">\n <label [for]=\"field.key\" class=\"font-medium text-color\">\n {{ safeTranslate(field.labelKey, field.label) }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container *ngComponentOutlet=\"field.component; injector: getFieldInjector(field)\" />\n } @else if (field.template) {\n <ng-container [ngTemplateOutlet]=\"field.template\" [ngTemplateOutletContext]=\"getFieldTemplateContext(field)\" />\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n pInputText\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n @case ('number') {\n <input\n pInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).valueAsNumber)\"\n class=\"w-full\" />\n }\n @case ('textarea') {\n <textarea\n pInputTextarea\n [id]=\"field.key\"\n [placeholder]=\"safeTranslate(field.placeholderKey, field.placeholder ?? '')\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\"\n rows=\"3\"></textarea>\n }\n @case ('select') {\n <select\n [id]=\"field.key\"\n class=\"p-select-native w-full\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"updateExtraField(field.key, $event)\">\n <option value=\"\">{{ safeTranslate(field.placeholderKey, field.placeholder ?? ('shared.select' | translate)) }}</option>\n @for (opt of field.options; track opt.value) {\n <option [value]=\"opt.value\">{{ safeTranslate(opt.labelKey, opt.label) }}</option>\n }\n </select>\n }\n @case ('checkbox') {\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [id]=\"field.key\"\n [checked]=\"getExtraFieldValue(field.key) ?? false\"\n (change)=\"updateExtraField(field.key, $any($event.target).checked)\" />\n <span>{{ safeTranslate(field.placeholderKey, field.placeholder ?? safeTranslate(field.labelKey, field.label)) }}</span>\n </label>\n }\n @case ('date') {\n <input\n pInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n (input)=\"updateExtraField(field.key, $any($event.target).value)\"\n class=\"w-full\" />\n }\n }\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{ extraFieldsValidationError() }}</small>\n }\n }\n </div>\n }\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.isActive\" />\n <span>{{ 'shared.active' | translate }}</span>\n </label>\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.emailVerified\" />\n <span>{{ 'administration.user.email.verified' | translate }}</span>\n </label>\n </div>\n\n <!-- Company Info (when company feature enabled) -->\n @if (companyFeatureEnabled() && !isEditMode()) {\n <div class=\"md:col-span-2 p-3 bg-primary/10 rounded-lg border border-primary/20\">\n <div class=\"flex items-center gap-2 text-primary\">\n <i class=\"pi pi-info-circle\"></i>\n <span class=\"text-sm\">\n {{ 'administration.user.auto.assign.to' | translate }}\n <strong>{{ currentCompanyName() }}</strong>\n @if (currentBranchName()) {\n / <strong>{{ currentBranchName() }}</strong>\n }\n </span>\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class UserFormComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly userService = inject(UserApiService);\n private readonly permissionService = inject(UserPermissionApiService);\n private readonly authState = inject(AuthStateService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, { optional: true });\n private readonly parentInjector = inject(Injector);\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n /** Translate with fallback: if key returns unchanged, use fallback instead */\n safeTranslate(key: string | undefined, fallback: string): string {\n if (!key) return fallback;\n const translated = this.translate(key);\n return translated === key ? fallback : translated;\n }\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private userLoadTriggered = false;\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing user data when editing */\n readonly existingUser = signal<IUser | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingUser());\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Current company name */\n readonly currentCompanyName = computed(() => this.authState.companyName());\n\n /** Current branch name */\n readonly currentBranchName = computed(() => this.authState.branchName());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n phone: '',\n isActive: true,\n emailVerified: false,\n });\n\n /** Form with validation schema */\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: this.translate('auth.validation.name.required') });\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.translate('shared.invalid.email') });\n });\n\n readonly isLoadingExtraFields = signal(false);\n readonly extraFieldsModel = signal<Record<string, unknown>>({});\n readonly originalExtraFieldsModel = signal<Record<string, unknown>>({});\n\n readonly extraFields = computed<IUserFormExtraField[]>(() => {\n if (!this.userFormExtension?.getExtraFields) return [];\n return this.userFormExtension.getExtraFields().sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly hasExtraFields = computed(() => this.extraFields().length > 0);\n\n readonly extraFieldsValidationError = computed(() => {\n if (!this.userFormExtension?.validateExtraFields) return null;\n return this.userFormExtension.validateExtraFields(this.extraFieldsModel());\n });\n\n readonly isExtraFieldsDirty = computed(() => {\n const current = this.extraFieldsModel();\n const original = this.originalExtraFieldsModel();\n return JSON.stringify(current) !== JSON.stringify(original);\n });\n\n updateExtraField(key: string, value: unknown): void {\n this.extraFieldsModel.update((model) => ({ ...model, [key]: value }));\n }\n\n getExtraFieldValue(key: string): unknown {\n return this.extraFieldsModel()[key];\n }\n\n getFieldTemplateContext(field: IUserFormExtraField): IUserFormFieldTemplateContext {\n return {\n field,\n value: this.extraFieldsModel()[field.key],\n updateValue: (value: unknown) => this.updateExtraField(field.key, value),\n };\n }\n\n getFieldInjector(field: IUserFormExtraField): Injector {\n return Injector.create({\n providers: [{ provide: USER_FORM_FIELD_CONTEXT, useValue: this.getFieldTemplateContext(field) }],\n parent: field.injector ?? this.parentInjector,\n });\n }\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n const isEdit = this.isEditMode();\n\n // Basic validation\n const nameValid = model.name.trim().length > 0;\n const emailValid = model.email.includes('@');\n\n const passwordValid = isEdit ? true : model.password.length >= 8;\n\n return nameValid && emailValid && passwordValid;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.userLoadTriggered) return;\n\n this.userLoadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadUser(id);\n }\n });\n }\n\n loadUser(id: string): void {\n this.isLoading.set(true);\n this.userService.findById(id)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingUser.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n this.loadExtraFields(id);\n }\n },\n error: () => this.router.navigate(['/administration/users']),\n });\n }\n\n private loadExtraFields(userId: string): void {\n if (!this.userFormExtension?.getExtraFieldValues) return;\n\n this.isLoadingExtraFields.set(true);\n this.userFormExtension\n .getExtraFieldValues(userId)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoadingExtraFields.set(false))\n )\n .subscribe({\n next: (values) => {\n this.extraFieldsModel.set(values);\n this.originalExtraFieldsModel.set(values);\n },\n error: () => {\n const defaults: Record<string, unknown> = {};\n for (const field of this.extraFields()) {\n if (field.key) defaults[field.key] = undefined;\n }\n this.extraFieldsModel.set(defaults);\n this.originalExtraFieldsModel.set(defaults);\n },\n });\n }\n\n private toFormModel(user: IUser): IUserFormModel {\n return {\n name: user.name,\n email: user.email,\n password: '',\n phone: user.phone || '',\n isActive: user.isActive,\n emailVerified: user.emailVerified,\n };\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.all.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n if (this.isEditMode() && this.existingUser()) {\n this.updateUser();\n } else {\n this.createUser();\n }\n }\n\n private updateUser(): void {\n const model = this.formModel();\n const userId = this.existingUser()!.id;\n const updateData: IUpdateUserRequest = {\n id: userId,\n name: model.name,\n email: model.email,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n if (model.password) {\n updateData.password = model.password;\n }\n\n const userUpdate$ = this.userService.update(updateData);\n const extraFieldsUpdate$ = this.isExtraFieldsDirty() && this.userFormExtension?.saveExtraFieldValues\n ? this.userFormExtension.saveExtraFieldValues(userId, this.extraFieldsModel())\n : of(undefined);\n\n forkJoin([userUpdate$, extraFieldsUpdate$])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: () => this.onSaveSuccess(this.translate('user.update.success')),\n });\n }\n\n private createUser(): void {\n const model = this.formModel();\n const createData: ICreateUserRequest = {\n name: model.name,\n email: model.email,\n password: model.password,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n this.userService.insert(createData)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n const userId = response.data.id;\n if (this.companyFeatureEnabled()) {\n this.assignUserToCompanyAndBranch(userId);\n }\n this.saveExtraFieldsForNewUser(userId);\n }\n this.onSaveSuccess(this.translate('user.create.success'));\n },\n });\n }\n\n private saveExtraFieldsForNewUser(userId: string): void {\n const extraFields = this.extraFieldsModel();\n const hasExtraData = Object.keys(extraFields).length > 0 && Object.values(extraFields).some(v => v !== undefined && v !== '');\n\n if (!hasExtraData || !this.userFormExtension?.saveExtraFieldValues) return;\n\n this.userFormExtension.saveExtraFieldValues(userId, extraFields)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({ severity: 'success', summary: this.translate('shared.success'), detail: message });\n this.router.navigate(['/administration/users']);\n }\n\n /**\n * Assign user to current company and branch\n */\n private assignUserToCompanyAndBranch(userId: string): void {\n const company = this.authState.company();\n const branch = this.authState.branch();\n\n if (!company) return;\n\n // Assign to company\n this.permissionService.assignUserToCompany(userId, company.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // If branch exists, assign to branch\n if (branch) {\n this.permissionService.assignUserToBranch(userId, branch.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n // Silently fail - user was created successfully\n });\n }\n },\n // Silently fail - user was created successfully\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/users']);\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { ICompany } from '../interfaces/company.interface';\nimport { IUser } from '../interfaces/user.interface';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\ninterface CompanyWithAssignment extends ICompany {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-company-permission-dialog',\n imports: [\n AngularModule,\n PrimeModule,\n DialogModule,\n ProgressSpinnerModule,\n TranslatePipe,\n ],\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'auth.permission.manage.company' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color\">\n {{ 'auth.permission.user' | translate }}:\n <strong>{{ user()?.name }}</strong> ({{ user()?.email }})\n </p>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (company of companies(); track company.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"company.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'company-' + company.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onCompanyToggle(company)\"\n />\n <label\n [for]=\"'company-' + company.id\"\n class=\"ml-3 flex-1 cursor-pointer\"\n >\n <div class=\"font-semibold\">{{ company.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ company.slug }}</div>\n </label>\n </div>\n } @empty {\n <div class=\"text-center py-4 text-muted-color\">\n {{ 'administration.company.no.companies' | translate }}\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n [label]=\"'shared.close' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\"\n />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserCompanyPermissionDialogComponent {\n private readonly companyApi = inject(CompanyApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, params) ?? key;\n }\n\n readonly visible = input.required<boolean>();\n readonly user = input.required<IUser | null>();\n readonly closed = output<void>();\n readonly permissionsChanged = output<void>();\n\n readonly isLoading = signal(false);\n readonly isSaving = signal(false);\n readonly companies = signal<CompanyWithAssignment[]>([]);\n\n private assignedCompanyIds = new Set<string>();\n\n constructor() {\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadData();\n }\n });\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isLoading.set(true);\n try {\n const companiesResponse = await firstValueFrom(\n this.companyApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id),\n );\n\n this.assignedCompanyIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n this.assignedCompanyIds.add(permission.companyId);\n });\n }\n\n const companiesWithStatus: CompanyWithAssignment[] = (\n companiesResponse.data || []\n ).map((company) => ({\n ...company,\n isAssigned: this.assignedCompanyIds.has(company.id),\n }));\n\n this.companies.set(companiesWithStatus);\n } catch {\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onCompanyToggle(company: CompanyWithAssignment): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (company.isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToCompany(currentUser.id, company.id),\n );\n\n if (response.success) {\n this.assignedCompanyIds.add(company.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.company.assigned', {\n name: company.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromCompany(currentUser.id, company.id),\n );\n\n if (response.success) {\n this.assignedCompanyIds.delete(company.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.company.revoked', {\n name: company.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n company.isAssigned = !company.isAssigned;\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { IBranch } from '../interfaces/branch.interface';\nimport { IUser } from '../interfaces/user.interface';\nimport { BranchApiService } from '../services/branch-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\ninterface BranchWithAssignment extends IBranch {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-branch-permission-dialog',\n imports: [\n AngularModule,\n PrimeModule,\n DialogModule,\n ProgressSpinnerModule,\n TranslatePipe,\n ],\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'auth.permission.manage.branch' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color mb-3\">\n {{ 'auth.permission.user' | translate }}:\n <strong>{{ user()?.name }}</strong> ({{ user()?.email }})\n </p>\n <div class=\"flex items-center gap-2\">\n <label class=\"text-sm font-medium min-w-[70px]\"\n >{{ 'administration.branch.company' | translate }}:</label\n >\n <p-select\n [options]=\"companies()\"\n [(ngModel)]=\"selectedCompanyId\"\n (onChange)=\"onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administration.company.select' | translate\"\n styleClass=\"w-full\"\n [disabled]=\"isLoading() || isSaving()\"\n />\n </div>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (branch of branches(); track branch.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"branch.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'branch-' + branch.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onBranchToggle(branch)\"\n />\n <label\n [for]=\"'branch-' + branch.id\"\n class=\"ml-3 flex-1 cursor-pointer\"\n >\n <div class=\"font-semibold\">{{ branch.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ branch.slug }}</div>\n </label>\n </div>\n } @empty {\n <div class=\"text-center py-4 text-muted-color\">\n @if (companies().length === 0) {\n {{ 'auth.permission.no.company' | translate }}<br />\n <span class=\"text-xs\">{{\n 'auth.permission.assign.company.first' | translate\n }}</span>\n } @else if (!selectedCompanyId) {\n {{ 'auth.permission.select.company.for.branches' | translate }}\n } @else {\n {{ 'administration.branch.no.branches' | translate }}\n }\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n [label]=\"'shared.close' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\"\n />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserBranchPermissionDialogComponent {\n private readonly branchApi = inject(BranchApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, params) ?? key;\n }\n\n readonly visible = input.required<boolean>();\n readonly user = input.required<IUser | null>();\n readonly closed = output<void>();\n readonly permissionsChanged = output<void>();\n\n readonly isLoading = signal(false);\n readonly isSaving = signal(false);\n readonly branches = signal<BranchWithAssignment[]>([]);\n readonly companies = signal<Array<{ id: string; name: string }>>([]);\n\n selectedCompanyId: string | null = null;\n private assignedBranchIds = new Set<string>();\n\n constructor() {\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadUserCompaniesAndData();\n }\n });\n }\n\n private async loadUserCompaniesAndData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n try {\n const companiesResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id),\n );\n\n const userCompanies = (companiesResponse.data || []).map(\n (permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n }),\n );\n\n this.companies.set(userCompanies);\n this.selectedCompanyId = null;\n this.branches.set([]);\n } catch {}\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n const companyId = this.selectedCompanyId;\n\n if (!currentUser || !companyId) return;\n\n this.isLoading.set(true);\n try {\n const branchesResponse = await firstValueFrom(\n this.branchApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { companyId },\n select: [],\n sort: {},\n }),\n );\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserBranches(currentUser.id),\n );\n\n this.assignedBranchIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n if (permission.companyId === companyId) {\n this.assignedBranchIds.add(permission.branchId);\n }\n });\n }\n\n const branchesWithStatus: BranchWithAssignment[] = (\n branchesResponse.data || []\n ).map((branch) => ({\n ...branch,\n isAssigned: this.assignedBranchIds.has(branch.id),\n }));\n\n this.branches.set(branchesWithStatus);\n } catch {\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId) {\n this.loadData();\n }\n }\n\n async onBranchToggle(branch: BranchWithAssignment): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (branch.isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToBranch(currentUser.id, branch.id),\n );\n\n if (response.success) {\n this.assignedBranchIds.add(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.branch.assigned', {\n name: branch.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromBranch(currentUser.id, branch.id),\n );\n\n if (response.success) {\n this.assignedBranchIds.delete(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: this.t('auth.permission.branch.revoked', {\n name: branch.name ?? '',\n }),\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n branch.isAssigned = !branch.isAssigned;\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { Component, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { AngularModule, HasPermissionDirective, PrimeModule, TranslatePipe, USER_PERMISSIONS } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { IUser } from '../../interfaces/user.interface';\nimport {\n AUTH_USER_DETAIL_CONFIG,\n AUTH_USER_LIST_EXTENSION,\n IUserListExtraAction,\n IUserListExtraColumn,\n} from '../../providers/auth-extension.providers';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserCompanyPermissionDialogComponent } from '../../components/user-company-permission-dialog.component';\nimport { UserBranchPermissionDialogComponent } from '../../components/user-branch-permission-dialog.component';\n\n@Component({\n selector: 'lib-user-list',\n imports: [\n AngularModule,\n PrimeModule,\n HasPermissionDirective,\n TranslatePipe,\n UserCompanyPermissionDialogComponent,\n UserBranchPermissionDialogComponent,\n ],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">{{ 'administration.user.title' | translate }}</h2>\n <p-button *hasPermission=\"USER_PERMISSIONS.CREATE\" [label]=\"'administration.user.add' | translate\" icon=\"pi pi-plus\" (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"users()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>{{ 'administration.user.name' | translate }}</th>\n <th>{{ 'administration.user.email' | translate }}</th>\n <th>{{ 'administration.user.phone' | translate }}</th>\n <th>{{ 'administration.user.email.verified' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n @for (col of extraColumns(); track col.key) {\n <th [class]=\"col.styleClass ?? ''\" [style.width]=\"col.width ?? 'auto'\">\n {{ safeTranslate(col.headerKey, col.header) }}\n </th>\n }\n <th class=\"w-[180px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-user>\n <tr>\n <td>{{ user.name }}</td>\n <td>{{ user.email }}</td>\n <td>{{ user.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"user.emailVerified ? ('shared.verified' | translate) : ('shared.unverified' | translate)\"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\" />\n </td>\n <td>\n <p-tag\n [value]=\"user.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"user.isActive ? 'success' : 'danger'\" />\n </td>\n @for (col of extraColumns(); track col.key) {\n <td [class]=\"col.styleClass ?? ''\">\n @if (col.template) {\n <ng-container [ngTemplateOutlet]=\"col.template\" [ngTemplateOutletContext]=\"{ $implicit: user }\" />\n } @else if (col.field) {\n {{ getFieldValue(user, col.field) ?? '-' }}\n }\n </td>\n }\n <td>\n <div class=\"flex gap-1 flex-wrap\">\n @if (hasUserDetailView()) {\n <p-button\n icon=\"pi pi-eye\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.view.details' | translate\"\n (onClick)=\"onViewDetails(user)\" />\n }\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [pTooltip]=\"'shared.edit' | translate\"\n (onClick)=\"onEdit(user)\" />\n @if (companyFeatureEnabled()) {\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [pTooltip]=\"'administration.permission.company.permissions' | translate\"\n (onClick)=\"onManageCompanyPermissions(user)\" />\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-sitemap\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [pTooltip]=\"'administration.permission.branch.permissions' | translate\"\n (onClick)=\"onManageBranchPermissions(user)\" />\n }\n @for (action of extraActions(); track action.key) {\n @if (isActionVisible(action, user)) {\n <p-button\n [icon]=\"action.icon\"\n [rounded]=\"true\"\n [text]=\"true\"\n [severity]=\"action.severity ?? 'secondary'\"\n [pTooltip]=\"safeTranslate(action.labelKey, action.label)\"\n [disabled]=\"isActionDisabled(action, user)\"\n (onClick)=\"onExtraAction(action, user)\" />\n }\n }\n <p-button\n *hasPermission=\"USER_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [pTooltip]=\"'shared.delete' | translate\"\n (onClick)=\"onDelete(user)\" />\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td [attr.colspan]=\"tableColspan()\" class=\"text-center py-8\">\n {{ 'administration.user.no.users' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n\n @if (companyFeatureEnabled()) {\n <lib-user-company-permission-dialog\n [visible]=\"showCompanyDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showCompanyDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n\n <lib-user-branch-permission-dialog\n [visible]=\"showBranchDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showBranchDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n }\n\n @if (hasUserDetailView() && showUserDetailDialog()) {\n <p-dialog\n [header]=\"'administration.user.details' | translate\"\n [visible]=\"showUserDetailDialog()\"\n [modal]=\"true\"\n [style]=\"{ width: userDetailConfig?.width ?? '600px' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n (onHide)=\"closeUserDetailDialog()\">\n @if (selectedUser(); as user) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.name' | translate }}</label>\n <span class=\"text-color\">{{ user.name }}</span>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.email' | translate }}</label>\n <span class=\"text-color\">{{ user.email }}</span>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.phone' | translate }}</label>\n <span class=\"text-color\">{{ user.phone || '-' }}</span>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'shared.status' | translate }}</label>\n <p-tag\n [value]=\"user.isActive ? ('shared.active' | translate) : ('shared.inactive' | translate)\"\n [severity]=\"user.isActive ? 'success' : 'danger'\" />\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ 'administration.user.email.verified' | translate }}</label>\n <p-tag\n [value]=\"user.emailVerified ? ('shared.verified' | translate) : ('shared.unverified' | translate)\"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\" />\n </div>\n @for (col of extraColumns(); track col.key) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{ safeTranslate(col.headerKey, col.header) }}</label>\n <span class=\"text-color\">{{ getFieldValue(user, col.field ?? col.key) ?? '-' }}</span>\n </div>\n }\n </div>\n <div class=\"flex justify-end gap-2 mt-6\">\n @if (userDetailConfig?.allowEdit) {\n <p-button\n [label]=\"'shared.edit' | translate\"\n icon=\"pi pi-pencil\"\n (onClick)=\"onEdit(user); closeUserDetailDialog()\" />\n }\n <p-button\n [label]=\"'shared.close' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"closeUserDetailDialog()\" />\n </div>\n }\n </p-dialog>\n }\n `,\n})\nexport class UserListComponent {\n readonly USER_PERMISSIONS = USER_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly userService = inject(UserApiService);\n\n private readonly userListExtension = inject(AUTH_USER_LIST_EXTENSION, { optional: true });\n readonly userDetailConfig = inject(AUTH_USER_DETAIL_CONFIG, { optional: true });\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n /** Translate with fallback: if key returns unchanged, use fallback instead */\n safeTranslate(key: string | undefined, fallback: string): string {\n if (!key) return fallback;\n const translated = this.translate(key);\n return translated === key ? fallback : translated;\n }\n\n readonly users = this.userService.data;\n readonly isLoading = this.userService.isLoading;\n readonly total = this.userService.total;\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n readonly extraColumns = computed<IUserListExtraColumn[]>(() => {\n if (!this.userListExtension) return [];\n const columns = this.userListExtension.getExtraColumns();\n return columns.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly extraActions = computed<IUserListExtraAction[]>(() => {\n if (!this.userListExtension) return [];\n const actions = this.userListExtension.getExtraActions();\n return actions.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n });\n\n readonly hasUserDetailView = computed(() => !!this.userDetailConfig);\n readonly tableColspan = computed(() => 6 + this.extraColumns().length);\n\n readonly showCompanyDialog = signal(false);\n readonly showBranchDialog = signal(false);\n readonly showUserDetailDialog = signal(false);\n readonly selectedUser = signal<IUser | null>(null);\n\n getFieldValue(user: IUser, field: string): unknown {\n const parts = field.split('.');\n let value: unknown = user;\n for (const part of parts) {\n if (value === null || value === undefined) return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n return value;\n }\n\n isActionVisible(action: IUserListExtraAction, user: IUser): boolean {\n return action.isVisible ? action.isVisible(user) : true;\n }\n\n isActionDisabled(action: IUserListExtraAction, user: IUser): boolean {\n return action.isDisabled ? action.isDisabled(user) : false;\n }\n\n onExtraAction(action: IUserListExtraAction, user: IUser): void {\n action.onClick(user);\n }\n\n onViewDetails(user: IUser): void {\n if (!this.userDetailConfig) return;\n\n if (this.userDetailConfig.viewMode === 'page') {\n this.router.navigate(['/administration/users', user.id]);\n } else {\n this.selectedUser.set(user);\n this.showUserDetailDialog.set(true);\n }\n }\n\n closeUserDetailDialog(): void {\n this.showUserDetailDialog.set(false);\n this.selectedUser.set(null);\n }\n\n loadUsers(): void {\n this.userService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 10 },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n this.userService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/users/new']);\n }\n\n onEdit(user: IUser): void {\n this.router.navigate(['/administration/users', user.id]);\n }\n\n onManageCompanyPermissions(user: IUser): void {\n this.openPermissionDialog(user, this.showCompanyDialog);\n }\n\n onManageBranchPermissions(user: IUser): void {\n this.openPermissionDialog(user, this.showBranchDialog);\n }\n\n private openPermissionDialog(user: IUser, dialogSignal: typeof this.showCompanyDialog): void {\n this.selectedUser.set(user);\n dialogSignal.set(true);\n }\n\n onDelete(user: IUser): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', { name: user.name }),\n header: this.translate('administration.user.delete.title'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.userService.deleteAsync({ id: user.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('administration.user.delete.success'),\n });\n this.userService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n makeStateKey,\n PLATFORM_ID,\n signal,\n TransferState,\n} from '@angular/core';\nimport { TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { finalize } from 'rxjs';\nimport {\n form,\n FormField,\n required,\n email as emailValidator,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\nconst VERIFY_EMAIL_KEY = makeStateKey<'success' | 'error'>('verify-email-result');\n\ninterface IResendFormModel {\n email: string;\n}\n\ntype PageState = 'verifying' | 'success' | 'invalid-token' | 'resend';\n\n@Component({\n selector: 'lib-verify-email-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator, TranslatePipe],\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('verifying') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-spin pi-spinner text-8xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.verifying' | translate }}\n </div>\n <p class=\"text-muted-color font-medium\">\n {{ 'auth.verify.email.please.wait' | translate }}\n </p>\n </div>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-8xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.success' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.success.message' | translate }}\n </p>\n <a routerLink=\"/auth/login\">\n <p-button [label]=\"'auth.login.sign.in' | translate\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-8xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.failed' | translate }}\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.invalid.link' | translate }}\n </p>\n <p-button\n [label]=\"'auth.verify.email.resend.email' | translate\"\n styleClass=\"w-full mb-4\"\n (onClick)=\"showResendForm()\" />\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </div>\n }\n\n @case ('resend') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n {{ 'auth.verify.email.resend.title' | translate }}\n </div>\n <span class=\"text-muted-color font-medium\">\n {{ 'auth.verify.email.resend.subtitle' | translate }}\n </span>\n </div>\n\n @if (!resendSuccess()) {\n <form (ngSubmit)=\"onResend()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n {{ 'administration.user.email' | translate }}\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.verify.email.email.placeholder' | translate\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"resendForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n [label]=\"'auth.verify.email.resend' | translate\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isResendFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-8xl text-primary\"></i>\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.email.sent' | translate: { email: submittedEmail() } }}\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n {{ 'auth.login.back.to.sign.in' | translate }}\n </a>\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class VerifyEmailPageComponent {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly transferState = inject(TransferState);\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly authApi = inject(AuthApiService);\n private readonly translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });\n\n private translate(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n private readonly queryParams = toSignal(this.route.queryParams);\n private verificationTriggered = false;\n\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('verifying');\n readonly resendSuccess = signal(false);\n readonly submittedEmail = signal('');\n readonly resendFormModel = signal<IResendFormModel>({ email: '' });\n readonly resendForm = form(this.resendFormModel, (f) => {\n required(f.email, { message: this.translate('auth.validation.email.required') });\n emailValidator(f.email, { message: this.translate('shared.invalid.email') });\n });\n readonly isResendFormValid = computed(() => this.resendForm().valid());\n\n constructor() {\n effect(() => {\n const params = this.queryParams();\n if (!params || this.verificationTriggered) return;\n\n this.verificationTriggered = true;\n const token = params['token'] || '';\n if (!token) {\n this.pageState.set('resend');\n return;\n }\n\n // Check if we already have result from SSR (avoid duplicate API call)\n const cachedResult = this.transferState.get(VERIFY_EMAIL_KEY, null);\n if (cachedResult) {\n this.transferState.remove(VERIFY_EMAIL_KEY);\n this.handleVerificationResult(cachedResult === 'success');\n return;\n }\n\n this.verifyEmail(token);\n });\n }\n\n private verifyEmail(token: string): void {\n this.authApi\n .verifyEmail(token)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // Store result for browser hydration (SSR only)\n if (!isPlatformBrowser(this.platformId)) {\n this.transferState.set(VERIFY_EMAIL_KEY, 'success');\n }\n this.handleVerificationResult(true);\n },\n error: () => {\n if (!isPlatformBrowser(this.platformId)) {\n this.transferState.set(VERIFY_EMAIL_KEY, 'error');\n }\n this.handleVerificationResult(false);\n },\n });\n }\n\n private handleVerificationResult(success: boolean): void {\n if (success) {\n this.pageState.set('success');\n if (isPlatformBrowser(this.platformId)) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.verify.email.success'),\n });\n }\n } else {\n this.pageState.set('invalid-token');\n }\n }\n\n showResendForm(): void {\n this.pageState.set('resend');\n this.resendSuccess.set(false);\n }\n\n onResend(): void {\n if (!this.isResendFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.invalid.email'),\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.resendFormModel().email;\n\n // Always show success (security: don't reveal if email exists)\n this.authApi\n .resendVerification(email)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.handleResendComplete(email))\n )\n .subscribe();\n }\n\n private handleResendComplete(email: string): void {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('auth.verify.email.sent'),\n });\n this.submittedEmail.set(email);\n this.resendSuccess.set(true);\n }\n}\n","// =============================================================================\n// @flusys/ng-auth - Authentication Package\n// =============================================================================\n\n// Interfaces (matching NestJS auth API)\nexport * from './interfaces/auth.interface';\nexport * from './interfaces/branch.interface';\nexport * from './interfaces/company.interface';\nexport * from './interfaces/user-permission.interface';\nexport * from './interfaces/user.interface';\n\n// Services (matching NestJS auth API)\nexport * from './services/auth-api.service';\nexport * from './services/auth-init.service';\nexport * from './services/auth-state.service';\nexport * from './services/branch-api.service';\nexport * from './services/company-api.service';\nexport * from './services/token-refresh-state.service';\nexport * from './services/user-api.service';\nexport * from './services/user-permission-api.service';\n\n// Guards\nexport * from './guards/auth.guard';\n\n// Interceptors\nexport * from './interceptors/auth.interceptor';\nexport * from './interceptors/token-refresh.interceptor';\n\n// Routes\nexport * from './routes/auth.routes';\n\n// Adapters (consolidated by target package)\nexport * from './adapters/auth-layout-providers.adapter';\nexport * from './adapters/auth-shared-providers.adapter';\n\n// Providers\nexport * from './providers/auth-layout.providers';\nexport * from './providers/auth-providers';\nexport * from './providers/auth-extension.providers';\n\n// Constants\nexport * from './constants/auth-endpoints.const';\nexport * from './constants/messages';\n\n// Pages (components)\nexport * from './pages/administration/administration-page.component';\nexport * from './pages/branch/branch-form.component';\nexport * from './pages/branch/branch-list.component';\nexport * from './pages/company/company-form.component';\nexport * from './pages/company/company-list.component';\nexport * from './pages/forgot-password/forgot-password-page.component';\nexport * from './pages/login/login-page.component';\nexport * from './pages/profile/profile-page.component';\nexport * from './pages/register/register-page.component';\nexport * from './pages/reset-password/reset-password-page.component';\nexport * from './pages/users/user-form.component';\nexport * from './pages/users/user-list.component';\nexport * from './pages/verify-email/verify-email-page.component';\n\n// Components (dialogs)\nexport * from './components/user-branch-permission-dialog.component';\nexport * from './components/user-company-permission-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","catchError","tap","i4","i1","i2","i3","i5","emailValidator","i6","i7","i8"],"mappings":"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"}