@flusys/ng-auth 7.0.0 → 7.0.1

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-branch-permission-dialog.component.ts","../../../projects/ng-auth/components/user-company-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":["import { ISingleResponse } from '@flusys/ng-shared';\n\nexport 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\n// ─── Data-level interfaces (what's inside `data`) ─────────────────────────────\n\nexport interface ILoginData {\n accessToken: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IMeData {\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IRegistrationData {\n accessToken?: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n requiresEmailVerification?: boolean;\n}\n\nexport interface ICompanySelectionData {\n requiresSelection: true;\n sessionId: string;\n expiresAt: Date | string;\n user: IUserInfo;\n companies: ICompanyWithBranches[];\n}\n\nexport interface IEmailVerificationData {\n requiresEmailVerification: true;\n email: string;\n}\n\n// ─── API response type aliases (FLUSYS envelope via ISingleResponse) ──────────\n\nexport type ILoginResponse = ISingleResponse<ILoginData>;\nexport type IMeResponse = ISingleResponse<IMeData>;\nexport type IRegistrationResponse = ISingleResponse<IRegistrationData>;\nexport type ICompanySelectionResponse = ISingleResponse<ICompanySelectionData>;\nexport type ILoginRequiresEmailVerification = ISingleResponse<IEmailVerificationData>;\nexport type IRefreshTokenResponse = ISingleResponse<{ accessToken: string; refreshToken?: string }>;\n\n// ─── Union type for login endpoint response ────────────────────────────────────\n\nexport type AuthResponse = ISingleResponse<ILoginData | ICompanySelectionData | IEmailVerificationData>;\n\n// ─── Type guards ───────────────────────────────────────────────────────────────\n\nexport function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification {\n return !!response.data && 'requiresEmailVerification' in response.data && response.data.requiresEmailVerification === true;\n}\n\nexport function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse {\n return !!response.data && 'requiresSelection' in response.data && response.data.requiresSelection === true;\n}\n\nexport function isLoginResponse(response: AuthResponse): response is ILoginResponse {\n return !!response.data && 'accessToken' in response.data;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl } from '@flusys/ng-core';\nimport { IMessageResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n AuthResponse,\n IBranchInfo,\n IChangePasswordRequest,\n ICompanyInfo,\n ILoginRequest,\n IMeResponse,\n IRefreshTokenResponse,\n IRegistrationRequest,\n IRegistrationResponse,\n ISelectRequest,\n ILoginResponse,\n ISwitchCompanyRequest,\n} from '../interfaces/auth.interface';\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 login(data: ILoginRequest): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.baseUrl}/login`, data);\n }\n\n register(data: IRegistrationRequest): Observable<IRegistrationResponse> {\n return this.http.post<IRegistrationResponse>(`${this.baseUrl}/register`, data);\n }\n\n select(data: ISelectRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/select`, data);\n }\n\n switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/switch-company`, data);\n }\n\n getCompanies(): Observable<ISingleResponse<ICompanyInfo[]>> {\n return this.http.post<ISingleResponse<ICompanyInfo[]>>(`${this.baseUrl}/get-companies`, {});\n }\n\n getCompanyBranches(companyId: string): Observable<ISingleResponse<IBranchInfo[]>> {\n return this.http.post<ISingleResponse<IBranchInfo[]>>(`${this.baseUrl}/get-company-branches`, { companyId });\n }\n\n refresh(): Observable<IRefreshTokenResponse> {\n return this.http.post<IRefreshTokenResponse>(`${this.baseUrl}/refresh`, {});\n }\n\n me(): Observable<IMeResponse> {\n return this.http.post<IMeResponse>(`${this.baseUrl}/me`, {});\n }\n\n logout(): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/logout`, {});\n }\n\n changePassword(data: IChangePasswordRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/change-password`, data);\n }\n\n forgotPassword(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/forgot-password`, { email });\n }\n\n resetPassword(token: string, newPassword: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/reset-password`, { token, newPassword });\n }\n\n resendVerification(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/resend-verification`, { email });\n }\n\n verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse> {\n return this.http.post<IMessageResponse | IRegistrationResponse>(`${this.baseUrl}/verify-email`, { token });\n }\n}\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n PermissionValidatorService,\n PlatformService,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ICompanySelectionData,\n ICompanyWithBranches,\n ILoginData,\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\nconst SAVED_USER_NAME_KEY = 'savedUserName';\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(TranslateService, {\n optional: true,\n });\n private readonly permissionValidator = inject(PermissionValidatorService);\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\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 ?? '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 // Persist display name for the login page's \"welcome back\" greeting\n effect(() => {\n const user = this._user();\n const name = user?.name?.trim() || user?.email;\n if (name) this.store(SAVED_USER_NAME_KEY, name);\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(data: ILoginData): void {\n this._accessToken.set(data.accessToken);\n this._user.set(data.user);\n this._company.set(data.company ?? null);\n this._branch.set(data.branch ?? null);\n const expiry = this.decodeTokenExpiry(data.accessToken);\n this._tokenExpiresAt.set(expiry);\n this.clearSelectionState();\n }\n\n setSelectionState(data: ICompanySelectionData): void {\n this._selectionSessionId.set(data.sessionId);\n this._availableCompanies.set(data.companies);\n this._user.set(data.user);\n }\n\n clearSelectionState(): void {\n this._selectionSessionId.set(null);\n this._availableCompanies.set([]);\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 this.permissionValidator.clearPermissions();\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 getSavedUserName(): string | null {\n return this.get(SAVED_USER_NAME_KEY);\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 { 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@Injectable({ providedIn: 'root' })\nexport class AuthInitService {\n private readonly authState = inject(AuthStateService);\n private readonly authApi = inject(AuthApiService);\n private readonly appConfig = inject(APP_CONFIG);\n\n private readonly _initialized = signal(false);\n readonly initialized = this._initialized.asReadonly();\n\n private initializationCache$: Observable<boolean> | null = null;\n\n initialize(): Observable<boolean> {\n if (this.authState.isAuthenticated() && this.authState.user()) {\n this._initialized.set(true);\n return of(true);\n }\n\n if (this._initialized()) {\n return of(this.authState.isAuthenticated());\n }\n\n if (this.initializationCache$) {\n return this.initializationCache$;\n }\n\n this.initializationCache$ = this.authApi.refresh().pipe(\n timeout(5000),\n switchMap((refreshResponse) => {\n const accessToken = refreshResponse.data?.accessToken;\n if (!accessToken) return of(false);\n this.authState.setAccessToken(accessToken);\n return this.authApi.me().pipe(\n map((meResponse) => {\n const meData = meResponse.data;\n if (!meData) return false;\n const { user, company, branch } = meData;\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 }),\n\n catchError((err) => {\n this._initialized.set(true);\n\n const errorKey: string = err?.error?.messageKey ?? '';\n\n const companyErrorKeys = new Set([\n 'auth.company.required',\n 'auth.company.not.found',\n 'auth.company.no.access',\n 'auth.branch.not.found',\n 'auth.branch.no.access',\n ]);\n\n const isCompanyError = companyErrorKeys.has(errorKey);\n\n if (isCompanyError && this.appConfig.enableCompanyFeature) {\n this.authState.setUser(null);\n this.authState.setCompany(null);\n this.authState.setBranch(null);\n } else {\n this.authState.resetState();\n }\n\n return of(false);\n }),\n\n shareReplay({ bufferSize: 1, refCount: true }),\n\n finalize(() => {\n this.initializationCache$ = null;\n }),\n );\n\n return this.initializationCache$;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n IBranch,\n ICreateBranchRequest,\n IUpdateBranchRequest,\n} 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 constructor() {\n super('branch', 'administration');\n }\n\n fetchByCompany(companyId: string, search = ''): void {\n this.fetchList(search, { filter: { companyId } });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICompany,\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n} 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', '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 { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IFilterData,\n IListResponse,\n ISingleResponse,\n IUserBasicInfo,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateUserRequest,\n IUpdateUserRequest,\n IUser,\n} 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', 'administration');\n }\n\n updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>> {\n return this.http.post<ISingleResponse<IUser>>(\n `${this.baseUrl}/profile`,\n data,\n );\n }\n\n lookup(\n filter: IFilterData,\n search = '',\n ): Observable<IListResponse<IUserBasicInfo>> {\n const params = search ? { q: search } : undefined;\n return this.http.post<IListResponse<IUserBasicInfo>>(\n `${this.baseUrl}/lookup`,\n filter,\n params ? { params } : undefined,\n );\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 { IMessageResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n IAssignUserBranchRequest,\n IAssignUserCompanyRequest,\n IUserBranchPermission,\n IUserCompanyPermission,\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<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/user-company/assign`, data);\n }\n\n assignUserToCompany(userId: string, companyId: string): Observable<IMessageResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: true }] });\n }\n\n revokeUserFromCompany(userId: string, companyId: string): Observable<IMessageResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: false }] });\n }\n\n getUserCompanies(userId: string): Observable<ISingleResponse<IUserCompanyPermission[]>> {\n return this.http.post<ISingleResponse<IUserCompanyPermission[]>>(`${this.baseUrl}/get-user-company`, { userId });\n }\n\n // Branch Permissions\n assignUserBranches(data: IAssignUserBranchRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/user-branch/assign`, data);\n }\n\n assignUserToBranch(userId: string, branchId: string): Observable<IMessageResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: true }] });\n }\n\n revokeUserFromBranch(userId: string, branchId: string): Observable<IMessageResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: false }] });\n }\n\n getUserBranches(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission[]>> {\n return this.http.post<ISingleResponse<IUserBranchPermission[]>>(`${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 {\n HttpErrorResponse,\n HttpEvent,\n HttpHandlerFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { TranslateService } from '@flusys/ng-shared';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n catchError,\n filter,\n Observable,\n switchMap,\n take,\n throwError,\n} 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(TranslateService, { 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 (\n isRefreshRequest ||\n isLoginRequest ||\n isSelectRequest ||\n isRegisterRequest\n ) {\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) =>\n next(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } })),\n ),\n );\n }\n\n refreshState.startRefresh();\n\n return authApi.refresh().pipe(\n switchMap((response) => {\n const newToken = response.data!.accessToken;\n authState.setAccessToken(newToken);\n refreshState.completeRefresh(newToken);\n return next(\n req.clone({ setHeaders: { Authorization: `Bearer ${newToken}` } }),\n );\n }),\n catchError((refreshError) => {\n refreshState.failRefresh();\n return handleRefreshFailure(\n authState,\n messageService,\n isBrowser,\n refreshError,\n t,\n );\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 const detailKey = error?.error?.messageKey;\n messageService.add({\n severity: 'error',\n summary: t('auth.session.expired.title'),\n detail: t(detailKey),\n });\n }\n authState.resetState();\n authState.navigateToLogin();\n\n return throwError(() => error);\n}\n","export const AUTH_MESSAGES: Record<string, string> = {\n // AUTH_MESSAGES (API keys)\n 'auth.login.success': 'Login successful',\n 'auth.login.requires.selection':\n 'Please select a company and branch to continue',\n 'auth.login.invalid.credentials': 'Invalid email or password',\n 'auth.login.email.not.verified': 'Please verify your email before logging in',\n 'auth.login.account.deactivated': 'Your account has been deactivated',\n 'auth.logout.success': 'Logged out successfully',\n 'auth.register.success': 'Account created successfully',\n 'auth.register.failed': 'Registration failed. Please try again.',\n 'auth.refresh.success': 'Token refreshed successfully',\n 'auth.me.success': 'User info retrieved successfully',\n 'auth.select.success': 'Company selected successfully',\n 'auth.switch.company.success': 'Company switched successfully',\n 'auth.register.email.exists': 'Email already exists',\n 'auth.register.company.already.assigned': 'Company already assigned',\n 'auth.password.change.success': 'Password changed successfully',\n 'auth.password.change.invalid.current': 'Current password is incorrect',\n 'auth.password.change.current.required': 'Current password is required',\n 'auth.password.reset.email.sent': 'Password reset email sent',\n 'auth.password.reset.success': 'Password reset successfully',\n 'auth.token.too.large': 'Refresh token too large (≈{{size}} bytes)',\n 'auth.company.list.success': 'User companies retrieved successfully',\n 'auth.company.not.found': 'Company not found',\n 'auth.company.required': 'Company is required',\n 'auth.company.feature.not.enabled':\n 'This feature is not enabled for your company',\n 'auth.branch.list.success': 'Company branches retrieved successfully',\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.invalid': 'Invalid session. Please login again.',\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.reset.token.expired': 'Password reset token has expired',\n 'auth.password.reset.token.used':\n 'Password reset token has already been used',\n\n // EMAIL_VERIFICATION_MESSAGES (API keys)\n 'email.verification.sent': 'Verification email sent',\n 'email.verification.success': 'Email verified successfully',\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\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.by.ids.success': 'Users retrieved successfully by Ids',\n 'user.update.success': 'User updated successfully',\n 'user.update.many.success': '{{count}} users updated successfully',\n 'user.get.by.filter.success': 'Users retrieved successfully by filter',\n 'user.get.all.success': 'Users retrieved 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.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':\n 'Profile section data retrieved successfully',\n 'user.profile.section.update.success': 'Profile section updated successfully',\n 'user.profile.completion.success':\n '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 'user.lookup.success': 'Users retrieved 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.by.ids.success': 'Companies retrieved successfully by Ids',\n 'company.get.by.filter.success': 'Companies retrieved successfully by filter',\n 'company.update.success': 'Company updated successfully',\n 'company.update.many.success': '{{count}} companies updated successfully',\n 'company.get.all.success': 'Companies retrieved successfully',\n 'company.delete.success': 'Company deleted successfully',\n 'company.restore.success': 'Company restored successfully',\n 'company.readonly.delete.forbidden': 'Cannot delete readonly company(ies): {{names}}',\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.by.ids.success': 'Branches retrieved successfully by Ids',\n 'branch.get.by.filter.success': 'Branches retrieved successfully by filter',\n 'branch.update.success': 'Branch updated successfully',\n 'branch.update.many.success': '{{count}} branches updated successfully',\n 'branch.get.all.success': 'Branches retrieved successfully',\n 'branch.delete.success': 'Branch deleted successfully',\n 'branch.restore.success': 'Branch restored successfully',\n 'branch.readonly.delete.forbidden': 'Cannot delete readonly branch(es): {{names}}',\n\n // USER_PERMISSION_MESSAGES (API keys)\n 'user.permission.company.list.success':\n 'User companies retrieved successfully',\n 'user.permission.branch.list.success': 'User branches retrieved successfully',\n 'user.permission.batch.success':\n '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 // === UI KEYS — AUTH DOMAIN (AUTH_ROUTES: login, register, forgot-password, reset-password, verify-email) ===\n\n // pages/login/login-page.component.ts\n 'auth.login.welcome': 'Welcome!',\n 'auth.login.welcome.back': 'Welcome back, {{name}}!',\n 'auth.login.sign.in.to.continue': 'Sign in to continue to your account',\n 'auth.email.label': 'Email Address',\n 'auth.email.placeholder': 'Enter email address',\n 'auth.password.label': 'Password',\n 'auth.password.placeholder': 'Enter your password',\n 'auth.field.remember.me': 'Remember me',\n 'auth.password.forgot': 'Forgot Password?',\n 'auth.login.sign.in': 'Sign In',\n 'auth.login.no.account': \"Don't have an account?\",\n 'auth.login.sign.up': 'Sign Up',\n 'auth.login.verify.email.message': 'Please verify your email !',\n 'auth.verify.resend': 'Resend Verification Email',\n 'auth.login.back.to.sign.in': 'Back to Sign In',\n 'auth.login.select.company': 'Select Company',\n 'auth.login.select.company.message':\n 'Please select a company and branch to continue',\n 'auth.login.select.company.option': 'Select a company',\n 'auth.login.branch.label': 'Branch',\n 'auth.login.select.branch.option': 'Select a branch',\n 'auth.login.remember.selection': 'Remember my selection',\n 'auth.validation.password.min.length':\n 'Password must be at least 8 characters',\n 'auth.validation.email.required': 'Email is required',\n 'auth.validation.password.required': 'Password is required',\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':\n 'Password must contain at least one uppercase letter',\n 'auth.validation.password.require.lowercase':\n 'Password must contain at least one lowercase letter',\n 'auth.validation.password.require.number':\n 'Password must contain at least one number',\n 'auth.validation.password.require.special':\n 'Password must contain at least one special character',\n 'auth.validation.company.required': 'Please select a company',\n 'auth.validation.branch.required': 'Please select a branch',\n 'auth.login.title': 'Login',\n 'auth.session.expired': 'Your session has expired. Please login again.',\n\n // pages/forgot-password/forgot-password-page.component.ts\n 'auth.forgot.password.title': 'Forgot Password',\n 'auth.forgot.password.subtitle':\n 'Enter your email address and we will send you a reset link.',\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':\n '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 // pages/register/register-page.component.ts\n 'auth.register.create.account': 'Create Account',\n 'auth.register.subtitle': 'Fill in your details to create an account.',\n 'auth.register.full.name': 'Full Name',\n 'auth.register.name.placeholder': 'Enter your full name',\n 'auth.phone.label': 'Phone Number',\n 'auth.phone.placeholder': 'Enter phone number',\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.company.details': 'Company Details',\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.company.code': 'Company Code',\n 'auth.register.preconfigured.company': 'Pre-configured Company',\n 'auth.register.company.code.placeholder': 'Enter company code',\n 'auth.register.enter.company.code': 'Enter company code to join',\n 'auth.register.branch.code': 'Branch Code',\n 'auth.register.preconfigured.branch': 'Pre-configured Branch',\n 'auth.register.branch.code.placeholder': 'Enter branch code',\n 'auth.register.company.name': 'Company Name',\n 'auth.register.company.name.placeholder': 'Enter company name',\n 'auth.address.label': 'Address',\n 'auth.address.placeholder': 'Enter address',\n 'auth.register.already.have.account': 'Already have an account?',\n 'auth.validation.name.min.length': 'Name must be at least {{min}} characters',\n 'auth.validation.confirm.password.required': 'Please confirm your password',\n\n // pages/verify-email/verify-email-page.component.ts\n 'auth.verify.email.verifying': 'Verifying Email',\n 'auth.verify.email.please.wait':\n 'Please wait while we verify your email address...',\n 'auth.verify.email.success': 'Email Verified',\n 'auth.verify.email.success.message':\n 'Your email has been verified successfully. You can now login to your account.',\n 'auth.verify.email.failed': 'Verification Failed',\n 'auth.verify.email.invalid.link':\n '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':\n 'Enter your email to receive a new verification link.',\n 'auth.verify.email.resend': 'Resend Email',\n 'auth.verify.email.sent': 'Verification email sent. Please check your inbox.',\n\n // pages/reset-password/reset-password-page.component.ts\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':\n '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':\n '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':\n 'This password reset link is invalid or has expired.',\n 'auth.reset.password.request.new.link': 'Request New Link',\n\n // === UI KEYS — PROFILE DOMAIN (PROFILE_ROUTES) ===\n\n // pages/profile/profile-page.component.ts\n 'profile.title': 'Profile',\n 'profile.subtitle': 'Manage your account settings and preferences.',\n 'profile.storage.not.enabled':\n 'Profile picture upload is not available. Storage service is not configured.',\n 'profile.name.label': 'Full Name',\n 'profile.name.placeholder': 'Enter your full name',\n 'profile.phone.label': 'Phone',\n 'profile.phone.placeholder': 'Enter phone number',\n 'profile.additional.info': 'Additional Information',\n 'profile.employment.info': 'Employment Information',\n 'profile.managed.by.admin': 'This field is managed by an administrator.',\n 'profile.security': 'Security',\n 'profile.current.password': 'Current Password',\n 'profile.current.password.placeholder': 'Enter current password',\n 'profile.new.password': 'New Password',\n 'profile.confirm.password': 'Confirm New Password',\n 'profile.confirm.password.placeholder': 'Confirm new password',\n 'profile.change.password': 'Change Password',\n 'profile.company.branch': 'Company & Branch',\n 'profile.branch.label': 'Branch',\n 'profile.actions.label': 'Direct Actions',\n 'profile.actions.none.assigned': 'No actions assigned',\n 'profile.permissions.label': 'My Permissions',\n 'profile.roles.label': 'Roles',\n 'profile.roles.none.assigned': 'No roles assigned',\n\n // === UI KEYS — ADMINISTRATIVE DOMAIN (ADMINISTRATION_ROUTES: users, company, branch) ===\n\n // components/user-company-permission-dialog.component.ts\n 'administrative.permission.manage.company': 'Manage Company Permissions',\n 'administrative.permission.user': 'User',\n 'administrative.company.no.companies': 'No companies found',\n\n // components/user-branch-permission-dialog.component.ts\n 'administrative.permission.manage.branch': 'Manage Branch Permissions',\n 'administrative.company.select': 'Select Company',\n 'administrative.permission.no.company':\n 'This user has no company permissions assigned.',\n 'administrative.permission.assign.company.first':\n 'Assign company permissions first before managing branch access.',\n 'administrative.permission.select.company.for.branches':\n 'Please select a company to view branches.',\n 'administrative.branch.no.branches': 'No branches found',\n\n // pages/administration/administration-page.component.ts\n 'administrative.title': 'Administration',\n 'administrative.subtitle': 'Manage users, companies, and branches',\n 'administrative.user.title': 'Users',\n 'administrative.company.title': 'Companies',\n 'administrative.branch.title': 'Branches',\n\n // pages/branch/branch-form.component.ts\n 'administrative.branch.new': 'New Branch',\n 'administrative.branch.edit': 'Edit Branch',\n 'administrative.branch.name': 'Branch Name',\n 'administrative.branch.name.placeholder': 'Enter branch name',\n 'administrative.branch.slug': 'Branch Slug',\n 'administrative.branch.slug.placeholder': 'Enter branch slug',\n 'administrative.email.label': 'Email',\n 'administrative.email.placeholder': 'Enter email address',\n 'administrative.phone.label': 'Phone',\n 'administrative.phone.placeholder': 'Enter phone number',\n 'administrative.address.label': 'Address',\n 'administrative.address.placeholder': 'Enter address',\n 'administrative.branch.slug.required': 'Branch slug is required',\n\n // pages/branch/branch-list.component.ts\n 'administrative.branch.add': 'Add Branch',\n 'administrative.branch.select.company.first': 'Please select a company first',\n 'administrative.branch.delete.title': 'Delete Branch',\n\n // pages/company/company-form.component.ts\n 'administrative.company.edit': 'Edit Company',\n 'administrative.company.new': 'New Company',\n 'administrative.company.name': 'Company Name',\n 'administrative.company.name.placeholder': 'Enter company name',\n 'administrative.company.slug': 'Company Slug',\n 'administrative.company.slug.placeholder': 'Enter company slug',\n 'administrative.company.website': 'Website',\n 'administrative.company.website.placeholder': 'Enter website URL',\n 'administrative.company.slug.required': 'Company slug is required',\n\n // pages/company/company-list.component.ts\n 'administrative.company.add': 'Add Company',\n 'administrative.branch.view.branches': 'View Branches',\n 'administrative.company.delete.title': 'Delete Company',\n\n // pages/users/user-form.component.ts\n 'administrative.user.edit': 'Edit User',\n 'administrative.user.new': 'New User',\n 'administrative.user.name': 'Name',\n 'administrative.user.name.placeholder': 'Enter full name',\n 'administrative.user.password': 'Password',\n 'administrative.user.password.optional': '(leave blank to keep current)',\n 'administrative.user.password.placeholder': 'Enter password',\n 'administrative.user.email.verified': 'Email Verified',\n 'administrative.user.auto.assign.to':\n 'New user will be automatically assigned to',\n\n // pages/users/user-list.component.ts\n 'administrative.user.add': 'Add User',\n 'administrative.permission.company.permissions': 'Company Permissions',\n 'administrative.permission.branch.permissions': 'Branch Permissions',\n 'administrative.user.no.users': 'No users found',\n 'administrative.user.details': 'User Details',\n 'administrative.user.delete.title': 'Delete User',\n};\n","import { inject } from '@angular/core';\nimport { Routes } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n BRANCH_PERMISSIONS,\n COMPANY_PERMISSIONS,\n PermissionValidatorService,\n permissionGuard,\n resolveTranslationModule,\n SHARED_MESSAGES,\n USER_PERMISSIONS,\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 * Resolves which administration tab the current user should land on when\n * navigating to the bare `/administration` route. Mirrors the tab\n * visibility order in AdministrationPageComponent.visibleTabs so the\n * redirect never points at a tab the user can't actually see.\n */\nfunction resolveAdministrationDefaultTab(): string {\n const permissionValidator = inject(PermissionValidatorService);\n const companyFeatureEnabled = isCompanyFeatureEnabled(inject(APP_CONFIG));\n\n if (permissionValidator.hasPermission(USER_PERMISSIONS.READ)) {\n return 'users';\n }\n\n if (\n companyFeatureEnabled &&\n permissionValidator.hasPermission(COMPANY_PERMISSIONS.READ)\n ) {\n return 'company';\n }\n\n if (\n companyFeatureEnabled &&\n permissionValidator.hasPermission(BRANCH_PERMISSIONS.READ)\n ) {\n return 'branch';\n }\n\n return 'users';\n}\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: {\n translations: resolveTranslationModule({\n modules: ['auth', 'shared'],\n fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\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: {\n translations: resolveTranslationModule({\n modules: ['auth', 'administrative'],\n fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\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: [\n companyFeatureGuard,\n permissionGuard(COMPANY_PERMISSIONS.READ),\n ],\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: [\n companyFeatureGuard,\n permissionGuard(BRANCH_PERMISSIONS.READ),\n ],\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 the first tab the user has permission to see\n {\n path: '',\n redirectTo: () => resolveAdministrationDefaultTab(),\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: {\n translations: resolveTranslationModule({\n modules: ['auth', 'profile'],\n fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\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 getMyCompanies(): Observable<ICompanyInfo[]> {\n return this.authApi.getCompanies().pipe(\n map((response) =>\n (response.data || []).map((company) => ({\n id: company.id,\n name: company.name,\n slug: company.slug ?? '',\n imageId: company.logoId ?? '',\n })),\n ),\n );\n }\n\n getMyCompanyBranches(companyId: string): Observable<IBranchInfo[]> {\n return this.authApi.getCompanyBranches(companyId).pipe(\n map((response) =>\n (response.data || []).map((branch) => ({\n id: branch.id,\n name: branch.name,\n slug: branch.slug ?? '',\n imageId: branch.logoId ?? undefined,\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 IUserBranchPermission,\n IUserCompanyInfo,\n IUserPermissionProvider,\n IUserProvider,\n} from '@flusys/ng-shared';\nimport { from, 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 isActive?: boolean;\n [key: string]: any;\n }): Observable<IListResponse<IUserBasicInfo>> {\n const { search, page, pageSize, isActive, ...extraFilters } = filter || {};\n\n const apiFilter = {\n pagination: {\n currentPage: page ?? 0,\n pageSize: pageSize ?? 50,\n },\n filter: {\n ...(isActive !== undefined && { isActive }),\n\n // ✅ include all additional dynamic filters\n ...Object.fromEntries(\n Object.entries(extraFilters).filter(\n ([_, v]) => v !== undefined && v !== null,\n ),\n ),\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.userApi.lookup(apiFilter, search ?? '').pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n messageKey: response.messageKey,\n messageVariables: response.messageVariables,\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 from(this.companyApi.getAll(apiFilter, filter?.search ?? '')).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n messageKey: response.messageKey,\n messageVariables: response.messageVariables,\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<IUserBranchPermission[]>> {\n return this.userPermissionApi.getUserBranches(\n userId,\n companyId,\n ) as Observable<ISingleResponse<IUserBranchPermission[]>>;\n }\n\n getUserCompanyPermissions(userId: string): Observable<ISingleResponse<IUserCompanyInfo[]>> {\n return this.userPermissionApi.getUserCompanies(userId).pipe(\n map((response) => ({\n ...response,\n data: (response.data ?? []).map((c) => ({ id: c.companyId, name: c.companyName })),\n })),\n );\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 { InjectionToken, Injector, TemplateRef, Type } from '@angular/core';\nimport { ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\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 =\n new InjectionToken<IRegistrationFieldTemplateContext>(\n 'REGISTRATION_FIELD_CONTEXT',\n );\n\nexport interface IRegistrationExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type:\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'date'\n | '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?(\n data: Record<string, unknown>,\n ): Record<string, unknown>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_REGISTRATION_EXTENSION =\n 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 =\n new InjectionToken<IUserListExtensionProvider>('AUTH_USER_LIST_EXTENSION');\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 =\n new InjectionToken<IProfileFieldTemplateContext>('PROFILE_FIELD_CONTEXT');\n\nexport interface IProfileExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type:\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'date'\n | '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?(\n userId: string,\n data: Record<string, unknown>,\n ): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_PROFILE_EXTENSION =\n new InjectionToken<IProfileExtensionProvider>('AUTH_PROFILE_EXTENSION');\n\nexport interface IUserFormFieldTemplateContext {\n field: IUserFormExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const USER_FORM_FIELD_CONTEXT =\n new InjectionToken<IUserFormFieldTemplateContext>('USER_FORM_FIELD_CONTEXT');\n\nexport interface IUserFormExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type:\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'date'\n | '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?(\n userId: string,\n data: Record<string, unknown>,\n ): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_USER_FORM_EXTENSION =\n new InjectionToken<IUserFormExtensionProvider>('AUTH_USER_FORM_EXTENSION');\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 =\n new InjectionToken<IUserDetailViewConfig>('AUTH_USER_DETAIL_CONFIG');\n\nexport function validatePassword(\n password: string,\n config: IPasswordValidationConfig,\n): 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 (\n config.requireSpecialChars &&\n !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)\n ) {\n return config.message ?? 'auth.validation.password.require.special';\n }\n }\n\n return null;\n}\n\nexport function validateEmail(\n email: string,\n config?: IEmailValidationConfig,\n): string | null {\n const pattern = config?.pattern ?? /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const message = config?.message ?? 'shared.invalid.email';\n\n if (!pattern.test(email)) return message;\n return null;\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n BRANCH_PERMISSIONS,\n COMPANY_PERMISSIONS,\n PermissionValidatorService,\n RouterTabItem,\n RouterTabsComponent,\n TranslatePipe,\n TranslateService,\n USER_PERMISSIONS,\n} from '@flusys/ng-shared';\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: [RouterOutlet, TranslatePipe, RouterTabsComponent],\n template: `\n <div class=\"p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">{{ 'administrative.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1\">{{ 'administrative.subtitle' | translate }}</p>\n </div>\n\n <lib-router-tabs [tabs]=\"visibleTabs()\" class=\"mb-4\" />\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 private readonly translateService = inject(TranslateService);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'users',\n labelKey: 'administrative.user.title',\n icon: 'users',\n route: 'users',\n permission: USER_PERMISSIONS.READ,\n },\n {\n id: 'companies',\n labelKey: 'administrative.company.title',\n icon: 'building',\n route: 'company',\n permission: COMPANY_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n {\n id: 'branches',\n labelKey: 'administrative.branch.title',\n icon: '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<RouterTabItem[]>(() => {\n return this.allTabs\n .filter((tab) => {\n const hasCompanyFeature = !tab.requiresCompanyFeature || this.companyFeatureEnabled();\n const hasPermission = this.permissionValidator.hasPermission(tab.permission);\n return hasCompanyFeature && hasPermission;\n })\n .map((tab) => ({\n id: tab.id,\n label: this.translateService.translate(tab.labelKey),\n icon: tab.icon,\n route: tab.route,\n }));\n });\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\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, UiModule, FormField, TranslatePipe],\n template: `\n <f-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 {{\n isEditMode()\n ? ('administrative.branch.edit' | translate)\n : ('administrative.branch.new' | translate)\n }}\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\"\n >{{ 'shared.company' | translate }} *</label\n >\n <f-select\n inputId=\"companyId\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"branchForm.companyId\"\n [placeholder]=\"'administrative.company.select' | translate\"\n />\n </div>\n }\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'administrative.branch.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"branchForm.name\"\n (blur)=\"generateSlug()\"\n [placeholder]=\"'administrative.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\"\n >{{ 'administrative.branch.slug' | translate }} *</label\n >\n <input\n fInputText\n id=\"slug\"\n [formField]=\"branchForm.slug\"\n [placeholder]=\"'administrative.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\">{{\n 'administrative.email.label' | translate\n }}</label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"branchForm.email\"\n [placeholder]=\"'administrative.email.placeholder' | translate\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{\n 'administrative.phone.label' | translate\n }}</label>\n <input\n fInputText\n id=\"phone\"\n [formField]=\"branchForm.phone\"\n [placeholder]=\"'administrative.phone.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <f-checkbox [formField]=\"branchForm.isActive\" [label]=\"'shared.active' | translate\" />\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">{{\n 'administrative.address.label' | translate\n }}</label>\n <textarea\n id=\"address\"\n fInputText\n [formField]=\"branchForm.address\"\n [placeholder]=\"'administrative.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 <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private translate(key: string, vars?: Record<string, unknown>): 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, {\n message: this.translate('auth.validation.company.required'),\n });\n required(f.name, { message: this.translate('shared.name.required') });\n required(f.slug, {\n message: this.translate('administrative.branch.slug.required'),\n });\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.findById(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.required.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 const response = await this.branchService.update(updateData);\n this.onSaveSuccess(\n response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, unknown>,\n )\n : response.message,\n );\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 const response = await this.branchService.insert(createData);\n this.onSaveSuccess(\n response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n );\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({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: message,\n });\n }\n\n private getTargetCompanyId(): string | null {\n return (\n this.existingBranch()?.companyId || this.formModel().companyId || null\n );\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 {\n AngularModule,\n BRANCH_PERMISSIONS,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { IBranch } 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@Component({\n selector: 'lib-branch-list',\n imports: [AngularModule, UiModule, HasPermissionDirective, TranslatePipe],\n template: `\n <f-card>\n <ng-template #header>\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\"\n >\n <div\n class=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\"\n >\n <h2 class=\"text-xl font-semibold m-0\">\n {{ 'administrative.branch.title' | translate }}\n </h2>\n @if (companies().length > 1) {\n <f-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"\n selectedCompanyId.set($event); onCompanyChange()\n \"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administrative.company.select' | translate\"\n styleClass=\"w-full sm:w-64\"\n />\n }\n </div>\n <button\n fButton\n *hasPermission=\"BRANCH_PERMISSIONS.CREATE\"\n [disabled]=\"!selectedCompanyId()\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'administrative.branch.add' | translate\n }}</span>\n </button>\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <f-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 >\n <ng-template #header>\n <tr>\n <th>{{ 'administrative.branch.name' | translate }}</th>\n <th>{{ 'administrative.branch.slug' | translate }}</th>\n <th>{{ 'administrative.email.label' | translate }}</th>\n <th>{{ 'administrative.phone.label' | 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 <f-tag\n [value]=\"\n branch.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"branch.isActive ? 'success' : 'danger'\"\n />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <button\n fButton\n *hasPermission=\"BRANCH_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(branch)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (!branch.readOnly) {\n <button\n fButton\n *hasPermission=\"BRANCH_PERMISSIONS.DELETE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(branch)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\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 {{ 'administrative.branch.select.company.first' | translate }}\n } @else {\n {{ 'administrative.branch.no.branches' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private translate(key: string, vars?: Record<string, unknown>): 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 this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n const queryCompanyId = params?.get('companyId') || null;\n const currentCompanyId = this.authState.company()?.id;\n const companyId = queryCompanyId || currentCompanyId || null;\n\n this.selectedCompanyId.set(companyId);\n\n if (companyId) {\n this.loadBranches();\n }\n });\n });\n }\n\n loadBranches(page = 0, pageSize = 10): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.branchService.fetchList('', {\n filter: { companyId },\n pagination: { currentPage: page, pageSize },\n });\n }\n\n onCompanyChange(): void {\n this.loadBranches();\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 this.loadBranches(Math.floor(first / rows), rows);\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', {\n name: branch.name,\n }),\n header: this.translate('administrative.branch.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.branchService.delete({\n id: branch.id,\n type: 'permanent',\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, unknown>,\n )\n : response?.message,\n });\n this.branchService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { Component, computed, inject, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n BaseFormComponent,\n IFormField,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n@Component({\n selector: 'lib-company-form',\n imports: [BaseFormComponent, TranslatePipe],\n template: `\n <lib-base-form\n [fields]=\"fields\"\n [service]=\"companyService\"\n [editId]=\"editId()\"\n [cancelRoute]=\"'/administration/company'\"\n [navigateOnSuccess]=\"'/administration/company'\"\n [createTitle]=\"'administrative.company.new' | translate\"\n [editTitle]=\"'administrative.company.edit' | translate\"\n [mapToRequest]=\"buildRequest\"\n [mapFromEntity]=\"toFormModel\"\n (onValueChange)=\"onFormValueChange($event)\"\n />\n `,\n})\nexport class CompanyFormComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly translateAdapter = inject(TranslateService, { optional: true });\n\n readonly companyService = inject(CompanyApiService);\n readonly formRef = viewChild(BaseFormComponent);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n\n readonly editId = computed(() => {\n const id = this.routeParams()?.get('id');\n return id && id !== 'new' ? id : null;\n });\n\n readonly fields: IFormField[] = [\n {\n key: 'name',\n type: 'text',\n label: this.t('administrative.company.name'),\n placeholder: this.t('administrative.company.name.placeholder'),\n required: true,\n },\n {\n key: 'slug',\n type: 'text',\n label: this.t('administrative.company.slug'),\n placeholder: this.t('administrative.company.slug.placeholder'),\n required: true,\n },\n {\n key: 'email',\n type: 'email',\n label: this.t('administrative.email.label'),\n placeholder: this.t('administrative.email.placeholder'),\n },\n {\n key: 'phone',\n type: 'text',\n label: this.t('administrative.phone.label'),\n placeholder: this.t('administrative.phone.placeholder'),\n },\n {\n key: 'website',\n type: 'text',\n label: this.t('administrative.company.website'),\n placeholder: this.t('administrative.company.website.placeholder'),\n },\n {\n key: 'isActive',\n type: 'toggle',\n label: this.t('shared.active'),\n },\n {\n key: 'address',\n type: 'textarea',\n label: this.t('administrative.address.label'),\n placeholder: this.t('administrative.address.placeholder'),\n fullWidth: true,\n rows: 3,\n },\n ];\n\n readonly buildRequest = (data: Record<string, unknown>, editId: string | null): unknown => ({\n ...(editId ? { id: editId } : {}),\n name: data['name'] as string,\n slug: data['slug'] as string,\n email: (data['email'] as string) || undefined,\n phone: (data['phone'] as string) || undefined,\n website: (data['website'] as string) || undefined,\n address: (data['address'] as string) || undefined,\n isActive: data['isActive'] as boolean,\n });\n\n readonly toFormModel = (entity: unknown): Record<string, unknown> => {\n const c = entity as ICompany;\n return {\n name: c.name,\n slug: c.slug,\n email: c.email ?? '',\n phone: c.phone ?? '',\n website: c.website ?? '',\n address: c.address ?? '',\n isActive: c.isActive,\n };\n };\n\n onFormValueChange(data: Record<string, unknown>): void {\n const name = (data['name'] as string) ?? '';\n const slug = (data['slug'] as string) ?? '';\n if (name && !slug) {\n this.formRef()?.setFieldValue(\n 'slug',\n name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''),\n );\n }\n }\n\n private t(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n BaseListComponent,\n BaseListTemplateDirective,\n BRANCH_PERMISSIONS,\n COMPANY_PERMISSIONS,\n ITableAction,\n ITableColumn,\n PermissionValidatorService,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n@Component({\n selector: 'lib-company-list',\n imports: [\n BaseListComponent,\n BaseListTemplateDirective,\n UiModule,\n TranslatePipe,\n ],\n template: `\n <lib-base-list\n [columns]=\"columns\"\n [actions]=\"viewBranchesAction\"\n [service]=\"companyService\"\n [title]=\"'administrative.company.title' | translate\"\n [showCreateButton]=\"canCreate()\"\n [createButtonLabel]=\"'administrative.company.add' | translate\"\n [createRoute]=\"'/administration/company/new'\"\n [editRoute]=\"'/administration/company'\"\n [deleteConfirmField]=\"'name'\"\n [deleteType]=\"'permanent'\"\n [canEdit]=\"canEditFn\"\n [canDelete]=\"canDeleteFn\"\n >\n <ng-template baseListTemplate=\"isActive\" let-item>\n <f-tag\n [value]=\"\n asCompany(item).isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"asCompany(item).isActive ? 'success' : 'danger'\"\n />\n </ng-template>\n </lib-base-list>\n `,\n})\nexport class CompanyListComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly router = inject(Router);\n\n readonly companyService = inject(CompanyApiService);\n\n readonly canCreate = computed(() =>\n this.permissionValidator.hasPermission(COMPANY_PERMISSIONS.CREATE),\n );\n readonly canEditFn = (_item: unknown) =>\n this.permissionValidator.hasPermission(COMPANY_PERMISSIONS.UPDATE);\n readonly canDeleteFn = (item: unknown) =>\n !(item as ICompany).readOnly &&\n this.permissionValidator.hasPermission(COMPANY_PERMISSIONS.DELETE);\n\n readonly viewBranchesAction: ITableAction[] = [\n {\n icon: 'building',\n tooltip: 'administrative.branch.view.branches',\n severity: 'secondary',\n show: () =>\n this.permissionValidator.hasPermission(BRANCH_PERMISSIONS.READ),\n handler: (c) =>\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId: (c as ICompany).id },\n }),\n },\n ];\n\n readonly columns: ITableColumn[] = [\n {\n field: 'name',\n header: this.t('administrative.company.name'),\n type: 'text',\n },\n {\n field: 'slug',\n header: this.t('administrative.company.slug'),\n type: 'text',\n },\n {\n field: 'email',\n header: this.t('administrative.email.label'),\n type: 'text',\n },\n {\n field: 'phone',\n header: this.t('administrative.phone.label'),\n type: 'text',\n },\n { field: 'isActive', header: this.t('shared.status'), type: 'custom' },\n ];\n\n asCompany(item: unknown): ICompany {\n return item as ICompany;\n }\n\n private t(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n required,\n} from '@angular/forms/signals';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, tap } from 'rxjs';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface IForgotPasswordFormModel {\n email: string;\n}\n\n@Component({\n selector: 'lib-forgot-password-page',\n imports: [\n AngularModule,\n UiModule,\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(--f-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(--f-content-border-radius); background: var(--f-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\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full mb-6\"\n [formField]=\"forgotForm.email\"\n autocomplete=\"email\"\n />\n\n <button\n fButton\n class=\"w-full mb-4\"\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.forgot.password.send.reset.link' | translate }}</span>\n </button>\n\n <div class=\"flex items-center justify-center gap-2\">\n <span class=\"font-medium\">{{\n 'auth.forgot.password.remember.password' | translate\n }}</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 } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"envelope\" class=\"text-6xl text-primary\"></ui-icon>\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 {{\n 'auth.forgot.password.email.sent.to'\n | translate: { email: submittedEmail() }\n }}\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 >\n {{ 'auth.forgot.password.try.again' | translate }} </span\n >.\n </p>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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(TranslateService, {\n optional: true,\n });\n\n private translate(key: string, vars?: Record<string, string>): 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, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, {\n message: this.translate('shared.invalid.email'),\n });\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({\n next: () => this.showEmailSent(email),\n }),\n finalize(() => this.isLoading.set(false)),\n )\n .subscribe({ error: () => {} });\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 isServiceEnabled,\n isSignUpEnabled,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n ISelectRequest,\n isEmailVerificationRequired,\n isLoginResponse,\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';\nimport { UiModule } from '@flusys/ng-ui';\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: [UiModule, AngularModule,\n FormField,\n AppFloatingConfigurator,\n TranslatePipe,],\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(--f-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(--f-content-border-radius); background: var(--f-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.dark:bg-surface-700]=\"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 dark:bg-surface-700\"></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.dark:bg-surface-700]=\"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 @if (savedUserName()) {\n {{\n 'auth.login.welcome.back'\n | translate: { name: savedUserName()! }\n }}\n } @else {\n {{ 'auth.login.welcome' | translate }}\n }\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.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full\"\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.password.label' | translate }}\n </label>\n <div class=\"mb-4\">\n <f-password\n [inputId]=\"'password'\"\n [placeholder]=\"'auth.password.placeholder' | translate\"\n class=\"w-full\"\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 <f-checkbox [formField]=\"loginForm.rememberMe\" [label]=\"'auth.field.remember.me' | translate\" />\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.password.forgot' | translate }}\n </span>\n }\n </div>\n\n <button\n fButton\n class=\"w-full\"\n type=\"submit\"\n [disabled]=\"!isLoginFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\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 <ui-icon name=\"envelope\" class=\"text-6xl text-warn\"></ui-icon>\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 {{ 'auth.login.verify.email.message' | translate }}\n </p>\n <button\n fButton\n class=\"w-full mb-4\"\n (click)=\"onResendVerification()\"\n [disabled]=\"isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.verify.resend' | translate }}</span>\n </button>\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 {{ 'auth.login.select.company.message' | translate }}\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 {{ 'shared.company' | translate }}\n </label>\n <f-select\n inputId=\"company\"\n class=\"w-full mb-4\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"selectionForm.companyId\"\n [placeholder]=\"'auth.login.select.company.option' | translate\"\n (onChange)=\"onCompanyChange()\"\n />\n\n <label\n for=\"branch\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.login.branch.label' | translate }}\n </label>\n <f-select\n inputId=\"branch\"\n class=\"w-full mb-4\"\n [options]=\"branches()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"selectionForm.branchId\"\n [placeholder]=\"'auth.login.select.branch.option' | translate\"\n />\n\n <div class=\"flex items-center mt-2 mb-8\">\n <f-checkbox\n [formField]=\"selectionForm.rememberSelection\"\n [label]=\"'auth.login.remember.selection' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <button\n fButton\n class=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (click)=\"goBackToCredentials()\"\n >\n <span pButtonLabel>{{ 'shared.back' | translate }}</span>\n </button>\n <button\n fButton\n class=\"w-full\"\n type=\"submit\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.continue' | translate }}</span>\n </button>\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(TranslateService, {\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 readonly savedUserName = signal(this.authState.getSavedUserName());\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', {\n min: this.passwordMinLength(),\n }),\n );\n\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, {\n message: this.translate('auth.validation.password.required'),\n });\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, {\n message: this.translate('auth.validation.company.required'),\n });\n required(f.branchId, {\n message: this.translate('auth.validation.branch.required'),\n });\n });\n\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly emailFeatureEnabled = computed(() =>\n isServiceEnabled(this.appConfig, 'email'),\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.required.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 if (!response.data) return;\n this.unverifiedEmail.set(response.data.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n if (!response.data) return;\n this.sessionId = response.data.sessionId;\n this.companies.set(response.data.companies);\n this.userName.set(\n response.data.user.name ?? response.data.user.email,\n );\n this.authState.setSelectionState(response.data);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else if (isLoginResponse(response)) {\n if (!response.data) return;\n this.authState.setLoginState(response.data);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : (response.message ?? this.translate('auth.login.success')),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n const messageKey = error?.error?.messageKey;\n const detail = messageKey\n ? this.translate(messageKey)\n : error?.error?.message;\n this.messageService.add({\n severity: 'error',\n summary: this.translate('auth.login.title'),\n detail,\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 if (!response.data) return;\n this.authState.setLoginState(response.data);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : response.message,\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.messageKey\n ? this.translate(response.messageKey)\n : response.message,\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 isServiceEnabled,\n} from '@flusys/ng-core';\nimport {\n AngularModule,\n FILE_PROVIDER,\n FileUploaderComponent,\n FileUrlService,\n HasPermissionDirective,\n IProfileActionInfo,\n IProfileRoleInfo,\n PROFILE_PERMISSION_PROVIDER,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService, UiModule } from '@flusys/ng-ui';\nimport { catchError, finalize, forkJoin, of } from 'rxjs';\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: [\n UiModule,\n AngularModule,\n FormField,\n FileUploaderComponent,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"mb-4 md:mb-6\">\n <h1 class=\"text-2xl font-bold text-color mb-2\">\n {{ 'profile.title' | translate }}\n </h1>\n <p class=\"text-muted-color\">{{ '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\n class=\"flex flex-col items-center gap-4 md:w-72 lg:w-80 md:border-r md:border-surface md:pr-6\"\n >\n @if (profilePictureUrl()) {\n <f-avatar\n [image]=\"profilePictureUrl()!\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28\"\n />\n } @else {\n <f-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 }\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 />\n } @else {\n <div class=\"w-full p-3 bg-emphasis rounded-lg text-center\">\n <ui-icon\n name=\"info-circle\"\n class=\"text-muted-color mr-2\"\n ></ui-icon>\n <span class=\"text-sm text-muted-color\">{{\n 'profile.storage.not.enabled' | translate\n }}</span>\n </div>\n }\n </div>\n\n <div class=\"flex-1 min-w-0\">\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\">{{\n 'auth.email.label' | translate\n }}</label>\n <input\n fInputText\n [value]=\"userEmail()\"\n disabled\n class=\"bg-(--f-form-field-filled-background)\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium text-color\"\n >{{ 'profile.name.label' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'profile.name.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium text-color\">{{\n 'profile.phone.label' | translate\n }}</label>\n <input\n fInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'profile.phone.placeholder' | translate\"\n />\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 <ui-icon name=\"pencil\" class=\"mr-2\"></ui-icon\n >{{ 'profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <f-skeleton height=\"2rem\" class=\"mb-2\" />\n <f-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.labelKey | translate: null : field.label\n }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"\n field.component;\n injector: getFieldInjector(field)\n \"\n />\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"\n getFieldTemplateContext(field)\n \"\n />\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"fieldTemplate\"\n [ngTemplateOutletContext]=\"{ field: field }\"\n />\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{\n extraFieldsValidationError()\n }}</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 <ui-icon name=\"eye\" class=\"mr-2\"></ui-icon\n >{{ 'profile.employment.info' | translate }}\n </div>\n <f-tag\n [value]=\"'profile.managed.by.admin' | translate\"\n severity=\"secondary\"\n />\n </div>\n @if (isLoadingExtraFields()) {\n <f-skeleton height=\"2rem\" class=\"mb-2\" />\n <f-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\">{{\n field.labelKey | translate: null : field.label\n }}</label>\n <span class=\"text-color font-medium\">\n @if (field.type === 'select') {\n {{\n getSelectLabel(\n field,\n getAdminFieldValue(field.key)\n )\n }}\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 fInputText\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"\n updateExtraField(field.key, $any($event.target).value)\n \"\n class=\"w-full\"\n />\n }\n @case ('number') {\n <input\n fInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\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 fTextarea\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"\n updateExtraField(field.key, $any($event.target).value)\n \"\n class=\"w-full\"\n rows=\"3\"\n ></textarea>\n }\n @case ('select') {\n <f-select\n [id]=\"field.key\"\n class=\"w-full\"\n [options]=\"field.options ?? []\"\n optionValue=\"value\"\n [disabled]=\"field.editable === false\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"updateExtraField(field.key, $event)\"\n [placeholder]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ?? ('shared.select' | translate)\n \"\n >\n <ng-template #item let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n <ng-template #selectedItem let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n </f-select>\n }\n @case ('checkbox') {\n <f-checkbox\n [inputId]=\"field.key\"\n [checked]=\"$any(getExtraFieldValue(field.key) ?? false)\"\n [disabled]=\"field.editable === false\"\n (onChange)=\"updateExtraField(field.key, $event.checked)\"\n [label]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n (field.labelKey | translate: null : field.label)\n \"\n />\n }\n @case ('date') {\n <input\n fInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"\n updateExtraField(field.key, $any($event.target).value)\n \"\n class=\"w-full\"\n />\n }\n }\n </ng-template>\n\n <div class=\"flex justify-end pt-4\">\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || !isFormDirty() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"check\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'shared.save.changes' | translate\n }}</span>\n </button>\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 <ui-icon name=\"lock\" class=\"text-primary\"></ui-icon>\n <span class=\"font-semibold text-color\">{{\n 'profile.security' | translate\n }}</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\"\n >{{ 'profile.current.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'currentPassword'\"\n name=\"currentPassword\"\n [ngModel]=\"passwordModel().currentPassword\"\n (ngModelChange)=\"updatePasswordField('currentPassword', $event)\"\n [placeholder]=\"'profile.current.password.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"current-password\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"newPassword\" class=\"font-medium text-color\"\n >{{ 'profile.new.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'newPassword'\"\n name=\"newPassword\"\n [ngModel]=\"passwordModel().newPassword\"\n (ngModelChange)=\"updatePasswordField('newPassword', $event)\"\n [placeholder]=\"'shared.min.characters' | translate: { count: 6 }\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"confirmPassword\" class=\"font-medium text-color\"\n >{{ 'profile.confirm.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'confirmPassword'\"\n name=\"confirmPassword\"\n [ngModel]=\"passwordModel().confirmPassword\"\n (ngModelChange)=\"updatePasswordField('confirmPassword', $event)\"\n [placeholder]=\"'profile.confirm.password.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch()) {\n <small class=\"text-danger\">{{\n 'auth.register.passwords.do.not.match' | translate\n }}</small>\n }\n </div>\n </div>\n\n <div class=\"flex justify-end\">\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isPasswordFormValid() || isPasswordLoading()\"\n >\n @if (isPasswordLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"key\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'profile.change.password' | translate\n }}</span>\n </button>\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 <ui-icon [name]=\"section.icon\" class=\"text-primary\"></ui-icon>\n }\n <span class=\"font-semibold text-color\">{{\n section.titleKey | translate: null : section.title\n }}</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 <ui-icon [name]=\"section.icon\" class=\"text-primary\"></ui-icon>\n }\n <span class=\"font-semibold text-color\">{{\n section.titleKey | translate: null : section.title\n }}</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 <ui-icon name=\"building\" class=\"text-primary\"></ui-icon>\n <span class=\"font-semibold text-color\">{{\n 'profile.company.branch' | translate\n }}</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\n class=\"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0\"\n >\n <ui-icon name=\"briefcase\" class=\"text-primary\"></ui-icon>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">\n {{ 'shared.company' | translate }}\n </div>\n <div class=\"font-medium text-color\">\n {{ companyName() || ('shared.not.assigned' | translate) }}\n </div>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <div\n class=\"w-10 h-10 rounded-lg bg-success/10 flex items-center justify-center flex-shrink-0\"\n >\n <ui-icon name=\"map-marker\" class=\"text-success\"></ui-icon>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">\n {{ 'profile.branch.label' | translate }}\n </div>\n <div class=\"font-medium text-color\">\n {{ branchName() || ('shared.not.assigned' | translate) }}\n </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 <ui-icon name=\"shield\" class=\"text-primary\"></ui-icon>\n <span class=\"font-semibold text-color\">{{\n 'profile.permissions.label' | translate\n }}</span>\n </div>\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"secondary\"\n />\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n @if (showRoles()) {\n <div>\n <div\n class=\"text-sm text-muted-color mb-2 flex items-center gap-2\"\n >\n <ui-icon name=\"users\"></ui-icon>\n {{ 'profile.roles.label' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <f-skeleton height=\"1.5rem\" class=\"mb-2\" />\n } @else if (userRoles().length === 0) {\n <span class=\"text-muted-color text-sm\">{{\n 'profile.roles.none.assigned' | translate\n }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (role of userRoles(); track role.id) {\n <f-tag [value]=\"role.name\" severity=\"info\" />\n }\n </div>\n }\n </div>\n }\n\n @if (showActions()) {\n <div>\n <div\n class=\"text-sm text-muted-color mb-2 flex items-center gap-2\"\n >\n <ui-icon name=\"bolt\"></ui-icon>\n {{ 'profile.actions.label' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <f-skeleton height=\"1.5rem\" class=\"mb-2\" />\n } @else if (userActions().length === 0) {\n <span class=\"text-muted-color text-sm\">{{\n 'profile.actions.none.assigned' | translate\n }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (action of userActions(); track action.id) {\n <f-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, {\n optional: true,\n });\n private readonly profileExtension = inject(AUTH_PROFILE_EXTENSION, {\n optional: true,\n });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, {\n optional: true,\n });\n private readonly translateAdapter = inject(TranslateService, {\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 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 () =>\n this.extraSections().length > 0 ||\n this.editableFields().length > 0 ||\n 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\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n });\n readonly companyName = computed(() => this.authState.companyName());\n readonly branchName = computed(() => this.authState.branchName());\n\n readonly showUploadSection = computed(\n () =>\n isServiceEnabled(this.appConfig, 'storage') && this.fileProvider !== null,\n );\n readonly showCompanySection = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly showPermissionsSection = computed(\n () =>\n isServiceEnabled(this.appConfig, 'iam') &&\n 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(\n () => this.showCompanySection() || this.showPermissionsSection(),\n );\n\n private readonly originalFormModel = signal<IProfileFormModel>({\n name: '',\n phone: '',\n });\n readonly formModel = signal<IProfileFormModel>({ name: '', phone: '' });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.name.required'),\n });\n });\n\n readonly isFormValid = computed(\n () => this.formModel().name.trim().length > 0,\n );\n\n readonly isFormDirty = computed(() => {\n const current = this.formModel();\n const original = this.originalFormModel();\n const basicDirty =\n 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(\n field: IProfileExtraField | IUserFormExtraField,\n value: unknown,\n ): 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(\n field: IProfileExtraField,\n ): 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 private readonly fieldInjectors = new Map<\n string,\n { injector: Injector; setField: (field: IProfileExtraField) => void }\n >();\n\n getFieldInjector(field: IProfileExtraField): Injector {\n const cached = this.fieldInjectors.get(field.key);\n if (cached) {\n cached.setField(field);\n return cached.injector;\n }\n\n let currentField = field;\n const extraFieldsModel = this.extraFieldsModel;\n const context: IProfileFieldTemplateContext = {\n get field() {\n return currentField;\n },\n get value() {\n return extraFieldsModel()[currentField.key];\n },\n updateValue: (value: unknown) =>\n this.updateExtraField(currentField.key, value),\n };\n\n const injector = Injector.create({\n providers: [{ provide: PROFILE_FIELD_CONTEXT, useValue: context }],\n parent: field.injector ?? this.parentInjector,\n });\n this.fieldInjectors.set(field.key, {\n injector,\n setField: (next) => (currentField = next),\n });\n return injector;\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 (\n model.currentPassword.length > 0 &&\n model.newPassword.length >= 6 &&\n model.newPassword === model.confirmPassword\n );\n });\n\n readonly passwordsMatch = computed(() => {\n const model = this.passwordModel();\n return (\n model.confirmPassword.length === 0 ||\n model.newPassword === model.confirmPassword\n );\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 = {\n name: user.name ?? '',\n phone: user.phone ?? '',\n };\n this.originalFormModel.set(initialValues);\n this.formModel.set(initialValues);\n\n if (\n user.profilePictureId &&\n isServiceEnabled(this.appConfig, 'storage')\n ) {\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\n .getUserRoles(user.id, branch?.id)\n .pipe(catchError(() => of({ data: [] as IProfileRoleInfo[] })))\n : of({ data: [] as IProfileRoleInfo[] });\n\n const actions$ = loadActions\n ? this.permissionProvider\n .getUserActions(user.id, branch?.id)\n .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: {\n id?: string;\n name: string;\n key: string;\n size: number;\n contentType: string;\n }): 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({\n ...user,\n profilePictureId: fileManagerId,\n });\n this.fileUrlService\n .fetchSingleFileUrl(fileManagerId, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((fileInfo) =>\n this._profilePictureUrl.set(fileInfo?.url ?? null),\n );\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : response.message,\n });\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({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: extraFieldsError,\n });\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$ =\n this.isExtraFieldsDirty() && this.profileExtension?.saveExtraFieldValues\n ? this.profileExtension.saveExtraFieldValues(\n user.id,\n this.extraFieldsModel(),\n )\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({\n ...user,\n name: response.data.name,\n phone: response.data.phone ?? null,\n });\n this.originalFormModel.set({\n name: response.data.name,\n phone: response.data.phone ?? '',\n });\n this.originalExtraFieldsModel.set({ ...this.extraFieldsModel() });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : response.message,\n });\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({\n currentPassword: model.currentPassword,\n newPassword: model.newPassword,\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isPasswordLoading.set(false)),\n )\n .subscribe({\n next: (response) => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response?.message,\n });\n this.passwordModel.set({\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n });\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} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService, UiModule } from '@flusys/ng-ui';\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: [\n UiModule,\n AngularModule,\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 py-8\"\n >\n <div class=\"flex flex-col items-center justify-center\">\n <div\n style=\"border-radius: var(--f-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(--f-content-border-radius); background: var(--f-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\">{{\n 'auth.register.subtitle' | translate\n }}</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\"\n >{{ 'auth.register.full.name' | translate }} *</label\n >\n <input\n fInputText\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\">{{\n 'auth.phone.label' | translate\n }}</label>\n <input\n fInputText\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\"\n >{{ 'auth.email.label' | translate }} *</label\n >\n <input\n fInputText\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\"\n >{{ 'auth.password.label' | translate }} *</label\n >\n <f-password\n [inputId]=\"'password'\"\n [formField]=\"userForm.password\"\n [placeholder]=\"\n 'shared.min.characters'\n | translate: { count: passwordMinLength() }\n \"\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\"\n >{{ 'auth.register.confirm.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'confirmPassword'\"\n [formField]=\"userForm.confirmPassword\"\n [placeholder]=\"\n 'auth.register.confirm.password.placeholder' | translate\n \"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch() && userFormModel().confirmPassword) {\n <small class=\"text-danger block mt-2\">{{\n 'auth.register.passwords.do.not.match' | translate\n }}</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.labelKey | translate: null : field.label\n }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"\n field.component;\n injector: getFieldInjector(field)\n \"\n ></ng-container>\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"\n getFieldTemplateContext(field)\n \"\n ></ng-container>\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n fInputText\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\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 fInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\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 fTextarea\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\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 <f-select\n [id]=\"field.key\"\n class=\"w-full\"\n [options]=\"field.options ?? []\"\n optionValue=\"value\"\n [ngModel]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"\n updateExtraField(field.key, $event)\n \"\n [placeholder]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n ('shared.select' | translate)\n \"\n >\n <ng-template #item let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n <ng-template #selectedItem let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n </f-select>\n }\n @case ('checkbox') {\n <f-checkbox\n [inputId]=\"field.key\"\n [checked]=\"\n $any(\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n false\n )\n \"\n (onChange)=\"\n updateExtraField(field.key, $event.checked)\n \"\n [label]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n (field.labelKey\n | translate: null : field.label)\n \"\n />\n }\n @case ('date') {\n <input\n fInputText\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 {{ 'auth.register.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 <f-checkbox\n [formField]=\"companyForm.createNewCompany\"\n [label]=\"'auth.register.create.new.company' | translate\"\n (click)=\"onCreateCompanyToggle()\"\n />\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\n for=\"companySlug\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.register.company.code' | translate }}</label\n >\n @if (hasDefaultCompany()) {\n <input\n fInputText\n id=\"companySlug\"\n [value]=\"defaultCompanySlug()\"\n class=\"w-full bg-(--f-form-field-filled-background)\"\n readonly\n />\n <small class=\"text-muted-color\">{{\n 'auth.register.preconfigured.company' | translate\n }}</small>\n } @else {\n <input\n fInputText\n id=\"companySlug\"\n [formField]=\"companyForm.companySlug\"\n [placeholder]=\"\n 'auth.register.company.code.placeholder'\n | translate\n \"\n class=\"w-full\"\n />\n <small class=\"text-muted-color\">{{\n 'auth.register.enter.company.code' | translate\n }}</small>\n }\n </div>\n\n <div>\n <label\n for=\"branchSlug\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.register.branch.code' | translate }}</label\n >\n @if (hasDefaultBranch()) {\n <input\n fInputText\n id=\"branchSlug\"\n [value]=\"defaultBranchSlug()\"\n class=\"w-full bg-(--f-form-field-filled-background)\"\n readonly\n />\n <small class=\"text-muted-color\">{{\n 'auth.register.preconfigured.branch' | translate\n }}</small>\n } @else {\n <input\n fInputText\n id=\"branchSlug\"\n [formField]=\"companyForm.branchSlug\"\n [placeholder]=\"\n 'auth.register.branch.code.placeholder'\n | translate\n \"\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\"\n >{{ 'auth.register.company.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"newCompanyName\"\n [formField]=\"companyForm.newCompanyName\"\n [placeholder]=\"\n 'auth.register.company.name.placeholder' | translate\n \"\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\n for=\"newCompanyPhone\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.phone.label' | translate }}</label\n >\n <input\n fInputText\n id=\"newCompanyPhone\"\n [formField]=\"companyForm.newCompanyPhone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <div>\n <label\n for=\"newCompanyAddress\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.address.label' | translate }}</label\n >\n <input\n fInputText\n id=\"newCompanyAddress\"\n [formField]=\"companyForm.newCompanyAddress\"\n [placeholder]=\"'auth.address.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <button\n fButton\n class=\"w-full mt-4\"\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'auth.register.create.account' | translate\n }}</span>\n </button>\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{\n 'auth.register.already.have.account' | translate\n }}</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(TranslateService, {\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 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 this.extraFields().reduce<Record<string, unknown>>((acc, field) => {\n if (field.defaultValue !== undefined) {\n acc[field.key] = field.defaultValue;\n }\n return acc;\n }, {}),\n );\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', {\n min: this.passwordMinLength(),\n }),\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, {\n message: this.translate('shared.name.required'),\n });\n minLength(f.name, 2, {\n message: this.translate('auth.validation.name.min.length', { min: 2 }),\n });\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, {\n message: this.translate('auth.validation.password.required'),\n });\n minLength(f.password, this.passwordMinLength(), {\n message: this.passwordErrorMessage(),\n });\n required(f.confirmPassword, {\n message: this.translate('auth.validation.confirm.password.required'),\n });\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(\n field: IRegistrationExtraField,\n ): 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 private readonly fieldInjectors = new Map<\n string,\n { injector: Injector; setField: (field: IRegistrationExtraField) => void }\n >();\n\n getFieldInjector(field: IRegistrationExtraField): Injector {\n const cached = this.fieldInjectors.get(field.key);\n if (cached) {\n cached.setField(field);\n return cached.injector;\n }\n\n let currentField = field;\n const extraFieldsModel = this.extraFieldsModel;\n const context: IRegistrationFieldTemplateContext = {\n get field() {\n return currentField;\n },\n get value() {\n return extraFieldsModel()[currentField.key] ?? currentField.defaultValue;\n },\n updateValue: (value: unknown) =>\n this.updateExtraField(currentField.key, value),\n };\n\n const injector = Injector.create({\n providers: [{ provide: REGISTRATION_FIELD_CONTEXT, useValue: context }],\n parent: field.injector ?? this.parentInjector,\n });\n this.fieldInjectors.set(field.key, {\n injector,\n setField: (next) => (currentField = next),\n });\n return injector;\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.required.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 const data = response.data;\n if (!data) return;\n\n if (data.requiresEmailVerification) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : response.message,\n life: 5000,\n });\n this.router.navigate(['/auth/login']);\n return;\n }\n\n if (data.accessToken) {\n this.authState.setLoginState({\n accessToken: data.accessToken,\n user: data.user,\n company: data.company,\n branch: data.branch,\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : response.message,\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 { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, minLength, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize } from 'rxjs';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { UiModule } from '@flusys/ng-ui';\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: [\n AngularModule,\n UiModule,\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(--f-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(--f-content-border-radius); background: var(--f-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\n for=\"newPassword\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.reset.password.new.password' | translate }}\n </label>\n <f-password\n [inputId]=\"'newPassword'\"\n [placeholder]=\"\n 'auth.reset.password.new.password.placeholder' | translate\n \"\n class=\"w-full mb-4\"\n [formField]=\"resetForm.newPassword\"\n autocomplete=\"new-password\"\n />\n\n <label\n for=\"confirmPassword\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.reset.password.confirm.password' | translate }}\n </label>\n <f-password\n [inputId]=\"'confirmPassword'\"\n [placeholder]=\"\n 'auth.reset.password.confirm.password.placeholder'\n | translate\n \"\n class=\"w-full mb-2\"\n [formField]=\"resetForm.confirmPassword\"\n autocomplete=\"new-password\"\n />\n\n @if (passwordMismatch()) {\n <small class=\"text-danger block mb-4\">{{\n 'auth.register.passwords.do.not.match' | translate\n }}</small>\n }\n\n <button\n fButton\n class=\"w-full mt-4 mb-4\"\n type=\"submit\"\n [disabled]=\"!canSubmit() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.reset.password.reset.password' | translate }}</span>\n </button>\n\n <div class=\"flex items-center justify-center gap-2\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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 <ui-icon name=\"check-circle\" class=\"text-6xl text-success\"></ui-icon>\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 <button\n fButton\n class=\"w-full\"\n >\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"times-circle\" class=\"text-6xl text-danger\"></ui-icon>\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 <button\n fButton\n class=\"w-full mb-4\"\n >\n <span pButtonLabel>{{\n 'auth.reset.password.request.new.link' | translate\n }}</span>\n </button>\n </a>\n <div class=\"mt-4\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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(TranslateService, {\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 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>({\n newPassword: '',\n confirmPassword: '',\n });\n readonly resetForm = form(this.formModel, (f) => {\n required(f.newPassword, {\n message: this.translate('auth.validation.password.required'),\n });\n minLength(f.newPassword, 8, {\n message: this.translate('auth.validation.password.min.length', {\n min: 8,\n }),\n });\n required(f.confirmPassword, {\n message: this.translate('auth.validation.confirm.password.required'),\n });\n });\n readonly passwordMismatch = computed(() => {\n const model = this.formModel();\n return (\n model.confirmPassword.length > 0 &&\n model.newPassword !== model.confirmPassword\n );\n });\n readonly canSubmit = computed(\n () => this.resetForm().valid() && !this.passwordMismatch(),\n );\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.required.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: (response) => {\n const r = response as unknown as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: r?.messageKey\n ? this.translate(r.messageKey, r.messageVariables)\n : r?.message,\n });\n this.pageState.set('success');\n },\n error: (error) => {\n const messageKey: string = error.error?.messageKey || '';\n const invalidTokenKeys = [\n 'auth.password.reset.token.expired',\n 'auth.password.reset.token.used',\n 'email.verification.token.invalid',\n ];\n if (invalidTokenKeys.includes(messageKey)) {\n this.pageState.set('invalid-token');\n }\n // Other errors handled by global interceptor\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, toSignal } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService, UiModule } from '@flusys/ng-ui';\nimport { finalize, firstValueFrom } from 'rxjs';\nimport {\n ICreateUserRequest,\n IUpdateUserRequest,\n IUser,\n} from '../../interfaces/user.interface';\nimport {\n AUTH_USER_FORM_EXTENSION,\n IUserFormExtraField,\n IUserFormFieldTemplateContext,\n USER_FORM_FIELD_CONTEXT,\n} from '../../providers/auth-extension.providers';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserPermissionApiService } from '../../services/user-permission-api.service';\n\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n phone: string;\n isActive: boolean;\n emailVerified: boolean;\n}\n\n@Component({\n selector: 'lib-user-form',\n imports: [UiModule, AngularModule, FormField, TranslatePipe],\n template: `\n <f-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 {{\n isEditMode()\n ? ('administrative.user.edit' | translate)\n : ('administrative.user.new' | translate)\n }}\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 <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'administrative.user.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'administrative.user.name.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\"\n >{{ 'administrative.email.label' | translate }} *</label\n >\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"formTree.email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"password\" class=\"font-medium\">\n {{ 'administrative.user.password' | translate }}\n {{\n isEditMode()\n ? ('administrative.user.password.optional' | translate)\n : '*'\n }}\n </label>\n <f-password\n [inputId]=\"'password'\"\n [formField]=\"formTree.password\"\n [placeholder]=\"\n 'administrative.user.password.placeholder' | translate\n \"\n autocomplete=\"new-password\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{\n 'administrative.phone.label' | translate\n }}</label>\n <input\n fInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\"\n />\n </div>\n\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 <ui-icon name=\"sliders-h\" class=\"mr-2\"></ui-icon\n >{{ 'profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <f-skeleton height=\"2.5rem\" />\n <f-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.labelKey | translate: null : field.label\n }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"\n field.component;\n injector: getFieldInjector(field)\n \"\n />\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"\n getFieldTemplateContext(field)\n \"\n />\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n fInputText\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 fInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 fTextarea\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 <f-select\n [id]=\"field.key\"\n class=\"w-full\"\n [options]=\"field.options ?? []\"\n optionValue=\"value\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"\n updateExtraField(field.key, $event)\n \"\n [placeholder]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n ('shared.select' | translate)\n \"\n >\n <ng-template #item let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n <ng-template #selectedItem let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n </f-select>\n }\n @case ('checkbox') {\n <f-checkbox\n [inputId]=\"field.key\"\n [checked]=\"\n $any(getExtraFieldValue(field.key) ?? false)\n \"\n (onChange)=\"\n updateExtraField(field.key, $event.checked)\n \"\n [label]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n (field.labelKey\n | translate: null : field.label)\n \"\n />\n }\n @case ('date') {\n <input\n fInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 }\n </div>\n }\n\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <f-checkbox\n [formField]=\"formTree.isActive\"\n [label]=\"'shared.active' | translate\"\n />\n <f-checkbox\n [formField]=\"formTree.emailVerified\"\n [label]=\"'administrative.user.email.verified' | translate\"\n />\n </div>\n\n @if (companyFeatureEnabled() && !isEditMode()) {\n <div\n class=\"md:col-span-2 p-3 bg-primary/10 rounded-lg border border-primary/20\"\n >\n <div class=\"flex items-center gap-2 text-primary\">\n <ui-icon name=\"info-circle\"></ui-icon>\n <span class=\"text-sm\">\n {{ 'administrative.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 <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{\n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-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(TranslateService, {\n optional: true,\n });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, {\n optional: true,\n });\n private readonly parentInjector = inject(Injector);\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 private readonly routeParams = toSignal(this.route.paramMap);\n private userLoadTriggered = false;\n\n readonly isLoading = signal(false);\n readonly existingUser = signal<IUser | null>(null);\n readonly isEditMode = computed(() => !!this.existingUser());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly currentCompanyName = computed(() => this.authState.companyName());\n readonly currentBranchName = computed(() => this.authState.branchName());\n\n readonly formModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n phone: '',\n isActive: true,\n emailVerified: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.name.required'),\n });\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, {\n message: this.translate('shared.invalid.email'),\n });\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\n .getExtraFields()\n .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(\n field: IUserFormExtraField,\n ): IUserFormFieldTemplateContext {\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 fieldInjectors = new Map<\n string,\n { injector: Injector; setField: (field: IUserFormExtraField) => void }\n >();\n\n getFieldInjector(field: IUserFormExtraField): Injector {\n const cached = this.fieldInjectors.get(field.key);\n if (cached) {\n cached.setField(field);\n return cached.injector;\n }\n\n let currentField = field;\n const extraFieldsModel = this.extraFieldsModel;\n const context: IUserFormFieldTemplateContext = {\n get field() {\n return currentField;\n },\n get value() {\n return extraFieldsModel()[currentField.key];\n },\n updateValue: (value: unknown) =>\n this.updateExtraField(currentField.key, value),\n };\n\n const injector = Injector.create({\n providers: [{ provide: USER_FORM_FIELD_CONTEXT, useValue: context }],\n parent: field.injector ?? this.parentInjector,\n });\n this.fieldInjectors.set(field.key, {\n injector,\n setField: (next) => (currentField = next),\n });\n return injector;\n }\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n const isEdit = this.isEditMode();\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 async loadUser(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.userService.findById(id);\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 } catch {\n this.router.navigate(['/administration/users']);\n } finally {\n this.isLoading.set(false);\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 as Record<string, unknown>);\n this.originalExtraFieldsModel.set(values as Record<string, unknown>);\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.required.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 async updateUser(): Promise<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 try {\n const [userResponse] = await Promise.all([\n this.userService.update(updateData),\n this.isExtraFieldsDirty() &&\n this.userFormExtension?.saveExtraFieldValues\n ? firstValueFrom(\n this.userFormExtension.saveExtraFieldValues(\n userId,\n this.extraFieldsModel(),\n ),\n )\n : Promise.resolve(undefined),\n ]);\n this.onSaveSuccess(\n userResponse.messageKey\n ? this.translate(\n userResponse.messageKey,\n userResponse.messageVariables as Record<string, string | number>,\n )\n : userResponse.message,\n );\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async createUser(): Promise<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 try {\n const response = await this.userService.insert(createData);\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(\n response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response.message,\n );\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private saveExtraFieldsForNewUser(userId: string): void {\n const extraFields = this.extraFieldsModel();\n const hasExtraData =\n Object.keys(extraFields).length > 0 &&\n Object.values(extraFields).some((v) => v !== undefined && v !== '');\n\n if (!hasExtraData || !this.userFormExtension?.saveExtraFieldValues) return;\n\n this.userFormExtension\n .saveExtraFieldValues(userId, extraFields)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ error: () => {} });\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: message,\n });\n this.router.navigate(['/administration/users']);\n }\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 this.permissionService\n .assignUserToCompany(userId, company.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n if (branch) {\n this.permissionService\n .assignUserToBranch(userId, branch.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ error: () => {} });\n }\n },\n error: () => {},\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/users']);\n }\n}\n","import { MessageService } from '@flusys/ng-ui';\nimport {\n Component,\n computed,\n inject,\n input,\n output,\n resource,\n signal,\n} from '@angular/core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface BranchWithAssignment extends IBranch {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-branch-permission-dialog',\n imports: [\n AngularModule,\n UiModule,\n TranslatePipe,\n ],\n template: `\n <f-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'administrative.permission.manage.branch' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color mb-3\">\n {{ 'administrative.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 >{{ 'shared.company' | translate }}:</label\n >\n <f-select\n [options]=\"companiesResource.value() ?? []\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administrative.company.select' | translate\"\n styleClass=\"w-full\"\n [disabled]=\"isInitialLoading() || isSaving()\"\n />\n </div>\n </div>\n\n @if (isInitialLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <f-progressspinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (branch of branchesResource.value() ?? []; track branch.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <f-checkbox\n [ngModel]=\"branch.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'branch-' + branch.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onBranchToggle(branch, $event.checked)\"\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 ((companiesResource.value() ?? []).length === 0) {\n {{ 'administrative.permission.no.company' | translate }}<br />\n <span class=\"text-xs\">{{\n 'administrative.permission.assign.company.first' | translate\n }}</span>\n } @else if (!selectedCompanyId()) {\n {{\n 'administrative.permission.select.company.for.branches'\n | translate\n }}\n } @else {\n {{ 'administrative.branch.no.branches' | translate }}\n }\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onClose()\"\n [disabled]=\"isSaving()\"\n >\n <span pButtonLabel>{{ 'shared.close' | translate }}</span>\n </button>\n </ng-template>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, unknown>): 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 isSaving = signal(false);\n readonly selectedCompanyId = signal<string | null>(null);\n\n readonly companiesResource = resource({\n params: () => {\n const user = this.user();\n if (!this.visible() || !user) return undefined;\n return { userId: user.id };\n },\n loader: async ({ params }) => {\n const response = await firstValueFrom(\n this.permissionApi.getUserCompanies(params!.userId),\n );\n this.selectedCompanyId.set(null);\n return (response.data ?? []).map((p) => ({\n id: p.companyId,\n name: p.companyName,\n }));\n },\n });\n\n readonly branchesResource = resource({\n params: () => {\n const user = this.user();\n const companyId = this.selectedCompanyId();\n if (!user || !companyId) return undefined;\n return { userId: user.id, companyId };\n },\n loader: async ({ params }) => {\n const [branchesResponse, assignedResponse] = await Promise.all([\n this.branchApi.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { companyId: params!.companyId },\n select: [],\n sort: {},\n }),\n firstValueFrom(this.permissionApi.getUserBranches(params!.userId)),\n ]);\n\n const assignedIds = new Set(\n (assignedResponse.data ?? [])\n .filter((p) => p.companyId === params!.companyId)\n .map((p) => p.branchId),\n );\n\n return (branchesResponse.data ?? []).map((branch) => ({\n ...branch,\n isAssigned: assignedIds.has(branch.id),\n }));\n },\n });\n\n readonly isInitialLoading = computed(\n () => this.branchesResource.isLoading() && !this.branchesResource.value(),\n );\n\n async onBranchToggle(\n branch: BranchWithAssignment,\n isAssigned: boolean,\n ): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToBranch(currentUser.id, branch.id),\n );\n if (response.success) {\n const r = response;\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: r?.messageKey\n ? this.t(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.permissionsChanged.emit();\n this.branchesResource.reload();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromBranch(currentUser.id, branch.id),\n );\n if (response.success) {\n const r = response;\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: r?.messageKey\n ? this.t(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.permissionsChanged.emit();\n this.branchesResource.reload();\n }\n }\n } catch {\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { MessageService } from '@flusys/ng-ui';\nimport {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface CompanyWithAssignment extends ICompany {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-company-permission-dialog',\n imports: [\n AngularModule,\n UiModule,\n TranslatePipe,\n ],\n template: `\n <f-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'administrative.permission.manage.company' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color\">\n {{ 'administrative.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 <f-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 <f-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 {{ 'administrative.company.no.companies' | translate }}\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onClose()\"\n [disabled]=\"isSaving()\"\n >\n <span pButtonLabel>{{ 'shared.close' | translate }}</span>\n </button>\n </ng-template>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, unknown>): 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 this.companyApi.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n select: [],\n sort: {},\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: response?.messageKey\n ? this.t(response.messageKey, response.messageVariables)\n : (response?.message ?? ''),\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: response?.messageKey\n ? this.t(response.messageKey, response.messageVariables)\n : (response?.message ?? ''),\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 { Component, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { ConfirmationService, MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n USER_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { UserBranchPermissionDialogComponent } from '../../components/user-branch-permission-dialog.component';\nimport { UserCompanyPermissionDialogComponent } from '../../components/user-company-permission-dialog.component';\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 { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-user-list',\n imports: [UiModule, AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n UserCompanyPermissionDialogComponent,\n UserBranchPermissionDialogComponent,],\n template: `\n <f-card>\n <ng-template #header>\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\"\n >\n <h2 class=\"text-xl font-semibold m-0\">\n {{ 'administrative.user.title' | translate }}\n </h2>\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'administrative.user.add' | translate }}</span>\n </button>\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <f-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 >\n <ng-template #header>\n <tr>\n <th>{{ 'administrative.user.name' | translate }}</th>\n <th>{{ 'administrative.email.label' | translate }}</th>\n <th>{{ 'administrative.phone.label' | translate }}</th>\n <th>{{ 'administrative.user.email.verified' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n @for (col of extraColumns(); track col.key) {\n <th\n [class]=\"col.styleClass ?? ''\"\n [style.width]=\"col.width ?? 'auto'\"\n >\n {{ col.headerKey | translate: null : 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 <f-tag\n [value]=\"\n user.emailVerified\n ? ('shared.verified' | translate)\n : ('shared.unverified' | translate)\n \"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\"\n />\n </td>\n <td>\n <f-tag\n [value]=\"\n user.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"user.isActive ? 'success' : 'danger'\"\n />\n </td>\n @for (col of extraColumns(); track col.key) {\n <td [class]=\"col.styleClass ?? ''\">\n @if (col.template) {\n <ng-container\n [ngTemplateOutlet]=\"col.template\"\n [ngTemplateOutletContext]=\"{ $implicit: user }\"\n />\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 <button\n fButton\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [fTooltip]=\"'shared.view.details' | translate\"\n (click)=\"onViewDetails(user)\"\n >\n <ui-icon pButtonIcon name=\"eye\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(user)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (companyFeatureEnabled()) {\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [fTooltip]=\"\n 'administrative.permission.company.permissions'\n | translate\n \"\n (click)=\"onManageCompanyPermissions(user)\"\n >\n <ui-icon pButtonIcon name=\"building\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [fTooltip]=\"\n 'administrative.permission.branch.permissions'\n | translate\n \"\n (click)=\"onManageBranchPermissions(user)\"\n >\n <ui-icon pButtonIcon name=\"sitemap\"></ui-icon>\n </button>\n }\n @for (action of extraActions(); track action.key) {\n @if (isActionVisible(action, user)) {\n <button\n fButton\n [rounded]=\"true\"\n [text]=\"true\"\n [severity]=\"action.severity ?? 'secondary'\"\n [fTooltip]=\"\n action.labelKey | translate: null : action.label\n \"\n [disabled]=\"isActionDisabled(action, user)\"\n (click)=\"onExtraAction(action, user)\"\n >\n <ui-icon pButtonIcon [name]=\"action.icon\"></ui-icon>\n </button>\n }\n }\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.DELETE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(user)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\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 {{ 'administrative.user.no.users' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </f-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\n <lib-user-branch-permission-dialog\n [visible]=\"showBranchDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showBranchDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\"\n />\n }\n\n @if (hasUserDetailView() && showUserDetailDialog()) {\n <f-dialog\n [header]=\"'administrative.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 >\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\">{{\n 'administrative.user.name' | translate\n }}</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\">{{\n 'administrative.email.label' | translate\n }}</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\">{{\n 'administrative.phone.label' | translate\n }}</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\">{{\n 'shared.status' | translate\n }}</label>\n <f-tag\n [value]=\"\n user.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"user.isActive ? 'success' : 'danger'\"\n />\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{\n 'administrative.user.email.verified' | translate\n }}</label>\n <f-tag\n [value]=\"\n user.emailVerified\n ? ('shared.verified' | translate)\n : ('shared.unverified' | translate)\n \"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\"\n />\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\">{{\n col.headerKey | translate: null : col.header\n }}</label>\n <span class=\"text-color\">{{\n getFieldValue(user, col.field ?? col.key) ?? '-'\n }}</span>\n </div>\n }\n </div>\n <div class=\"flex justify-end gap-2 mt-6\">\n @if (userDetailConfig?.allowEdit) {\n <button\n fButton\n (click)=\"onEdit(user); closeUserDetailDialog()\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n <span pButtonLabel>{{ 'shared.edit' | translate }}</span>\n </button>\n }\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"closeUserDetailDialog()\"\n >\n <span pButtonLabel>{{ 'shared.close' | translate }}</span>\n </button>\n </div>\n }\n </f-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, {\n optional: true,\n });\n readonly userDetailConfig = inject(AUTH_USER_DETAIL_CONFIG, {\n optional: true,\n });\n private readonly translateAdapter = inject(TranslateService, {\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 users = this.userService.data;\n readonly isLoading = this.userService.isLoading;\n readonly total = this.userService.total;\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\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(\n user: IUser,\n dialogSignal: typeof this.showCompanyDialog,\n ): 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', {\n name: user.name,\n }),\n header: this.translate('administrative.user.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.userService.delete({\n id: user.id,\n type: 'delete',\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response.message,\n });\n this.userService.reload();\n } catch {}\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 { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\nconst VERIFY_EMAIL_KEY = makeStateKey<'success' | 'error'>(\n 'verify-email-result',\n);\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: [\n AngularModule,\n UiModule,\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(--f-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(--f-content-border-radius); background: var(--f-content-background)\"\n >\n @switch (pageState()) {\n @case ('verifying') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"loader-circle\" spin class=\"text-8xl text-primary\"></ui-icon>\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 <ui-icon name=\"check-circle\" class=\"text-8xl text-success\"></ui-icon>\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 <button\n fButton\n class=\"w-full\"\n >\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"times-circle\" class=\"text-8xl text-danger\"></ui-icon>\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 <button\n fButton\n class=\"w-full mb-4\"\n (click)=\"showResendForm()\"\n >\n <span pButtonLabel>{{ 'auth.verify.email.resend.email' | translate }}</span>\n </button>\n <div class=\"mt-4\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full mb-6\"\n [formField]=\"resendForm.email\"\n autocomplete=\"email\"\n />\n\n <button\n fButton\n class=\"w-full mb-4\"\n type=\"submit\"\n [disabled]=\"!isResendFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.verify.email.resend' | translate }}</span>\n </button>\n\n <div class=\"flex items-center justify-center gap-2\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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 <ui-icon name=\"envelope\" class=\"text-8xl text-primary\"></ui-icon>\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.sent' | translate }}\n </p>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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(TranslateService, {\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 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, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, {\n message: this.translate('shared.invalid.email'),\n });\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(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) =>\n this.handleResendComplete(email, response.messageKey),\n error: () => {\n //handle by interceptor\n this.isLoading.set(false);\n },\n });\n }\n\n private handleResendComplete(email: string, messageKey?: string): void {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate(messageKey ?? '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","i2","emailValidator","i3","i1","i4"],"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-branch-permission-dialog.component.ts","../../../projects/ng-auth/components/user-company-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":["import { ISingleResponse } from '@flusys/ng-shared';\n\nexport 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\n// ─── Data-level interfaces (what's inside `data`) ─────────────────────────────\n\nexport interface ILoginData {\n accessToken: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IMeData {\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IRegistrationData {\n accessToken?: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n requiresEmailVerification?: boolean;\n}\n\nexport interface ICompanySelectionData {\n requiresSelection: true;\n sessionId: string;\n expiresAt: Date | string;\n user: IUserInfo;\n companies: ICompanyWithBranches[];\n}\n\nexport interface IEmailVerificationData {\n requiresEmailVerification: true;\n email: string;\n}\n\n// ─── API response type aliases (FLUSYS envelope via ISingleResponse) ──────────\n\nexport type ILoginResponse = ISingleResponse<ILoginData>;\nexport type IMeResponse = ISingleResponse<IMeData>;\nexport type IRegistrationResponse = ISingleResponse<IRegistrationData>;\nexport type ICompanySelectionResponse = ISingleResponse<ICompanySelectionData>;\nexport type ILoginRequiresEmailVerification = ISingleResponse<IEmailVerificationData>;\nexport type IRefreshTokenResponse = ISingleResponse<{ accessToken: string; refreshToken?: string }>;\n\n// ─── Union type for login endpoint response ────────────────────────────────────\n\nexport type AuthResponse = ISingleResponse<ILoginData | ICompanySelectionData | IEmailVerificationData>;\n\n// ─── Type guards ───────────────────────────────────────────────────────────────\n\nexport function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification {\n return !!response.data && 'requiresEmailVerification' in response.data && response.data.requiresEmailVerification === true;\n}\n\nexport function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse {\n return !!response.data && 'requiresSelection' in response.data && response.data.requiresSelection === true;\n}\n\nexport function isLoginResponse(response: AuthResponse): response is ILoginResponse {\n return !!response.data && 'accessToken' in response.data;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl } from '@flusys/ng-core';\nimport { IMessageResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n AuthResponse,\n IBranchInfo,\n IChangePasswordRequest,\n ICompanyInfo,\n ILoginRequest,\n IMeResponse,\n IRefreshTokenResponse,\n IRegistrationRequest,\n IRegistrationResponse,\n ISelectRequest,\n ILoginResponse,\n ISwitchCompanyRequest,\n} from '../interfaces/auth.interface';\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 login(data: ILoginRequest): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.baseUrl}/login`, data);\n }\n\n register(data: IRegistrationRequest): Observable<IRegistrationResponse> {\n return this.http.post<IRegistrationResponse>(`${this.baseUrl}/register`, data);\n }\n\n select(data: ISelectRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/select`, data);\n }\n\n switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/switch-company`, data);\n }\n\n getCompanies(): Observable<ISingleResponse<ICompanyInfo[]>> {\n return this.http.post<ISingleResponse<ICompanyInfo[]>>(`${this.baseUrl}/get-companies`, {});\n }\n\n getCompanyBranches(companyId: string): Observable<ISingleResponse<IBranchInfo[]>> {\n return this.http.post<ISingleResponse<IBranchInfo[]>>(`${this.baseUrl}/get-company-branches`, { companyId });\n }\n\n refresh(): Observable<IRefreshTokenResponse> {\n return this.http.post<IRefreshTokenResponse>(`${this.baseUrl}/refresh`, {});\n }\n\n me(): Observable<IMeResponse> {\n return this.http.post<IMeResponse>(`${this.baseUrl}/me`, {});\n }\n\n logout(): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/logout`, {});\n }\n\n changePassword(data: IChangePasswordRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/change-password`, data);\n }\n\n forgotPassword(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/forgot-password`, { email });\n }\n\n resetPassword(token: string, newPassword: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/reset-password`, { token, newPassword });\n }\n\n resendVerification(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/resend-verification`, { email });\n }\n\n verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse> {\n return this.http.post<IMessageResponse | IRegistrationResponse>(`${this.baseUrl}/verify-email`, { token });\n }\n}\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n PermissionValidatorService,\n PlatformService,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ICompanySelectionData,\n ICompanyWithBranches,\n ILoginData,\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\nconst SAVED_USER_NAME_KEY = 'savedUserName';\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(TranslateService, {\n optional: true,\n });\n private readonly permissionValidator = inject(PermissionValidatorService);\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\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 ?? '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 // Persist display name for the login page's \"welcome back\" greeting\n effect(() => {\n const user = this._user();\n const name = user?.name?.trim() || user?.email;\n if (name) this.store(SAVED_USER_NAME_KEY, name);\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(data: ILoginData): void {\n this._accessToken.set(data.accessToken);\n this._user.set(data.user);\n this._company.set(data.company ?? null);\n this._branch.set(data.branch ?? null);\n const expiry = this.decodeTokenExpiry(data.accessToken);\n this._tokenExpiresAt.set(expiry);\n this.clearSelectionState();\n }\n\n setSelectionState(data: ICompanySelectionData): void {\n this._selectionSessionId.set(data.sessionId);\n this._availableCompanies.set(data.companies);\n this._user.set(data.user);\n }\n\n clearSelectionState(): void {\n this._selectionSessionId.set(null);\n this._availableCompanies.set([]);\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 this.permissionValidator.clearPermissions();\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 getSavedUserName(): string | null {\n return this.get(SAVED_USER_NAME_KEY);\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 { 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@Injectable({ providedIn: 'root' })\nexport class AuthInitService {\n private readonly authState = inject(AuthStateService);\n private readonly authApi = inject(AuthApiService);\n private readonly appConfig = inject(APP_CONFIG);\n\n private readonly _initialized = signal(false);\n readonly initialized = this._initialized.asReadonly();\n\n private initializationCache$: Observable<boolean> | null = null;\n\n initialize(): Observable<boolean> {\n if (this.authState.isAuthenticated() && this.authState.user()) {\n this._initialized.set(true);\n return of(true);\n }\n\n if (this._initialized()) {\n return of(this.authState.isAuthenticated());\n }\n\n if (this.initializationCache$) {\n return this.initializationCache$;\n }\n\n this.initializationCache$ = this.authApi.refresh().pipe(\n timeout(5000),\n switchMap((refreshResponse) => {\n const accessToken = refreshResponse.data?.accessToken;\n if (!accessToken) return of(false);\n this.authState.setAccessToken(accessToken);\n return this.authApi.me().pipe(\n map((meResponse) => {\n const meData = meResponse.data;\n if (!meData) return false;\n const { user, company, branch } = meData;\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 }),\n\n catchError((err) => {\n this._initialized.set(true);\n\n const errorKey: string = err?.error?.messageKey ?? '';\n\n const companyErrorKeys = new Set([\n 'auth.company.required',\n 'auth.company.not.found',\n 'auth.company.no.access',\n 'auth.branch.not.found',\n 'auth.branch.no.access',\n ]);\n\n const isCompanyError = companyErrorKeys.has(errorKey);\n\n if (isCompanyError && this.appConfig.enableCompanyFeature) {\n this.authState.setUser(null);\n this.authState.setCompany(null);\n this.authState.setBranch(null);\n } else {\n this.authState.resetState();\n }\n\n return of(false);\n }),\n\n shareReplay({ bufferSize: 1, refCount: true }),\n\n finalize(() => {\n this.initializationCache$ = null;\n }),\n );\n\n return this.initializationCache$;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n IBranch,\n ICreateBranchRequest,\n IUpdateBranchRequest,\n} 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 constructor() {\n super('branch', 'administration');\n }\n\n fetchByCompany(companyId: string, search = ''): void {\n this.fetchList(search, { filter: { companyId } });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICompany,\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n} 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', '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 { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IFilterData,\n IListResponse,\n ISingleResponse,\n IUserBasicInfo,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateUserRequest,\n IUpdateUserRequest,\n IUser,\n} 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', 'administration');\n }\n\n updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>> {\n return this.http.post<ISingleResponse<IUser>>(\n `${this.baseUrl}/profile`,\n data,\n );\n }\n\n lookup(\n filter: IFilterData,\n search = '',\n ): Observable<IListResponse<IUserBasicInfo>> {\n const params = search ? { q: search } : undefined;\n return this.http.post<IListResponse<IUserBasicInfo>>(\n `${this.baseUrl}/lookup`,\n filter,\n params ? { params } : undefined,\n );\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 { IMessageResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n IAssignUserBranchRequest,\n IAssignUserCompanyRequest,\n IUserBranchPermission,\n IUserCompanyPermission,\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<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/user-company/assign`, data);\n }\n\n assignUserToCompany(userId: string, companyId: string): Observable<IMessageResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: true }] });\n }\n\n revokeUserFromCompany(userId: string, companyId: string): Observable<IMessageResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: false }] });\n }\n\n getUserCompanies(userId: string): Observable<ISingleResponse<IUserCompanyPermission[]>> {\n return this.http.post<ISingleResponse<IUserCompanyPermission[]>>(`${this.baseUrl}/get-user-company`, { userId });\n }\n\n // Branch Permissions\n assignUserBranches(data: IAssignUserBranchRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/user-branch/assign`, data);\n }\n\n assignUserToBranch(userId: string, branchId: string): Observable<IMessageResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: true }] });\n }\n\n revokeUserFromBranch(userId: string, branchId: string): Observable<IMessageResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: false }] });\n }\n\n getUserBranches(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission[]>> {\n return this.http.post<ISingleResponse<IUserBranchPermission[]>>(`${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 {\n HttpErrorResponse,\n HttpEvent,\n HttpHandlerFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { TranslateService } from '@flusys/ng-shared';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n catchError,\n filter,\n Observable,\n switchMap,\n take,\n throwError,\n} 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(TranslateService, { 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 (\n isRefreshRequest ||\n isLoginRequest ||\n isSelectRequest ||\n isRegisterRequest\n ) {\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) =>\n next(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } })),\n ),\n );\n }\n\n refreshState.startRefresh();\n\n return authApi.refresh().pipe(\n switchMap((response) => {\n const newToken = response.data!.accessToken;\n authState.setAccessToken(newToken);\n refreshState.completeRefresh(newToken);\n return next(\n req.clone({ setHeaders: { Authorization: `Bearer ${newToken}` } }),\n );\n }),\n catchError((refreshError) => {\n refreshState.failRefresh();\n return handleRefreshFailure(\n authState,\n messageService,\n isBrowser,\n refreshError,\n t,\n );\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 const detailKey = error?.error?.messageKey;\n messageService.add({\n severity: 'error',\n summary: t('auth.session.expired.title'),\n detail: t(detailKey),\n });\n }\n authState.resetState();\n authState.navigateToLogin();\n\n return throwError(() => error);\n}\n","export const AUTH_MESSAGES: Record<string, string> = {\n // AUTH_MESSAGES (API keys)\n 'auth.login.success': 'Login successful',\n 'auth.login.requires.selection':\n 'Please select a company and branch to continue',\n 'auth.login.invalid.credentials': 'Invalid email or password',\n 'auth.login.email.not.verified': 'Please verify your email before logging in',\n 'auth.login.account.deactivated': 'Your account has been deactivated',\n 'auth.logout.success': 'Logged out successfully',\n 'auth.register.success': 'Account created successfully',\n 'auth.register.failed': 'Registration failed. Please try again.',\n 'auth.refresh.success': 'Token refreshed successfully',\n 'auth.me.success': 'User info retrieved successfully',\n 'auth.select.success': 'Company selected successfully',\n 'auth.switch.company.success': 'Company switched successfully',\n 'auth.register.email.exists': 'Email already exists',\n 'auth.register.company.already.assigned': 'Company already assigned',\n 'auth.password.change.success': 'Password changed successfully',\n 'auth.password.change.invalid.current': 'Current password is incorrect',\n 'auth.password.change.current.required': 'Current password is required',\n 'auth.password.reset.email.sent': 'Password reset email sent',\n 'auth.password.reset.success': 'Password reset successfully',\n 'auth.token.too.large': 'Refresh token too large (≈{{size}} bytes)',\n 'auth.company.list.success': 'User companies retrieved successfully',\n 'auth.company.not.found': 'Company not found',\n 'auth.company.required': 'Company is required',\n 'auth.company.feature.not.enabled':\n 'This feature is not enabled for your company',\n 'auth.branch.list.success': 'Company branches retrieved successfully',\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.invalid': 'Invalid session. Please login again.',\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.reset.token.expired': 'Password reset token has expired',\n 'auth.password.reset.token.used':\n 'Password reset token has already been used',\n\n // EMAIL_VERIFICATION_MESSAGES (API keys)\n 'email.verification.sent': 'Verification email sent',\n 'email.verification.success': 'Email verified successfully',\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\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.by.ids.success': 'Users retrieved successfully by Ids',\n 'user.update.success': 'User updated successfully',\n 'user.update.many.success': '{{count}} users updated successfully',\n 'user.get.by.filter.success': 'Users retrieved successfully by filter',\n 'user.get.all.success': 'Users retrieved 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.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':\n 'Profile section data retrieved successfully',\n 'user.profile.section.update.success': 'Profile section updated successfully',\n 'user.profile.completion.success':\n '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 'user.lookup.success': 'Users retrieved 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.by.ids.success': 'Companies retrieved successfully by Ids',\n 'company.get.by.filter.success': 'Companies retrieved successfully by filter',\n 'company.update.success': 'Company updated successfully',\n 'company.update.many.success': '{{count}} companies updated successfully',\n 'company.get.all.success': 'Companies retrieved successfully',\n 'company.delete.success': 'Company deleted successfully',\n 'company.restore.success': 'Company restored successfully',\n 'company.readonly.delete.forbidden': 'Cannot delete readonly company(ies): {{names}}',\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.by.ids.success': 'Branches retrieved successfully by Ids',\n 'branch.get.by.filter.success': 'Branches retrieved successfully by filter',\n 'branch.update.success': 'Branch updated successfully',\n 'branch.update.many.success': '{{count}} branches updated successfully',\n 'branch.get.all.success': 'Branches retrieved successfully',\n 'branch.delete.success': 'Branch deleted successfully',\n 'branch.restore.success': 'Branch restored successfully',\n 'branch.readonly.delete.forbidden': 'Cannot delete readonly branch(es): {{names}}',\n\n // USER_PERMISSION_MESSAGES (API keys)\n 'user.permission.company.list.success':\n 'User companies retrieved successfully',\n 'user.permission.branch.list.success': 'User branches retrieved successfully',\n 'user.permission.batch.success':\n '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 // === UI KEYS — AUTH DOMAIN (AUTH_ROUTES: login, register, forgot-password, reset-password, verify-email) ===\n\n // pages/login/login-page.component.ts\n 'auth.login.welcome': 'Welcome!',\n 'auth.login.welcome.back': 'Welcome back, {{name}}!',\n 'auth.login.sign.in.to.continue': 'Sign in to continue to your account',\n 'auth.email.label': 'Email Address',\n 'auth.email.placeholder': 'Enter email address',\n 'auth.password.label': 'Password',\n 'auth.password.placeholder': 'Enter your password',\n 'auth.field.remember.me': 'Remember me',\n 'auth.password.forgot': 'Forgot Password?',\n 'auth.login.sign.in': 'Sign In',\n 'auth.login.no.account': \"Don't have an account?\",\n 'auth.login.sign.up': 'Sign Up',\n 'auth.login.verify.email.message': 'Please verify your email !',\n 'auth.verify.resend': 'Resend Verification Email',\n 'auth.login.back.to.sign.in': 'Back to Sign In',\n 'auth.login.select.company': 'Select Company',\n 'auth.login.select.company.message':\n 'Please select a company and branch to continue',\n 'auth.login.select.company.option': 'Select a company',\n 'auth.login.branch.label': 'Branch',\n 'auth.login.select.branch.option': 'Select a branch',\n 'auth.login.remember.selection': 'Remember my selection',\n 'auth.validation.password.min.length':\n 'Password must be at least 8 characters',\n 'auth.validation.email.required': 'Email is required',\n 'auth.validation.password.required': 'Password is required',\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':\n 'Password must contain at least one uppercase letter',\n 'auth.validation.password.require.lowercase':\n 'Password must contain at least one lowercase letter',\n 'auth.validation.password.require.number':\n 'Password must contain at least one number',\n 'auth.validation.password.require.special':\n 'Password must contain at least one special character',\n 'auth.validation.company.required': 'Please select a company',\n 'auth.validation.branch.required': 'Please select a branch',\n 'auth.login.title': 'Login',\n 'auth.session.expired': 'Your session has expired. Please login again.',\n\n // pages/forgot-password/forgot-password-page.component.ts\n 'auth.forgot.password.title': 'Forgot Password',\n 'auth.forgot.password.subtitle':\n 'Enter your email address and we will send you a reset link.',\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':\n '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 // pages/register/register-page.component.ts\n 'auth.register.create.account': 'Create Account',\n 'auth.register.subtitle': 'Fill in your details to create an account.',\n 'auth.register.full.name': 'Full Name',\n 'auth.register.name.placeholder': 'Enter your full name',\n 'auth.phone.label': 'Phone Number',\n 'auth.phone.placeholder': 'Enter phone number',\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.company.details': 'Company Details',\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.company.code': 'Company Code',\n 'auth.register.preconfigured.company': 'Pre-configured Company',\n 'auth.register.company.code.placeholder': 'Enter company code',\n 'auth.register.enter.company.code': 'Enter company code to join',\n 'auth.register.branch.code': 'Branch Code',\n 'auth.register.preconfigured.branch': 'Pre-configured Branch',\n 'auth.register.branch.code.placeholder': 'Enter branch code',\n 'auth.register.company.name': 'Company Name',\n 'auth.register.company.name.placeholder': 'Enter company name',\n 'auth.address.label': 'Address',\n 'auth.address.placeholder': 'Enter address',\n 'auth.register.already.have.account': 'Already have an account?',\n 'auth.validation.name.min.length': 'Name must be at least {{min}} characters',\n 'auth.validation.confirm.password.required': 'Please confirm your password',\n\n // pages/verify-email/verify-email-page.component.ts\n 'auth.verify.email.verifying': 'Verifying Email',\n 'auth.verify.email.please.wait':\n 'Please wait while we verify your email address...',\n 'auth.verify.email.success': 'Email Verified',\n 'auth.verify.email.success.message':\n 'Your email has been verified successfully. You can now login to your account.',\n 'auth.verify.email.failed': 'Verification Failed',\n 'auth.verify.email.invalid.link':\n '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':\n 'Enter your email to receive a new verification link.',\n 'auth.verify.email.resend': 'Resend Email',\n 'auth.verify.email.sent': 'Verification email sent. Please check your inbox.',\n\n // pages/reset-password/reset-password-page.component.ts\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':\n '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':\n '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':\n 'This password reset link is invalid or has expired.',\n 'auth.reset.password.request.new.link': 'Request New Link',\n\n // === UI KEYS — PROFILE DOMAIN (PROFILE_ROUTES) ===\n\n // pages/profile/profile-page.component.ts\n 'profile.title': 'Profile',\n 'profile.subtitle': 'Manage your account settings and preferences.',\n 'profile.storage.not.enabled':\n 'Profile picture upload is not available. Storage service is not configured.',\n 'profile.name.label': 'Full Name',\n 'profile.name.placeholder': 'Enter your full name',\n 'profile.phone.label': 'Phone',\n 'profile.phone.placeholder': 'Enter phone number',\n 'profile.additional.info': 'Additional Information',\n 'profile.employment.info': 'Employment Information',\n 'profile.managed.by.admin': 'This field is managed by an administrator.',\n 'profile.security': 'Security',\n 'profile.current.password': 'Current Password',\n 'profile.current.password.placeholder': 'Enter current password',\n 'profile.new.password': 'New Password',\n 'profile.confirm.password': 'Confirm New Password',\n 'profile.confirm.password.placeholder': 'Confirm new password',\n 'profile.change.password': 'Change Password',\n 'profile.company.branch': 'Company & Branch',\n 'profile.branch.label': 'Branch',\n 'profile.actions.label': 'Direct Actions',\n 'profile.actions.none.assigned': 'No actions assigned',\n 'profile.permissions.label': 'My Permissions',\n 'profile.roles.label': 'Roles',\n 'profile.roles.none.assigned': 'No roles assigned',\n\n // === UI KEYS — ADMINISTRATIVE DOMAIN (ADMINISTRATION_ROUTES: users, company, branch) ===\n\n // components/user-company-permission-dialog.component.ts\n 'administrative.permission.manage.company': 'Manage Company Permissions',\n 'administrative.permission.user': 'User',\n 'administrative.company.no.companies': 'No companies found',\n\n // components/user-branch-permission-dialog.component.ts\n 'administrative.permission.manage.branch': 'Manage Branch Permissions',\n 'administrative.company.select': 'Select Company',\n 'administrative.permission.no.company':\n 'This user has no company permissions assigned.',\n 'administrative.permission.assign.company.first':\n 'Assign company permissions first before managing branch access.',\n 'administrative.permission.select.company.for.branches':\n 'Please select a company to view branches.',\n 'administrative.branch.no.branches': 'No branches found',\n\n // pages/administration/administration-page.component.ts\n 'administrative.title': 'Administration',\n 'administrative.subtitle': 'Manage users, companies, and branches',\n 'administrative.user.title': 'Users',\n 'administrative.company.title': 'Companies',\n 'administrative.branch.title': 'Branches',\n\n // pages/branch/branch-form.component.ts\n 'administrative.branch.new': 'New Branch',\n 'administrative.branch.edit': 'Edit Branch',\n 'administrative.branch.name': 'Branch Name',\n 'administrative.branch.name.placeholder': 'Enter branch name',\n 'administrative.branch.slug': 'Branch Slug',\n 'administrative.branch.slug.placeholder': 'Enter branch slug',\n 'administrative.email.label': 'Email',\n 'administrative.email.placeholder': 'Enter email address',\n 'administrative.phone.label': 'Phone',\n 'administrative.phone.placeholder': 'Enter phone number',\n 'administrative.address.label': 'Address',\n 'administrative.address.placeholder': 'Enter address',\n 'administrative.branch.slug.required': 'Branch slug is required',\n\n // pages/branch/branch-list.component.ts\n 'administrative.branch.add': 'Add Branch',\n 'administrative.branch.select.company.first': 'Please select a company first',\n 'administrative.branch.delete.title': 'Delete Branch',\n\n // pages/company/company-form.component.ts\n 'administrative.company.edit': 'Edit Company',\n 'administrative.company.new': 'New Company',\n 'administrative.company.name': 'Company Name',\n 'administrative.company.name.placeholder': 'Enter company name',\n 'administrative.company.slug': 'Company Slug',\n 'administrative.company.slug.placeholder': 'Enter company slug',\n 'administrative.company.website': 'Website',\n 'administrative.company.website.placeholder': 'Enter website URL',\n 'administrative.company.slug.required': 'Company slug is required',\n\n // pages/company/company-list.component.ts\n 'administrative.company.add': 'Add Company',\n 'administrative.branch.view.branches': 'View Branches',\n 'administrative.company.delete.title': 'Delete Company',\n\n // pages/users/user-form.component.ts\n 'administrative.user.edit': 'Edit User',\n 'administrative.user.new': 'New User',\n 'administrative.user.name': 'Name',\n 'administrative.user.name.placeholder': 'Enter full name',\n 'administrative.user.password': 'Password',\n 'administrative.user.password.optional': '(leave blank to keep current)',\n 'administrative.user.password.placeholder': 'Enter password',\n 'administrative.user.email.verified': 'Email Verified',\n 'administrative.user.auto.assign.to':\n 'New user will be automatically assigned to',\n\n // pages/users/user-list.component.ts\n 'administrative.user.add': 'Add User',\n 'administrative.permission.company.permissions': 'Company Permissions',\n 'administrative.permission.branch.permissions': 'Branch Permissions',\n 'administrative.user.no.users': 'No users found',\n 'administrative.user.details': 'User Details',\n 'administrative.user.delete.title': 'Delete User',\n};\n","import { inject } from '@angular/core';\nimport { Routes } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n BRANCH_PERMISSIONS,\n COMPANY_PERMISSIONS,\n PermissionValidatorService,\n permissionGuard,\n resolveTranslationModule,\n SHARED_MESSAGES,\n USER_PERMISSIONS,\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 * Resolves which administration tab the current user should land on when\n * navigating to the bare `/administration` route. Mirrors the tab\n * visibility order in AdministrationPageComponent.visibleTabs so the\n * redirect never points at a tab the user can't actually see.\n */\nfunction resolveAdministrationDefaultTab(): string {\n const permissionValidator = inject(PermissionValidatorService);\n const companyFeatureEnabled = isCompanyFeatureEnabled(inject(APP_CONFIG));\n\n if (permissionValidator.hasPermission(USER_PERMISSIONS.READ)) {\n return 'users';\n }\n\n if (\n companyFeatureEnabled &&\n permissionValidator.hasPermission(COMPANY_PERMISSIONS.READ)\n ) {\n return 'company';\n }\n\n if (\n companyFeatureEnabled &&\n permissionValidator.hasPermission(BRANCH_PERMISSIONS.READ)\n ) {\n return 'branch';\n }\n\n return 'users';\n}\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: {\n translations: resolveTranslationModule({\n modules: ['auth', 'shared'],\n fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\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: {\n translations: resolveTranslationModule({\n modules: ['auth', 'administrative'],\n fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\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: [\n companyFeatureGuard,\n permissionGuard(COMPANY_PERMISSIONS.READ),\n ],\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: [\n companyFeatureGuard,\n permissionGuard(BRANCH_PERMISSIONS.READ),\n ],\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 the first tab the user has permission to see\n {\n path: '',\n redirectTo: () => resolveAdministrationDefaultTab(),\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: {\n translations: resolveTranslationModule({\n modules: ['auth', 'profile'],\n fallbackMessages: { ...AUTH_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\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 getMyCompanies(): Observable<ICompanyInfo[]> {\n return this.authApi.getCompanies().pipe(\n map((response) =>\n (response.data || []).map((company) => ({\n id: company.id,\n name: company.name,\n slug: company.slug ?? '',\n imageId: company.logoId ?? '',\n })),\n ),\n );\n }\n\n getMyCompanyBranches(companyId: string): Observable<IBranchInfo[]> {\n return this.authApi.getCompanyBranches(companyId).pipe(\n map((response) =>\n (response.data || []).map((branch) => ({\n id: branch.id,\n name: branch.name,\n slug: branch.slug ?? '',\n imageId: branch.logoId ?? undefined,\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 IUserBranchPermission,\n IUserCompanyInfo,\n IUserPermissionProvider,\n IUserProvider,\n} from '@flusys/ng-shared';\nimport { from, 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 isActive?: boolean;\n [key: string]: any;\n }): Observable<IListResponse<IUserBasicInfo>> {\n const { search, page, pageSize, isActive, ...extraFilters } = filter || {};\n\n const apiFilter = {\n pagination: {\n currentPage: page ?? 0,\n pageSize: pageSize ?? 50,\n },\n filter: {\n ...(isActive !== undefined && { isActive }),\n\n // ✅ include all additional dynamic filters\n ...Object.fromEntries(\n Object.entries(extraFilters).filter(\n ([_, v]) => v !== undefined && v !== null,\n ),\n ),\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.userApi.lookup(apiFilter, search ?? '').pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n messageKey: response.messageKey,\n messageVariables: response.messageVariables,\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 from(this.companyApi.getAll(apiFilter, filter?.search ?? '')).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n messageKey: response.messageKey,\n messageVariables: response.messageVariables,\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<IUserBranchPermission[]>> {\n return this.userPermissionApi.getUserBranches(\n userId,\n companyId,\n ) as Observable<ISingleResponse<IUserBranchPermission[]>>;\n }\n\n getUserCompanyPermissions(userId: string): Observable<ISingleResponse<IUserCompanyInfo[]>> {\n return this.userPermissionApi.getUserCompanies(userId).pipe(\n map((response) => ({\n ...response,\n data: (response.data ?? []).map((c) => ({ id: c.companyId, name: c.companyName })),\n })),\n );\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 { InjectionToken, Injector, TemplateRef, Type } from '@angular/core';\nimport { ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\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 =\n new InjectionToken<IRegistrationFieldTemplateContext>(\n 'REGISTRATION_FIELD_CONTEXT',\n );\n\nexport interface IRegistrationExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type:\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'date'\n | '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?(\n data: Record<string, unknown>,\n ): Record<string, unknown>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_REGISTRATION_EXTENSION =\n 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 =\n new InjectionToken<IUserListExtensionProvider>('AUTH_USER_LIST_EXTENSION');\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 =\n new InjectionToken<IProfileFieldTemplateContext>('PROFILE_FIELD_CONTEXT');\n\nexport interface IProfileExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type:\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'date'\n | '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?(\n userId: string,\n data: Record<string, unknown>,\n ): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_PROFILE_EXTENSION =\n new InjectionToken<IProfileExtensionProvider>('AUTH_PROFILE_EXTENSION');\n\nexport interface IUserFormFieldTemplateContext {\n field: IUserFormExtraField;\n value: unknown;\n updateValue: (value: unknown) => void;\n}\n\nexport const USER_FORM_FIELD_CONTEXT =\n new InjectionToken<IUserFormFieldTemplateContext>('USER_FORM_FIELD_CONTEXT');\n\nexport interface IUserFormExtraField {\n key: string;\n label: string;\n labelKey?: string;\n type:\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'date'\n | '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?(\n userId: string,\n data: Record<string, unknown>,\n ): Observable<void>;\n validateExtraFields?(data: Record<string, unknown>): string | null;\n}\n\nexport const AUTH_USER_FORM_EXTENSION =\n new InjectionToken<IUserFormExtensionProvider>('AUTH_USER_FORM_EXTENSION');\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 =\n new InjectionToken<IUserDetailViewConfig>('AUTH_USER_DETAIL_CONFIG');\n\nexport function validatePassword(\n password: string,\n config: IPasswordValidationConfig,\n): 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 (\n config.requireSpecialChars &&\n !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)\n ) {\n return config.message ?? 'auth.validation.password.require.special';\n }\n }\n\n return null;\n}\n\nexport function validateEmail(\n email: string,\n config?: IEmailValidationConfig,\n): string | null {\n const pattern = config?.pattern ?? /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const message = config?.message ?? 'shared.invalid.email';\n\n if (!pattern.test(email)) return message;\n return null;\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n BRANCH_PERMISSIONS,\n COMPANY_PERMISSIONS,\n PermissionValidatorService,\n RouterTabItem,\n RouterTabsComponent,\n TranslatePipe,\n TranslateService,\n USER_PERMISSIONS,\n} from '@flusys/ng-shared';\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: [RouterOutlet, TranslatePipe, RouterTabsComponent],\n template: `\n <div class=\"p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">{{ 'administrative.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1\">{{ 'administrative.subtitle' | translate }}</p>\n </div>\n\n <lib-router-tabs [tabs]=\"visibleTabs()\" class=\"mb-4\" />\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 private readonly translateService = inject(TranslateService);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'users',\n labelKey: 'administrative.user.title',\n icon: 'users',\n route: 'users',\n permission: USER_PERMISSIONS.READ,\n },\n {\n id: 'companies',\n labelKey: 'administrative.company.title',\n icon: 'building',\n route: 'company',\n permission: COMPANY_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n {\n id: 'branches',\n labelKey: 'administrative.branch.title',\n icon: '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<RouterTabItem[]>(() => {\n return this.allTabs\n .filter((tab) => {\n const hasCompanyFeature = !tab.requiresCompanyFeature || this.companyFeatureEnabled();\n const hasPermission = this.permissionValidator.hasPermission(tab.permission);\n return hasCompanyFeature && hasPermission;\n })\n .map((tab) => ({\n id: tab.id,\n label: this.translateService.translate(tab.labelKey),\n icon: tab.icon,\n route: tab.route,\n }));\n });\n}\n","import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\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, UiModule, FormField, TranslatePipe],\n template: `\n <f-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 {{\n isEditMode()\n ? ('administrative.branch.edit' | translate)\n : ('administrative.branch.new' | translate)\n }}\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\"\n >{{ 'shared.company' | translate }} *</label\n >\n <f-select\n inputId=\"companyId\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"branchForm.companyId\"\n [placeholder]=\"'administrative.company.select' | translate\"\n />\n </div>\n }\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'administrative.branch.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"branchForm.name\"\n (blur)=\"generateSlug()\"\n [placeholder]=\"'administrative.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\"\n >{{ 'administrative.branch.slug' | translate }} *</label\n >\n <input\n fInputText\n id=\"slug\"\n [formField]=\"branchForm.slug\"\n [placeholder]=\"'administrative.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\">{{\n 'administrative.email.label' | translate\n }}</label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"branchForm.email\"\n [placeholder]=\"'administrative.email.placeholder' | translate\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{\n 'administrative.phone.label' | translate\n }}</label>\n <input\n fInputText\n id=\"phone\"\n [formField]=\"branchForm.phone\"\n [placeholder]=\"'administrative.phone.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <f-checkbox [formField]=\"branchForm.isActive\" [label]=\"'shared.active' | translate\" />\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">{{\n 'administrative.address.label' | translate\n }}</label>\n <textarea\n id=\"address\"\n fInputText\n [formField]=\"branchForm.address\"\n [placeholder]=\"'administrative.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 <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"navigateToList()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private translate(key: string, vars?: Record<string, unknown>): 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, {\n message: this.translate('auth.validation.company.required'),\n });\n required(f.name, { message: this.translate('shared.name.required') });\n required(f.slug, {\n message: this.translate('administrative.branch.slug.required'),\n });\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.findById(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.required.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 const response = await this.branchService.update(updateData);\n this.onSaveSuccess(\n response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, unknown>,\n )\n : response.message,\n );\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 const response = await this.branchService.insert(createData);\n this.onSaveSuccess(\n response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n );\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({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: message,\n });\n }\n\n private getTargetCompanyId(): string | null {\n return (\n this.existingBranch()?.companyId || this.formModel().companyId || null\n );\n }\n\n protected navigateToList(): void {\n const companyId = this.getTargetCompanyId();\n this.router.navigate(['/administration/branch'], {\n queryParams: companyId ? { companyId } : {},\n });\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 {\n AngularModule,\n BRANCH_PERMISSIONS,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { IBranch } 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@Component({\n selector: 'lib-branch-list',\n imports: [AngularModule, UiModule, HasPermissionDirective, TranslatePipe],\n template: `\n <f-card>\n <ng-template #header>\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\"\n >\n <div\n class=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\"\n >\n <h2 class=\"text-xl font-semibold m-0\">\n {{ 'administrative.branch.title' | translate }}\n </h2>\n @if (companies().length > 1) {\n <f-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"\n selectedCompanyId.set($event); loadBranches()\n \"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administrative.company.select' | translate\"\n styleClass=\"w-full sm:w-64\"\n />\n }\n </div>\n <button\n fButton\n *hasPermission=\"BRANCH_PERMISSIONS.CREATE\"\n [disabled]=\"!selectedCompanyId()\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'administrative.branch.add' | translate\n }}</span>\n </button>\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <f-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 >\n <ng-template #header>\n <tr>\n <th>{{ 'administrative.branch.name' | translate }}</th>\n <th>{{ 'administrative.branch.slug' | translate }}</th>\n <th>{{ 'administrative.email.label' | translate }}</th>\n <th>{{ 'administrative.phone.label' | 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 <f-tag\n [value]=\"\n branch.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"branch.isActive ? 'success' : 'danger'\"\n />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <button\n fButton\n *hasPermission=\"BRANCH_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(branch)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (!branch.readOnly) {\n <button\n fButton\n *hasPermission=\"BRANCH_PERMISSIONS.DELETE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(branch)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\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 {{ 'administrative.branch.select.company.first' | translate }}\n } @else {\n {{ 'administrative.branch.no.branches' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private translate(key: string, vars?: Record<string, unknown>): 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 this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n const queryCompanyId = params?.get('companyId') || null;\n const currentCompanyId = this.authState.company()?.id;\n const companyId = queryCompanyId || currentCompanyId || null;\n\n this.selectedCompanyId.set(companyId);\n\n if (companyId) {\n this.loadBranches();\n }\n });\n });\n }\n\n loadBranches(page = 0, pageSize = 10): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.branchService.fetchList('', {\n filter: { companyId },\n pagination: { currentPage: page, pageSize },\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 this.loadBranches(Math.floor(first / rows), rows);\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', {\n name: branch.name,\n }),\n header: this.translate('administrative.branch.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.branchService.delete({\n id: branch.id,\n type: 'permanent',\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, unknown>,\n )\n : response?.message,\n });\n this.branchService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { Component, computed, inject, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n BaseFormComponent,\n IFormField,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n@Component({\n selector: 'lib-company-form',\n imports: [BaseFormComponent, TranslatePipe],\n template: `\n <lib-base-form\n [fields]=\"fields\"\n [service]=\"companyService\"\n [editId]=\"editId()\"\n [cancelRoute]=\"'/administration/company'\"\n [navigateOnSuccess]=\"'/administration/company'\"\n [createTitle]=\"'administrative.company.new' | translate\"\n [editTitle]=\"'administrative.company.edit' | translate\"\n [mapToRequest]=\"buildRequest\"\n [mapFromEntity]=\"toFormModel\"\n (onValueChange)=\"onFormValueChange($event)\"\n />\n `,\n})\nexport class CompanyFormComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly translateAdapter = inject(TranslateService, { optional: true });\n\n readonly companyService = inject(CompanyApiService);\n readonly formRef = viewChild(BaseFormComponent);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n\n readonly editId = computed(() => {\n const id = this.routeParams()?.get('id');\n return id && id !== 'new' ? id : null;\n });\n\n readonly fields: IFormField[] = [\n {\n key: 'name',\n type: 'text',\n label: this.t('administrative.company.name'),\n placeholder: this.t('administrative.company.name.placeholder'),\n required: true,\n },\n {\n key: 'slug',\n type: 'text',\n label: this.t('administrative.company.slug'),\n placeholder: this.t('administrative.company.slug.placeholder'),\n required: true,\n },\n {\n key: 'email',\n type: 'email',\n label: this.t('administrative.email.label'),\n placeholder: this.t('administrative.email.placeholder'),\n },\n {\n key: 'phone',\n type: 'text',\n label: this.t('administrative.phone.label'),\n placeholder: this.t('administrative.phone.placeholder'),\n },\n {\n key: 'website',\n type: 'text',\n label: this.t('administrative.company.website'),\n placeholder: this.t('administrative.company.website.placeholder'),\n },\n {\n key: 'isActive',\n type: 'toggle',\n label: this.t('shared.active'),\n },\n {\n key: 'address',\n type: 'textarea',\n label: this.t('administrative.address.label'),\n placeholder: this.t('administrative.address.placeholder'),\n fullWidth: true,\n rows: 3,\n },\n ];\n\n readonly buildRequest = (data: Record<string, unknown>, editId: string | null): unknown => ({\n ...(editId ? { id: editId } : {}),\n name: data['name'] as string,\n slug: data['slug'] as string,\n email: (data['email'] as string) || undefined,\n phone: (data['phone'] as string) || undefined,\n website: (data['website'] as string) || undefined,\n address: (data['address'] as string) || undefined,\n isActive: data['isActive'] as boolean,\n });\n\n readonly toFormModel = (entity: unknown): Record<string, unknown> => {\n const c = entity as ICompany;\n return {\n name: c.name,\n slug: c.slug,\n email: c.email ?? '',\n phone: c.phone ?? '',\n website: c.website ?? '',\n address: c.address ?? '',\n isActive: c.isActive,\n };\n };\n\n onFormValueChange(data: Record<string, unknown>): void {\n const name = (data['name'] as string) ?? '';\n const slug = (data['slug'] as string) ?? '';\n if (name && !slug) {\n this.formRef()?.setFieldValue(\n 'slug',\n name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''),\n );\n }\n }\n\n private t(key: string, vars?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n BaseListComponent,\n BaseListTemplateDirective,\n BRANCH_PERMISSIONS,\n COMPANY_PERMISSIONS,\n ITableAction,\n ITableColumn,\n PermissionValidatorService,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n@Component({\n selector: 'lib-company-list',\n imports: [\n BaseListComponent,\n BaseListTemplateDirective,\n UiModule,\n TranslatePipe,\n ],\n template: `\n <lib-base-list\n [columns]=\"columns\"\n [actions]=\"viewBranchesAction\"\n [service]=\"companyService\"\n [title]=\"'administrative.company.title' | translate\"\n [showCreateButton]=\"canCreate()\"\n [createButtonLabel]=\"'administrative.company.add' | translate\"\n [createRoute]=\"'/administration/company/new'\"\n [editRoute]=\"'/administration/company'\"\n [deleteConfirmField]=\"'name'\"\n [deleteType]=\"'permanent'\"\n [canEdit]=\"canEditFn\"\n [canDelete]=\"canDeleteFn\"\n >\n <ng-template baseListTemplate=\"isActive\" let-item>\n <f-tag\n [value]=\"\n asCompany(item).isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"asCompany(item).isActive ? 'success' : 'danger'\"\n />\n </ng-template>\n </lib-base-list>\n `,\n})\nexport class CompanyListComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly router = inject(Router);\n\n readonly companyService = inject(CompanyApiService);\n\n readonly canCreate = computed(() =>\n this.permissionValidator.hasPermission(COMPANY_PERMISSIONS.CREATE),\n );\n readonly canEditFn = (_item: unknown) =>\n this.permissionValidator.hasPermission(COMPANY_PERMISSIONS.UPDATE);\n readonly canDeleteFn = (item: unknown) =>\n !(item as ICompany).readOnly &&\n this.permissionValidator.hasPermission(COMPANY_PERMISSIONS.DELETE);\n\n readonly viewBranchesAction: ITableAction[] = [\n {\n icon: 'building',\n tooltip: 'administrative.branch.view.branches',\n severity: 'secondary',\n show: () =>\n this.permissionValidator.hasPermission(BRANCH_PERMISSIONS.READ),\n handler: (c) =>\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId: (c as ICompany).id },\n }),\n },\n ];\n\n readonly columns: ITableColumn[] = [\n {\n field: 'name',\n header: this.t('administrative.company.name'),\n type: 'text',\n },\n {\n field: 'slug',\n header: this.t('administrative.company.slug'),\n type: 'text',\n },\n {\n field: 'email',\n header: this.t('administrative.email.label'),\n type: 'text',\n },\n {\n field: 'phone',\n header: this.t('administrative.phone.label'),\n type: 'text',\n },\n { field: 'isActive', header: this.t('shared.status'), type: 'custom' },\n ];\n\n asCompany(item: unknown): ICompany {\n return item as ICompany;\n }\n\n private t(key: string): string {\n return this.translateAdapter?.translate(key) ?? key;\n }\n}\n","import { Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n required,\n} from '@angular/forms/signals';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize, tap } from 'rxjs';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface IForgotPasswordFormModel {\n email: string;\n}\n\n@Component({\n selector: 'lib-forgot-password-page',\n imports: [\n AngularModule,\n UiModule,\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(--f-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(--f-content-border-radius); background: var(--f-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\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full mb-6\"\n [formField]=\"forgotForm.email\"\n autocomplete=\"email\"\n />\n\n <button\n fButton\n class=\"w-full mb-4\"\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.forgot.password.send.reset.link' | translate }}</span>\n </button>\n\n <div class=\"flex items-center justify-center gap-2\">\n <span class=\"font-medium\">{{\n 'auth.forgot.password.remember.password' | translate\n }}</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 } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"envelope\" class=\"text-6xl text-primary\"></ui-icon>\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 {{\n 'auth.forgot.password.email.sent.to'\n | translate: { email: submittedEmail() }\n }}\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 >\n {{ 'auth.forgot.password.try.again' | translate }} </span\n >.\n </p>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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(TranslateService, {\n optional: true,\n });\n\n private translate(key: string, vars?: Record<string, string>): 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, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, {\n message: this.translate('shared.invalid.email'),\n });\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({\n next: () => this.showEmailSent(email),\n }),\n finalize(() => this.isLoading.set(false)),\n )\n .subscribe({ error: () => {} });\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 isServiceEnabled,\n isSignUpEnabled,\n} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n ISelectRequest,\n isEmailVerificationRequired,\n isLoginResponse,\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';\nimport { UiModule } from '@flusys/ng-ui';\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: [UiModule, AngularModule,\n FormField,\n AppFloatingConfigurator,\n TranslatePipe,],\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(--f-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(--f-content-border-radius); background: var(--f-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.dark:bg-surface-700]=\"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 dark:bg-surface-700\"></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.dark:bg-surface-700]=\"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 @if (savedUserName()) {\n {{\n 'auth.login.welcome.back'\n | translate: { name: savedUserName()! }\n }}\n } @else {\n {{ 'auth.login.welcome' | translate }}\n }\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.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full\"\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.password.label' | translate }}\n </label>\n <div class=\"mb-4\">\n <f-password\n [inputId]=\"'password'\"\n [placeholder]=\"'auth.password.placeholder' | translate\"\n class=\"w-full\"\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 <f-checkbox [formField]=\"loginForm.rememberMe\" [label]=\"'auth.field.remember.me' | translate\" />\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.password.forgot' | translate }}\n </span>\n }\n </div>\n\n <button\n fButton\n class=\"w-full\"\n type=\"submit\"\n [disabled]=\"!isLoginFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\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 <ui-icon name=\"envelope\" class=\"text-6xl text-warn\"></ui-icon>\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 {{ 'auth.login.verify.email.message' | translate }}\n </p>\n <button\n fButton\n class=\"w-full mb-4\"\n (click)=\"onResendVerification()\"\n [disabled]=\"isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.verify.resend' | translate }}</span>\n </button>\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 {{ 'auth.login.select.company.message' | translate }}\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 {{ 'shared.company' | translate }}\n </label>\n <f-select\n inputId=\"company\"\n class=\"w-full mb-4\"\n [options]=\"companies()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"selectionForm.companyId\"\n [placeholder]=\"'auth.login.select.company.option' | translate\"\n (onChange)=\"onCompanyChange()\"\n />\n\n <label\n for=\"branch\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.login.branch.label' | translate }}\n </label>\n <f-select\n inputId=\"branch\"\n class=\"w-full mb-4\"\n [options]=\"branches()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"selectionForm.branchId\"\n [placeholder]=\"'auth.login.select.branch.option' | translate\"\n />\n\n <div class=\"flex items-center mt-2 mb-8\">\n <f-checkbox\n [formField]=\"selectionForm.rememberSelection\"\n [label]=\"'auth.login.remember.selection' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <button\n fButton\n class=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (click)=\"goBackToCredentials()\"\n >\n <span pButtonLabel>{{ 'shared.back' | translate }}</span>\n </button>\n <button\n fButton\n class=\"w-full\"\n type=\"submit\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.continue' | translate }}</span>\n </button>\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(TranslateService, {\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 readonly savedUserName = signal(this.authState.getSavedUserName());\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', {\n min: this.passwordMinLength(),\n }),\n );\n\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, {\n message: this.translate('auth.validation.password.required'),\n });\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, {\n message: this.translate('auth.validation.company.required'),\n });\n required(f.branchId, {\n message: this.translate('auth.validation.branch.required'),\n });\n });\n\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly emailFeatureEnabled = computed(() =>\n isServiceEnabled(this.appConfig, 'email'),\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.required.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 if (!response.data) return;\n this.unverifiedEmail.set(response.data.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n if (!response.data) return;\n this.sessionId = response.data.sessionId;\n this.companies.set(response.data.companies);\n this.userName.set(\n response.data.user.name ?? response.data.user.email,\n );\n this.authState.setSelectionState(response.data);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else if (isLoginResponse(response)) {\n if (!response.data) return;\n this.authState.setLoginState(response.data);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : (response.message ?? this.translate('auth.login.success')),\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n const messageKey = error?.error?.messageKey;\n const detail = messageKey\n ? this.translate(messageKey)\n : error?.error?.message;\n this.messageService.add({\n severity: 'error',\n summary: this.translate('auth.login.title'),\n detail,\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 if (!response.data) return;\n this.authState.setLoginState(response.data);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : response.message,\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.messageKey\n ? this.translate(response.messageKey)\n : response.message,\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 isServiceEnabled,\n} from '@flusys/ng-core';\nimport {\n AngularModule,\n FILE_PROVIDER,\n FileUploaderComponent,\n FileUrlService,\n HasPermissionDirective,\n IProfileActionInfo,\n IProfileRoleInfo,\n PROFILE_PERMISSION_PROVIDER,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService, UiModule } from '@flusys/ng-ui';\nimport { catchError, finalize, forkJoin, of } from 'rxjs';\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: [\n UiModule,\n AngularModule,\n FormField,\n FileUploaderComponent,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"mb-4 md:mb-6\">\n <h1 class=\"text-2xl font-bold text-color mb-2\">\n {{ 'profile.title' | translate }}\n </h1>\n <p class=\"text-muted-color\">{{ '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\n class=\"flex flex-col items-center gap-4 md:w-72 lg:w-80 md:border-r md:border-surface md:pr-6\"\n >\n @if (profilePictureUrl()) {\n <f-avatar\n [image]=\"profilePictureUrl()!\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28\"\n />\n } @else {\n <f-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 }\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 />\n } @else {\n <div class=\"w-full p-3 bg-emphasis rounded-lg text-center\">\n <ui-icon\n name=\"info-circle\"\n class=\"text-muted-color mr-2\"\n ></ui-icon>\n <span class=\"text-sm text-muted-color\">{{\n 'profile.storage.not.enabled' | translate\n }}</span>\n </div>\n }\n </div>\n\n <div class=\"flex-1 min-w-0\">\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\">{{\n 'auth.email.label' | translate\n }}</label>\n <input\n fInputText\n [value]=\"userEmail()\"\n disabled\n class=\"bg-(--f-form-field-filled-background)\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium text-color\"\n >{{ 'profile.name.label' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'profile.name.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium text-color\">{{\n 'profile.phone.label' | translate\n }}</label>\n <input\n fInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'profile.phone.placeholder' | translate\"\n />\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 <ui-icon name=\"pencil\" class=\"mr-2\"></ui-icon\n >{{ 'profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <f-skeleton height=\"2rem\" class=\"mb-2\" />\n <f-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.labelKey | translate: null : field.label\n }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"\n field.component;\n injector: getFieldInjector(field)\n \"\n />\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"\n getFieldTemplateContext(field)\n \"\n />\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"fieldTemplate\"\n [ngTemplateOutletContext]=\"{ field: field }\"\n />\n }\n </div>\n }\n </div>\n @if (extraFieldsValidationError()) {\n <small class=\"text-danger block mt-2\">{{\n extraFieldsValidationError()\n }}</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 <ui-icon name=\"eye\" class=\"mr-2\"></ui-icon\n >{{ 'profile.employment.info' | translate }}\n </div>\n <f-tag\n [value]=\"'profile.managed.by.admin' | translate\"\n severity=\"secondary\"\n />\n </div>\n @if (isLoadingExtraFields()) {\n <f-skeleton height=\"2rem\" class=\"mb-2\" />\n <f-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\">{{\n field.labelKey | translate: null : field.label\n }}</label>\n <span class=\"text-color font-medium\">\n @if (field.type === 'select') {\n {{\n getSelectLabel(\n field,\n getAdminFieldValue(field.key)\n )\n }}\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 fInputText\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"\n updateExtraField(field.key, $any($event.target).value)\n \"\n class=\"w-full\"\n />\n }\n @case ('number') {\n <input\n fInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\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 fTextarea\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"\n updateExtraField(field.key, $any($event.target).value)\n \"\n class=\"w-full\"\n rows=\"3\"\n ></textarea>\n }\n @case ('select') {\n <f-select\n [id]=\"field.key\"\n class=\"w-full\"\n [options]=\"field.options ?? []\"\n optionValue=\"value\"\n [disabled]=\"field.editable === false\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"updateExtraField(field.key, $event)\"\n [placeholder]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ?? ('shared.select' | translate)\n \"\n >\n <ng-template #item let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n <ng-template #selectedItem let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n </f-select>\n }\n @case ('checkbox') {\n <f-checkbox\n [inputId]=\"field.key\"\n [checked]=\"$any(getExtraFieldValue(field.key) ?? false)\"\n [disabled]=\"field.editable === false\"\n (onChange)=\"updateExtraField(field.key, $event.checked)\"\n [label]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n (field.labelKey | translate: null : field.label)\n \"\n />\n }\n @case ('date') {\n <input\n fInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\n [disabled]=\"field.editable === false\"\n (input)=\"\n updateExtraField(field.key, $any($event.target).value)\n \"\n class=\"w-full\"\n />\n }\n }\n </ng-template>\n\n <div class=\"flex justify-end pt-4\">\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || !isFormDirty() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"check\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'shared.save.changes' | translate\n }}</span>\n </button>\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 <ui-icon name=\"lock\" class=\"text-primary\"></ui-icon>\n <span class=\"font-semibold text-color\">{{\n 'profile.security' | translate\n }}</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\"\n >{{ 'profile.current.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'currentPassword'\"\n name=\"currentPassword\"\n [ngModel]=\"passwordModel().currentPassword\"\n (ngModelChange)=\"updatePasswordField('currentPassword', $event)\"\n [placeholder]=\"'profile.current.password.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"current-password\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"newPassword\" class=\"font-medium text-color\"\n >{{ 'profile.new.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'newPassword'\"\n name=\"newPassword\"\n [ngModel]=\"passwordModel().newPassword\"\n (ngModelChange)=\"updatePasswordField('newPassword', $event)\"\n [placeholder]=\"'shared.min.characters' | translate: { count: 6 }\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"confirmPassword\" class=\"font-medium text-color\"\n >{{ 'profile.confirm.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'confirmPassword'\"\n name=\"confirmPassword\"\n [ngModel]=\"passwordModel().confirmPassword\"\n (ngModelChange)=\"updatePasswordField('confirmPassword', $event)\"\n [placeholder]=\"'profile.confirm.password.placeholder' | translate\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch()) {\n <small class=\"text-danger\">{{\n 'auth.register.passwords.do.not.match' | translate\n }}</small>\n }\n </div>\n </div>\n\n <div class=\"flex justify-end\">\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isPasswordFormValid() || isPasswordLoading()\"\n >\n @if (isPasswordLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"key\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'profile.change.password' | translate\n }}</span>\n </button>\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 <ui-icon [name]=\"section.icon\" class=\"text-primary\"></ui-icon>\n }\n <span class=\"font-semibold text-color\">{{\n section.titleKey | translate: null : section.title\n }}</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 <ui-icon [name]=\"section.icon\" class=\"text-primary\"></ui-icon>\n }\n <span class=\"font-semibold text-color\">{{\n section.titleKey | translate: null : section.title\n }}</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 <ui-icon name=\"building\" class=\"text-primary\"></ui-icon>\n <span class=\"font-semibold text-color\">{{\n 'profile.company.branch' | translate\n }}</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\n class=\"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0\"\n >\n <ui-icon name=\"briefcase\" class=\"text-primary\"></ui-icon>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">\n {{ 'shared.company' | translate }}\n </div>\n <div class=\"font-medium text-color\">\n {{ companyName() || ('shared.not.assigned' | translate) }}\n </div>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <div\n class=\"w-10 h-10 rounded-lg bg-success/10 flex items-center justify-center flex-shrink-0\"\n >\n <ui-icon name=\"map-marker\" class=\"text-success\"></ui-icon>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">\n {{ 'profile.branch.label' | translate }}\n </div>\n <div class=\"font-medium text-color\">\n {{ branchName() || ('shared.not.assigned' | translate) }}\n </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 <ui-icon name=\"shield\" class=\"text-primary\"></ui-icon>\n <span class=\"font-semibold text-color\">{{\n 'profile.permissions.label' | translate\n }}</span>\n </div>\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"secondary\"\n />\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n @if (showRoles()) {\n <div>\n <div\n class=\"text-sm text-muted-color mb-2 flex items-center gap-2\"\n >\n <ui-icon name=\"users\"></ui-icon>\n {{ 'profile.roles.label' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <f-skeleton height=\"1.5rem\" class=\"mb-2\" />\n } @else if (userRoles().length === 0) {\n <span class=\"text-muted-color text-sm\">{{\n 'profile.roles.none.assigned' | translate\n }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (role of userRoles(); track role.id) {\n <f-tag [value]=\"role.name\" severity=\"info\" />\n }\n </div>\n }\n </div>\n }\n\n @if (showActions()) {\n <div>\n <div\n class=\"text-sm text-muted-color mb-2 flex items-center gap-2\"\n >\n <ui-icon name=\"bolt\"></ui-icon>\n {{ 'profile.actions.label' | translate }}\n </div>\n @if (isLoadingPermissions()) {\n <f-skeleton height=\"1.5rem\" class=\"mb-2\" />\n } @else if (userActions().length === 0) {\n <span class=\"text-muted-color text-sm\">{{\n 'profile.actions.none.assigned' | translate\n }}</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (action of userActions(); track action.id) {\n <f-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, {\n optional: true,\n });\n private readonly profileExtension = inject(AUTH_PROFILE_EXTENSION, {\n optional: true,\n });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, {\n optional: true,\n });\n private readonly translateAdapter = inject(TranslateService, {\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 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 () =>\n this.extraSections().length > 0 ||\n this.editableFields().length > 0 ||\n 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\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n });\n readonly companyName = computed(() => this.authState.companyName());\n readonly branchName = computed(() => this.authState.branchName());\n\n readonly showUploadSection = computed(\n () =>\n isServiceEnabled(this.appConfig, 'storage') && this.fileProvider !== null,\n );\n readonly showCompanySection = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly showPermissionsSection = computed(\n () =>\n isServiceEnabled(this.appConfig, 'iam') &&\n 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(\n () => this.showCompanySection() || this.showPermissionsSection(),\n );\n\n private readonly originalFormModel = signal<IProfileFormModel>({\n name: '',\n phone: '',\n });\n readonly formModel = signal<IProfileFormModel>({ name: '', phone: '' });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.name.required'),\n });\n });\n\n readonly isFormValid = computed(\n () => this.formModel().name.trim().length > 0,\n );\n\n readonly isFormDirty = computed(() => {\n const current = this.formModel();\n const original = this.originalFormModel();\n const basicDirty =\n 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(\n field: IProfileExtraField | IUserFormExtraField,\n value: unknown,\n ): 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(\n field: IProfileExtraField,\n ): 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 private readonly fieldInjectors = new Map<\n string,\n { injector: Injector; setField: (field: IProfileExtraField) => void }\n >();\n\n getFieldInjector(field: IProfileExtraField): Injector {\n const cached = this.fieldInjectors.get(field.key);\n if (cached) {\n cached.setField(field);\n return cached.injector;\n }\n\n let currentField = field;\n const extraFieldsModel = this.extraFieldsModel;\n const context: IProfileFieldTemplateContext = {\n get field() {\n return currentField;\n },\n get value() {\n return extraFieldsModel()[currentField.key];\n },\n updateValue: (value: unknown) =>\n this.updateExtraField(currentField.key, value),\n };\n\n const injector = Injector.create({\n providers: [{ provide: PROFILE_FIELD_CONTEXT, useValue: context }],\n parent: field.injector ?? this.parentInjector,\n });\n this.fieldInjectors.set(field.key, {\n injector,\n setField: (next) => (currentField = next),\n });\n return injector;\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 (\n model.currentPassword.length > 0 &&\n model.newPassword.length >= 6 &&\n model.newPassword === model.confirmPassword\n );\n });\n\n readonly passwordsMatch = computed(() => {\n const model = this.passwordModel();\n return (\n model.confirmPassword.length === 0 ||\n model.newPassword === model.confirmPassword\n );\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 = {\n name: user.name ?? '',\n phone: user.phone ?? '',\n };\n this.originalFormModel.set(initialValues);\n this.formModel.set(initialValues);\n\n if (\n user.profilePictureId &&\n isServiceEnabled(this.appConfig, 'storage')\n ) {\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\n .getUserRoles(user.id, branch?.id)\n .pipe(catchError(() => of({ data: [] as IProfileRoleInfo[] })))\n : of({ data: [] as IProfileRoleInfo[] });\n\n const actions$ = loadActions\n ? this.permissionProvider\n .getUserActions(user.id, branch?.id)\n .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: {\n id?: string;\n name: string;\n key: string;\n size: number;\n contentType: string;\n }): 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({\n ...user,\n profilePictureId: fileManagerId,\n });\n this.fileUrlService\n .fetchSingleFileUrl(fileManagerId, true)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((fileInfo) =>\n this._profilePictureUrl.set(fileInfo?.url ?? null),\n );\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : response.message,\n });\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({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: extraFieldsError,\n });\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$ =\n this.isExtraFieldsDirty() && this.profileExtension?.saveExtraFieldValues\n ? this.profileExtension.saveExtraFieldValues(\n user.id,\n this.extraFieldsModel(),\n )\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({\n ...user,\n name: response.data.name,\n phone: response.data.phone ?? null,\n });\n this.originalFormModel.set({\n name: response.data.name,\n phone: response.data.phone ?? '',\n });\n this.originalExtraFieldsModel.set({ ...this.extraFieldsModel() });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : response.message,\n });\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({\n currentPassword: model.currentPassword,\n newPassword: model.newPassword,\n })\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isPasswordLoading.set(false)),\n )\n .subscribe({\n next: (response) => {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response?.message,\n });\n this.passwordModel.set({\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n });\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} from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService, UiModule } from '@flusys/ng-ui';\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: [\n UiModule,\n AngularModule,\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 py-8\"\n >\n <div class=\"flex flex-col items-center justify-center\">\n <div\n style=\"border-radius: var(--f-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(--f-content-border-radius); background: var(--f-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\">{{\n 'auth.register.subtitle' | translate\n }}</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\"\n >{{ 'auth.register.full.name' | translate }} *</label\n >\n <input\n fInputText\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\">{{\n 'auth.phone.label' | translate\n }}</label>\n <input\n fInputText\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\"\n >{{ 'auth.email.label' | translate }} *</label\n >\n <input\n fInputText\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\"\n >{{ 'auth.password.label' | translate }} *</label\n >\n <f-password\n [inputId]=\"'password'\"\n [formField]=\"userForm.password\"\n [placeholder]=\"\n 'shared.min.characters'\n | translate: { count: passwordMinLength() }\n \"\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\"\n >{{ 'auth.register.confirm.password' | translate }} *</label\n >\n <f-password\n [inputId]=\"'confirmPassword'\"\n [formField]=\"userForm.confirmPassword\"\n [placeholder]=\"\n 'auth.register.confirm.password.placeholder' | translate\n \"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch() && userFormModel().confirmPassword) {\n <small class=\"text-danger block mt-2\">{{\n 'auth.register.passwords.do.not.match' | translate\n }}</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.labelKey | translate: null : field.label\n }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"\n field.component;\n injector: getFieldInjector(field)\n \"\n ></ng-container>\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"\n getFieldTemplateContext(field)\n \"\n ></ng-container>\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n fInputText\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\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 fInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\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 fTextarea\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\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 <f-select\n [id]=\"field.key\"\n class=\"w-full\"\n [options]=\"field.options ?? []\"\n optionValue=\"value\"\n [ngModel]=\"\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n ''\n \"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"\n updateExtraField(field.key, $event)\n \"\n [placeholder]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n ('shared.select' | translate)\n \"\n >\n <ng-template #item let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n <ng-template #selectedItem let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n </f-select>\n }\n @case ('checkbox') {\n <f-checkbox\n [inputId]=\"field.key\"\n [checked]=\"\n $any(\n extraFieldsModel()[field.key] ??\n field.defaultValue ??\n false\n )\n \"\n (onChange)=\"\n updateExtraField(field.key, $event.checked)\n \"\n [label]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n (field.labelKey\n | translate: null : field.label)\n \"\n />\n }\n @case ('date') {\n <input\n fInputText\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 {{ 'auth.register.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 <f-checkbox\n [formField]=\"companyForm.createNewCompany\"\n [label]=\"'auth.register.create.new.company' | translate\"\n (click)=\"onCreateCompanyToggle()\"\n />\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\n for=\"companySlug\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.register.company.code' | translate }}</label\n >\n @if (hasDefaultCompany()) {\n <input\n fInputText\n id=\"companySlug\"\n [value]=\"defaultCompanySlug()\"\n class=\"w-full bg-(--f-form-field-filled-background)\"\n readonly\n />\n <small class=\"text-muted-color\">{{\n 'auth.register.preconfigured.company' | translate\n }}</small>\n } @else {\n <input\n fInputText\n id=\"companySlug\"\n [formField]=\"companyForm.companySlug\"\n [placeholder]=\"\n 'auth.register.company.code.placeholder'\n | translate\n \"\n class=\"w-full\"\n />\n <small class=\"text-muted-color\">{{\n 'auth.register.enter.company.code' | translate\n }}</small>\n }\n </div>\n\n <div>\n <label\n for=\"branchSlug\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.register.branch.code' | translate }}</label\n >\n @if (hasDefaultBranch()) {\n <input\n fInputText\n id=\"branchSlug\"\n [value]=\"defaultBranchSlug()\"\n class=\"w-full bg-(--f-form-field-filled-background)\"\n readonly\n />\n <small class=\"text-muted-color\">{{\n 'auth.register.preconfigured.branch' | translate\n }}</small>\n } @else {\n <input\n fInputText\n id=\"branchSlug\"\n [formField]=\"companyForm.branchSlug\"\n [placeholder]=\"\n 'auth.register.branch.code.placeholder'\n | translate\n \"\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\"\n >{{ 'auth.register.company.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"newCompanyName\"\n [formField]=\"companyForm.newCompanyName\"\n [placeholder]=\"\n 'auth.register.company.name.placeholder' | translate\n \"\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\n for=\"newCompanyPhone\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.phone.label' | translate }}</label\n >\n <input\n fInputText\n id=\"newCompanyPhone\"\n [formField]=\"companyForm.newCompanyPhone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n\n <div>\n <label\n for=\"newCompanyAddress\"\n class=\"block font-medium mb-2\"\n >{{ 'auth.address.label' | translate }}</label\n >\n <input\n fInputText\n id=\"newCompanyAddress\"\n [formField]=\"companyForm.newCompanyAddress\"\n [placeholder]=\"'auth.address.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <button\n fButton\n class=\"w-full mt-4\"\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'auth.register.create.account' | translate\n }}</span>\n </button>\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">{{\n 'auth.register.already.have.account' | translate\n }}</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(TranslateService, {\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 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 this.extraFields().reduce<Record<string, unknown>>((acc, field) => {\n if (field.defaultValue !== undefined) {\n acc[field.key] = field.defaultValue;\n }\n return acc;\n }, {}),\n );\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', {\n min: this.passwordMinLength(),\n }),\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, {\n message: this.translate('shared.name.required'),\n });\n minLength(f.name, 2, {\n message: this.translate('auth.validation.name.min.length', { min: 2 }),\n });\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, { message: this.emailErrorMessage() });\n required(f.password, {\n message: this.translate('auth.validation.password.required'),\n });\n minLength(f.password, this.passwordMinLength(), {\n message: this.passwordErrorMessage(),\n });\n required(f.confirmPassword, {\n message: this.translate('auth.validation.confirm.password.required'),\n });\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(\n field: IRegistrationExtraField,\n ): 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 private readonly fieldInjectors = new Map<\n string,\n { injector: Injector; setField: (field: IRegistrationExtraField) => void }\n >();\n\n getFieldInjector(field: IRegistrationExtraField): Injector {\n const cached = this.fieldInjectors.get(field.key);\n if (cached) {\n cached.setField(field);\n return cached.injector;\n }\n\n let currentField = field;\n const extraFieldsModel = this.extraFieldsModel;\n const context: IRegistrationFieldTemplateContext = {\n get field() {\n return currentField;\n },\n get value() {\n return extraFieldsModel()[currentField.key] ?? currentField.defaultValue;\n },\n updateValue: (value: unknown) =>\n this.updateExtraField(currentField.key, value),\n };\n\n const injector = Injector.create({\n providers: [{ provide: REGISTRATION_FIELD_CONTEXT, useValue: context }],\n parent: field.injector ?? this.parentInjector,\n });\n this.fieldInjectors.set(field.key, {\n injector,\n setField: (next) => (currentField = next),\n });\n return injector;\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.required.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 const data = response.data;\n if (!data) return;\n\n if (data.requiresEmailVerification) {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : response.message,\n life: 5000,\n });\n this.router.navigate(['/auth/login']);\n return;\n }\n\n if (data.accessToken) {\n this.authState.setLoginState({\n accessToken: data.accessToken,\n user: data.user,\n company: data.company,\n branch: data.branch,\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(response.messageKey)\n : response.message,\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 { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, minLength, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { finalize } from 'rxjs';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { UiModule } from '@flusys/ng-ui';\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: [\n AngularModule,\n UiModule,\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(--f-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(--f-content-border-radius); background: var(--f-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\n for=\"newPassword\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.reset.password.new.password' | translate }}\n </label>\n <f-password\n [inputId]=\"'newPassword'\"\n [placeholder]=\"\n 'auth.reset.password.new.password.placeholder' | translate\n \"\n class=\"w-full mb-4\"\n [formField]=\"resetForm.newPassword\"\n autocomplete=\"new-password\"\n />\n\n <label\n for=\"confirmPassword\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.reset.password.confirm.password' | translate }}\n </label>\n <f-password\n [inputId]=\"'confirmPassword'\"\n [placeholder]=\"\n 'auth.reset.password.confirm.password.placeholder'\n | translate\n \"\n class=\"w-full mb-2\"\n [formField]=\"resetForm.confirmPassword\"\n autocomplete=\"new-password\"\n />\n\n @if (passwordMismatch()) {\n <small class=\"text-danger block mb-4\">{{\n 'auth.register.passwords.do.not.match' | translate\n }}</small>\n }\n\n <button\n fButton\n class=\"w-full mt-4 mb-4\"\n type=\"submit\"\n [disabled]=\"!canSubmit() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.reset.password.reset.password' | translate }}</span>\n </button>\n\n <div class=\"flex items-center justify-center gap-2\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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 <ui-icon name=\"check-circle\" class=\"text-6xl text-success\"></ui-icon>\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 <button\n fButton\n class=\"w-full\"\n >\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"times-circle\" class=\"text-6xl text-danger\"></ui-icon>\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 <button\n fButton\n class=\"w-full mb-4\"\n >\n <span pButtonLabel>{{\n 'auth.reset.password.request.new.link' | translate\n }}</span>\n </button>\n </a>\n <div class=\"mt-4\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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(TranslateService, {\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 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>({\n newPassword: '',\n confirmPassword: '',\n });\n readonly resetForm = form(this.formModel, (f) => {\n required(f.newPassword, {\n message: this.translate('auth.validation.password.required'),\n });\n minLength(f.newPassword, 8, {\n message: this.translate('auth.validation.password.min.length', {\n min: 8,\n }),\n });\n required(f.confirmPassword, {\n message: this.translate('auth.validation.confirm.password.required'),\n });\n });\n readonly passwordMismatch = computed(() => {\n const model = this.formModel();\n return (\n model.confirmPassword.length > 0 &&\n model.newPassword !== model.confirmPassword\n );\n });\n readonly canSubmit = computed(\n () => this.resetForm().valid() && !this.passwordMismatch(),\n );\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.required.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: (response) => {\n const r = response as unknown as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: r?.messageKey\n ? this.translate(r.messageKey, r.messageVariables)\n : r?.message,\n });\n this.pageState.set('success');\n },\n error: (error) => {\n const messageKey: string = error.error?.messageKey || '';\n const invalidTokenKeys = [\n 'auth.password.reset.token.expired',\n 'auth.password.reset.token.used',\n 'email.verification.token.invalid',\n ];\n if (invalidTokenKeys.includes(messageKey)) {\n this.pageState.set('invalid-token');\n }\n // Other errors handled by global interceptor\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, toSignal } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService, UiModule } from '@flusys/ng-ui';\nimport { finalize, firstValueFrom } from 'rxjs';\nimport {\n ICreateUserRequest,\n IUpdateUserRequest,\n IUser,\n} from '../../interfaces/user.interface';\nimport {\n AUTH_USER_FORM_EXTENSION,\n IUserFormExtraField,\n IUserFormFieldTemplateContext,\n USER_FORM_FIELD_CONTEXT,\n} from '../../providers/auth-extension.providers';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserPermissionApiService } from '../../services/user-permission-api.service';\n\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n phone: string;\n isActive: boolean;\n emailVerified: boolean;\n}\n\n@Component({\n selector: 'lib-user-form',\n imports: [UiModule, AngularModule, FormField, TranslatePipe],\n template: `\n <f-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 {{\n isEditMode()\n ? ('administrative.user.edit' | translate)\n : ('administrative.user.new' | translate)\n }}\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 <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'administrative.user.name' | translate }} *</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n [placeholder]=\"'administrative.user.name.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\"\n >{{ 'administrative.email.label' | translate }} *</label\n >\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"formTree.email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"password\" class=\"font-medium\">\n {{ 'administrative.user.password' | translate }}\n {{\n isEditMode()\n ? ('administrative.user.password.optional' | translate)\n : '*'\n }}\n </label>\n <f-password\n [inputId]=\"'password'\"\n [formField]=\"formTree.password\"\n [placeholder]=\"\n 'administrative.user.password.placeholder' | translate\n \"\n autocomplete=\"new-password\"\n />\n </div>\n\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">{{\n 'administrative.phone.label' | translate\n }}</label>\n <input\n fInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n [placeholder]=\"'auth.phone.placeholder' | translate\"\n />\n </div>\n\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 <ui-icon name=\"sliders-h\" class=\"mr-2\"></ui-icon\n >{{ 'profile.additional.info' | translate }}\n </div>\n @if (isLoadingExtraFields()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <f-skeleton height=\"2.5rem\" />\n <f-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.labelKey | translate: null : field.label\n }}{{ field.required ? ' *' : '' }}\n </label>\n @if (field.component) {\n <ng-container\n *ngComponentOutlet=\"\n field.component;\n injector: getFieldInjector(field)\n \"\n />\n } @else if (field.template) {\n <ng-container\n [ngTemplateOutlet]=\"field.template\"\n [ngTemplateOutletContext]=\"\n getFieldTemplateContext(field)\n \"\n />\n } @else {\n @switch (field.type) {\n @case ('text') {\n <input\n fInputText\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 fInputText\n type=\"number\"\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 fTextarea\n [id]=\"field.key\"\n [placeholder]=\"\n field.placeholderKey\n | translate: null : field.placeholder ?? ''\n \"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 <f-select\n [id]=\"field.key\"\n class=\"w-full\"\n [options]=\"field.options ?? []\"\n optionValue=\"value\"\n [ngModel]=\"getExtraFieldValue(field.key) ?? ''\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"\n updateExtraField(field.key, $event)\n \"\n [placeholder]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n ('shared.select' | translate)\n \"\n >\n <ng-template #item let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n <ng-template #selectedItem let-opt>{{\n opt.labelKey | translate: null : opt.label\n }}</ng-template>\n </f-select>\n }\n @case ('checkbox') {\n <f-checkbox\n [inputId]=\"field.key\"\n [checked]=\"\n $any(getExtraFieldValue(field.key) ?? false)\n \"\n (onChange)=\"\n updateExtraField(field.key, $event.checked)\n \"\n [label]=\"\n field.placeholderKey\n | translate\n : null\n : field.placeholder ??\n (field.labelKey\n | translate: null : field.label)\n \"\n />\n }\n @case ('date') {\n <input\n fInputText\n type=\"date\"\n [id]=\"field.key\"\n [value]=\"getExtraFieldValue(field.key) ?? ''\"\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 }\n </div>\n }\n\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <f-checkbox\n [formField]=\"formTree.isActive\"\n [label]=\"'shared.active' | translate\"\n />\n <f-checkbox\n [formField]=\"formTree.emailVerified\"\n [label]=\"'administrative.user.email.verified' | translate\"\n />\n </div>\n\n @if (companyFeatureEnabled() && !isEditMode()) {\n <div\n class=\"md:col-span-2 p-3 bg-primary/10 rounded-lg border border-primary/20\"\n >\n <div class=\"flex items-center gap-2 text-primary\">\n <ui-icon name=\"info-circle\"></ui-icon>\n <span class=\"text-sm\">\n {{ 'administrative.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 <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{\n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\n </div>\n </form>\n </f-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(TranslateService, {\n optional: true,\n });\n private readonly userFormExtension = inject(AUTH_USER_FORM_EXTENSION, {\n optional: true,\n });\n private readonly parentInjector = inject(Injector);\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 private readonly routeParams = toSignal(this.route.paramMap);\n private userLoadTriggered = false;\n\n readonly isLoading = signal(false);\n readonly existingUser = signal<IUser | null>(null);\n readonly isEditMode = computed(() => !!this.existingUser());\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n readonly currentCompanyName = computed(() => this.authState.companyName());\n readonly currentBranchName = computed(() => this.authState.branchName());\n\n readonly formModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n phone: '',\n isActive: true,\n emailVerified: false,\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.name.required'),\n });\n required(f.email, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, {\n message: this.translate('shared.invalid.email'),\n });\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\n .getExtraFields()\n .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(\n field: IUserFormExtraField,\n ): IUserFormFieldTemplateContext {\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 fieldInjectors = new Map<\n string,\n { injector: Injector; setField: (field: IUserFormExtraField) => void }\n >();\n\n getFieldInjector(field: IUserFormExtraField): Injector {\n const cached = this.fieldInjectors.get(field.key);\n if (cached) {\n cached.setField(field);\n return cached.injector;\n }\n\n let currentField = field;\n const extraFieldsModel = this.extraFieldsModel;\n const context: IUserFormFieldTemplateContext = {\n get field() {\n return currentField;\n },\n get value() {\n return extraFieldsModel()[currentField.key];\n },\n updateValue: (value: unknown) =>\n this.updateExtraField(currentField.key, value),\n };\n\n const injector = Injector.create({\n providers: [{ provide: USER_FORM_FIELD_CONTEXT, useValue: context }],\n parent: field.injector ?? this.parentInjector,\n });\n this.fieldInjectors.set(field.key, {\n injector,\n setField: (next) => (currentField = next),\n });\n return injector;\n }\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n const isEdit = this.isEditMode();\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 async loadUser(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.userService.findById(id);\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 } catch {\n this.router.navigate(['/administration/users']);\n } finally {\n this.isLoading.set(false);\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 as Record<string, unknown>);\n this.originalExtraFieldsModel.set(values as Record<string, unknown>);\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.required.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 async updateUser(): Promise<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 try {\n const [userResponse] = await Promise.all([\n this.userService.update(updateData),\n this.isExtraFieldsDirty() &&\n this.userFormExtension?.saveExtraFieldValues\n ? firstValueFrom(\n this.userFormExtension.saveExtraFieldValues(\n userId,\n this.extraFieldsModel(),\n ),\n )\n : Promise.resolve(undefined),\n ]);\n this.onSaveSuccess(\n userResponse.messageKey\n ? this.translate(\n userResponse.messageKey,\n userResponse.messageVariables as Record<string, string | number>,\n )\n : userResponse.message,\n );\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async createUser(): Promise<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 try {\n const response = await this.userService.insert(createData);\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(\n response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response.message,\n );\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private saveExtraFieldsForNewUser(userId: string): void {\n const extraFields = this.extraFieldsModel();\n const hasExtraData =\n Object.keys(extraFields).length > 0 &&\n Object.values(extraFields).some((v) => v !== undefined && v !== '');\n\n if (!hasExtraData || !this.userFormExtension?.saveExtraFieldValues) return;\n\n this.userFormExtension\n .saveExtraFieldValues(userId, extraFields)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ error: () => {} });\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: message,\n });\n this.router.navigate(['/administration/users']);\n }\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 this.permissionService\n .assignUserToCompany(userId, company.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n if (branch) {\n this.permissionService\n .assignUserToBranch(userId, branch.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ error: () => {} });\n }\n },\n error: () => {},\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/users']);\n }\n}\n","import { MessageService } from '@flusys/ng-ui';\nimport {\n Component,\n computed,\n inject,\n input,\n output,\n resource,\n signal,\n} from '@angular/core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface BranchWithAssignment extends IBranch {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-branch-permission-dialog',\n imports: [\n AngularModule,\n UiModule,\n TranslatePipe,\n ],\n template: `\n <f-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'administrative.permission.manage.branch' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color mb-3\">\n {{ 'administrative.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 >{{ 'shared.company' | translate }}:</label\n >\n <f-select\n [options]=\"companiesResource.value() ?? []\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'administrative.company.select' | translate\"\n styleClass=\"w-full\"\n [disabled]=\"isInitialLoading() || isSaving()\"\n />\n </div>\n </div>\n\n @if (isInitialLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <f-progressspinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (branch of branchesResource.value() ?? []; track branch.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <f-checkbox\n [ngModel]=\"branch.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'branch-' + branch.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onBranchToggle(branch, $event.checked)\"\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 ((companiesResource.value() ?? []).length === 0) {\n {{ 'administrative.permission.no.company' | translate }}<br />\n <span class=\"text-xs\">{{\n 'administrative.permission.assign.company.first' | translate\n }}</span>\n } @else if (!selectedCompanyId()) {\n {{\n 'administrative.permission.select.company.for.branches'\n | translate\n }}\n } @else {\n {{ 'administrative.branch.no.branches' | translate }}\n }\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onClose()\"\n [disabled]=\"isSaving()\"\n >\n <span pButtonLabel>{{ 'shared.close' | translate }}</span>\n </button>\n </ng-template>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, unknown>): 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 isSaving = signal(false);\n readonly selectedCompanyId = signal<string | null>(null);\n\n readonly companiesResource = resource({\n params: () => {\n const user = this.user();\n if (!this.visible() || !user) return undefined;\n return { userId: user.id };\n },\n loader: async ({ params }) => {\n const response = await firstValueFrom(\n this.permissionApi.getUserCompanies(params!.userId),\n );\n this.selectedCompanyId.set(null);\n return (response.data ?? []).map((p) => ({\n id: p.companyId,\n name: p.companyName,\n }));\n },\n });\n\n readonly branchesResource = resource({\n params: () => {\n const user = this.user();\n const companyId = this.selectedCompanyId();\n if (!user || !companyId) return undefined;\n return { userId: user.id, companyId };\n },\n loader: async ({ params }) => {\n const [branchesResponse, assignedResponse] = await Promise.all([\n this.branchApi.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { companyId: params!.companyId },\n select: [],\n sort: {},\n }),\n firstValueFrom(this.permissionApi.getUserBranches(params!.userId)),\n ]);\n\n const assignedIds = new Set(\n (assignedResponse.data ?? [])\n .filter((p) => p.companyId === params!.companyId)\n .map((p) => p.branchId),\n );\n\n return (branchesResponse.data ?? []).map((branch) => ({\n ...branch,\n isAssigned: assignedIds.has(branch.id),\n }));\n },\n });\n\n readonly isInitialLoading = computed(\n () => this.branchesResource.isLoading() && !this.branchesResource.value(),\n );\n\n async onBranchToggle(\n branch: BranchWithAssignment,\n isAssigned: boolean,\n ): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToBranch(currentUser.id, branch.id),\n );\n if (response.success) {\n const r = response;\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: r?.messageKey\n ? this.t(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.permissionsChanged.emit();\n this.branchesResource.reload();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromBranch(currentUser.id, branch.id),\n );\n if (response.success) {\n const r = response;\n this.messageService.add({\n severity: 'success',\n summary: this.t('shared.success'),\n detail: r?.messageKey\n ? this.t(r.messageKey, r.messageVariables)\n : (r?.message ?? ''),\n });\n this.permissionsChanged.emit();\n this.branchesResource.reload();\n }\n }\n } catch {\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { MessageService } from '@flusys/ng-ui';\nimport {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\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';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface CompanyWithAssignment extends ICompany {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-company-permission-dialog',\n imports: [\n AngularModule,\n UiModule,\n TranslatePipe,\n ],\n template: `\n <f-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n [header]=\"'administrative.permission.manage.company' | translate\"\n (onHide)=\"onClose()\"\n >\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color\">\n {{ 'administrative.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 <f-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 <f-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 {{ 'administrative.company.no.companies' | translate }}\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onClose()\"\n [disabled]=\"isSaving()\"\n >\n <span pButtonLabel>{{ 'shared.close' | translate }}</span>\n </button>\n </ng-template>\n </f-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(TranslateService, {\n optional: true,\n });\n\n private t(key: string, params?: Record<string, unknown>): 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 this.companyApi.getAll({\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n select: [],\n sort: {},\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: response?.messageKey\n ? this.t(response.messageKey, response.messageVariables)\n : (response?.message ?? ''),\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: response?.messageKey\n ? this.t(response.messageKey, response.messageVariables)\n : (response?.message ?? ''),\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 { Component, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { ConfirmationService, MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n USER_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { UserBranchPermissionDialogComponent } from '../../components/user-branch-permission-dialog.component';\nimport { UserCompanyPermissionDialogComponent } from '../../components/user-company-permission-dialog.component';\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 { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-user-list',\n imports: [UiModule, AngularModule,\n HasPermissionDirective,\n TranslatePipe,\n UserCompanyPermissionDialogComponent,\n UserBranchPermissionDialogComponent,],\n template: `\n <f-card>\n <ng-template #header>\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\"\n >\n <h2 class=\"text-xl font-semibold m-0\">\n {{ 'administrative.user.title' | translate }}\n </h2>\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'administrative.user.add' | translate }}</span>\n </button>\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <f-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 >\n <ng-template #header>\n <tr>\n <th>{{ 'administrative.user.name' | translate }}</th>\n <th>{{ 'administrative.email.label' | translate }}</th>\n <th>{{ 'administrative.phone.label' | translate }}</th>\n <th>{{ 'administrative.user.email.verified' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n @for (col of extraColumns(); track col.key) {\n <th\n [class]=\"col.styleClass ?? ''\"\n [style.width]=\"col.width ?? 'auto'\"\n >\n {{ col.headerKey | translate: null : 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 <f-tag\n [value]=\"\n user.emailVerified\n ? ('shared.verified' | translate)\n : ('shared.unverified' | translate)\n \"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\"\n />\n </td>\n <td>\n <f-tag\n [value]=\"\n user.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"user.isActive ? 'success' : 'danger'\"\n />\n </td>\n @for (col of extraColumns(); track col.key) {\n <td [class]=\"col.styleClass ?? ''\">\n @if (col.template) {\n <ng-container\n [ngTemplateOutlet]=\"col.template\"\n [ngTemplateOutletContext]=\"{ $implicit: user }\"\n />\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 <button\n fButton\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [fTooltip]=\"'shared.view.details' | translate\"\n (click)=\"onViewDetails(user)\"\n >\n <ui-icon pButtonIcon name=\"eye\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(user)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (companyFeatureEnabled()) {\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [fTooltip]=\"\n 'administrative.permission.company.permissions'\n | translate\n \"\n (click)=\"onManageCompanyPermissions(user)\"\n >\n <ui-icon pButtonIcon name=\"building\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n [fTooltip]=\"\n 'administrative.permission.branch.permissions'\n | translate\n \"\n (click)=\"onManageBranchPermissions(user)\"\n >\n <ui-icon pButtonIcon name=\"sitemap\"></ui-icon>\n </button>\n }\n @for (action of extraActions(); track action.key) {\n @if (isActionVisible(action, user)) {\n <button\n fButton\n [rounded]=\"true\"\n [text]=\"true\"\n [severity]=\"action.severity ?? 'secondary'\"\n [fTooltip]=\"\n action.labelKey | translate: null : action.label\n \"\n [disabled]=\"isActionDisabled(action, user)\"\n (click)=\"onExtraAction(action, user)\"\n >\n <ui-icon pButtonIcon [name]=\"action.icon\"></ui-icon>\n </button>\n }\n }\n <button\n fButton\n *hasPermission=\"USER_PERMISSIONS.DELETE\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDelete(user)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\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 {{ 'administrative.user.no.users' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </f-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\n <lib-user-branch-permission-dialog\n [visible]=\"showBranchDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showBranchDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\"\n />\n }\n\n @if (hasUserDetailView() && showUserDetailDialog()) {\n <f-dialog\n [header]=\"'administrative.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 >\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\">{{\n 'administrative.user.name' | translate\n }}</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\">{{\n 'administrative.email.label' | translate\n }}</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\">{{\n 'administrative.phone.label' | translate\n }}</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\">{{\n 'shared.status' | translate\n }}</label>\n <f-tag\n [value]=\"\n user.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"user.isActive ? 'success' : 'danger'\"\n />\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-muted-color\">{{\n 'administrative.user.email.verified' | translate\n }}</label>\n <f-tag\n [value]=\"\n user.emailVerified\n ? ('shared.verified' | translate)\n : ('shared.unverified' | translate)\n \"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\"\n />\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\">{{\n col.headerKey | translate: null : col.header\n }}</label>\n <span class=\"text-color\">{{\n getFieldValue(user, col.field ?? col.key) ?? '-'\n }}</span>\n </div>\n }\n </div>\n <div class=\"flex justify-end gap-2 mt-6\">\n @if (userDetailConfig?.allowEdit) {\n <button\n fButton\n (click)=\"onEdit(user); closeUserDetailDialog()\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n <span pButtonLabel>{{ 'shared.edit' | translate }}</span>\n </button>\n }\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"closeUserDetailDialog()\"\n >\n <span pButtonLabel>{{ 'shared.close' | translate }}</span>\n </button>\n </div>\n }\n </f-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, {\n optional: true,\n });\n readonly userDetailConfig = inject(AUTH_USER_DETAIL_CONFIG, {\n optional: true,\n });\n private readonly translateAdapter = inject(TranslateService, {\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 users = this.userService.data;\n readonly isLoading = this.userService.isLoading;\n readonly total = this.userService.total;\n readonly companyFeatureEnabled = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\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(\n user: IUser,\n dialogSignal: typeof this.showCompanyDialog,\n ): 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', {\n name: user.name,\n }),\n header: this.translate('administrative.user.delete.title'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.userService.delete({\n id: user.id,\n type: 'delete',\n });\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response.message,\n });\n this.userService.reload();\n } catch {}\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 { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n email as emailValidator,\n form,\n FormField,\n required,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\nconst VERIFY_EMAIL_KEY = makeStateKey<'success' | 'error'>(\n 'verify-email-result',\n);\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: [\n AngularModule,\n UiModule,\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(--f-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(--f-content-border-radius); background: var(--f-content-background)\"\n >\n @switch (pageState()) {\n @case ('verifying') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"loader-circle\" spin class=\"text-8xl text-primary\"></ui-icon>\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 <ui-icon name=\"check-circle\" class=\"text-8xl text-success\"></ui-icon>\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 <button\n fButton\n class=\"w-full\"\n >\n <span pButtonLabel>{{ 'auth.login.sign.in' | translate }}</span>\n </button>\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <ui-icon name=\"times-circle\" class=\"text-8xl text-danger\"></ui-icon>\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 <button\n fButton\n class=\"w-full mb-4\"\n (click)=\"showResendForm()\"\n >\n <span pButtonLabel>{{ 'auth.verify.email.resend.email' | translate }}</span>\n </button>\n <div class=\"mt-4\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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\n for=\"email\"\n class=\"block text-lg font-medium mb-2 text-color\"\n >\n {{ 'auth.email.label' | translate }}\n </label>\n <input\n fInputText\n id=\"email\"\n type=\"email\"\n [placeholder]=\"'auth.email.placeholder' | translate\"\n class=\"w-full mb-6\"\n [formField]=\"resendForm.email\"\n autocomplete=\"email\"\n />\n\n <button\n fButton\n class=\"w-full mb-4\"\n type=\"submit\"\n [disabled]=\"!isResendFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'auth.verify.email.resend' | translate }}</span>\n </button>\n\n <div class=\"flex items-center justify-center gap-2\">\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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 <ui-icon name=\"envelope\" class=\"text-8xl text-primary\"></ui-icon>\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n {{ 'auth.verify.email.sent' | translate }}\n </p>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\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(TranslateService, {\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 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, {\n message: this.translate('auth.validation.email.required'),\n });\n emailValidator(f.email, {\n message: this.translate('shared.invalid.email'),\n });\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(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) =>\n this.handleResendComplete(email, response.messageKey),\n error: () => {\n //handle by interceptor\n this.isLoading.set(false);\n },\n });\n }\n\n private handleResendComplete(email: string, messageKey?: string): void {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate(messageKey ?? '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","i2","emailValidator","i3","i1","i4"],"mappings":"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"}