@flusys/ng-auth 1.0.0-rc → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/fesm2022/flusys-ng-auth.mjs +511 -1161
- package/fesm2022/flusys-ng-auth.mjs.map +1 -1
- package/package.json +12 -12
- package/types/flusys-ng-auth.d.ts +65 -663
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-auth.mjs","sources":["../../../projects/ng-auth/interfaces/auth.interface.ts","../../../projects/ng-auth/interfaces/branch.interface.ts","../../../projects/ng-auth/interfaces/company.interface.ts","../../../projects/ng-auth/interfaces/user-permission.interface.ts","../../../projects/ng-auth/interfaces/user.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/routes/auth.routes.ts","../../../projects/ng-auth/adapters/auth-layout-adapter.ts","../../../projects/ng-auth/adapters/auth-user-provider.adapter.ts","../../../projects/ng-auth/adapters/auth-company-api-provider.adapter.ts","../../../projects/ng-auth/adapters/auth-user-permission-provider.adapter.ts","../../../projects/ng-auth/adapters/auth-state-provider.adapter.ts","../../../projects/ng-auth/providers/auth-layout.providers.ts","../../../projects/ng-auth/providers/auth-providers.ts","../../../projects/ng-auth/pages/administration/administration-page.component.ts","../../../projects/ng-auth/pages/branch/branch-form.component.ts","../../../projects/ng-auth/pages/branch/branch-list.component.ts","../../../projects/ng-auth/pages/company/company-form.component.ts","../../../projects/ng-auth/pages/company/company-list.component.ts","../../../projects/ng-auth/pages/forgot-password/forgot-password-page.component.ts","../../../projects/ng-auth/pages/login/login-page.component.ts","../../../projects/ng-auth/pages/profile/profile-page.component.ts","../../../projects/ng-auth/pages/register/register-page.component.ts","../../../projects/ng-auth/pages/reset-password/reset-password-page.component.ts","../../../projects/ng-auth/pages/users/user-form.component.ts","../../../projects/ng-auth/components/user-company-permission-dialog.component.ts","../../../projects/ng-auth/components/user-branch-permission-dialog.component.ts","../../../projects/ng-auth/pages/users/user-list.component.ts","../../../projects/ng-auth/pages/verify-email/verify-email-page.component.ts","../../../projects/ng-auth/public-api.ts","../../../projects/ng-auth/flusys-ng-auth.ts"],"sourcesContent":["// AUTH INTERFACES - Matching NestJS Auth Package DTOs\n\n// REQUEST INTERFACES\n\n/**\n * Login Request Interface\n */\nexport interface ILoginRequest {\n email: string;\n password: string;\n}\n\n/**\n * Registration Request Interface\n * Supports both simple registration and company-based registration\n */\nexport interface IRegistrationRequest {\n name: string;\n email: string;\n password: string;\n phone?: string;\n\n // Company Feature Fields (Optional - only used when company feature is enabled)\n companySlug?: string;\n branchSlug?: string;\n\n // New Company Creation Fields\n newCompanyName?: string;\n newCompanyPhone?: string;\n newCompanyAddress?: string;\n}\n\n/**\n * Select Company & Branch Request Interface\n * Used after login when user needs to select company and branch\n */\nexport interface ISelectRequest {\n sessionId: string;\n companyId: string;\n branchId: string;\n}\n\n/**\n * Switch Company Request Interface\n * Used to switch company/branch after login\n */\nexport interface ISwitchCompanyRequest {\n companyId: string;\n branchId: string;\n}\n\n/**\n * Change Password Request Interface\n */\nexport interface IChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\n// RESPONSE INTERFACES - Helper/Nested DTOs\n\n/**\n * User Info Interface (used in responses)\n */\nexport interface IUserInfo {\n id: string;\n email: string;\n name?: string;\n phone?: string | null;\n profilePictureId?: string | null;\n\n // Company context (from JWT - only when company feature enabled)\n companyId?: string;\n branchId?: string;\n companyLogoId?: string;\n branchLogoId?: string;\n}\n\n/**\n * Company Info Interface (used in responses)\n */\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug?: string;\n logoId?: string | null;\n}\n\n/**\n * Branch Info Interface (used in responses)\n */\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug?: string;\n logoId?: string | null;\n}\n\n/**\n * Branch Selection Info Interface (with additional fields)\n */\nexport interface IBranchSelectionInfo {\n id: string;\n name: string;\n slug: string;\n isActive: boolean;\n logoId?: string | null;\n}\n\n/**\n * Company with Branches Interface (for selection response)\n */\nexport interface ICompanyWithBranches {\n id: string;\n name: string;\n slug: string;\n isActive: boolean;\n logoId?: string | null;\n branches: IBranchSelectionInfo[];\n}\n\n// RESPONSE INTERFACES - Main Responses\n\n/**\n * Login Response Interface\n * Returned on successful login with tokens\n */\nexport interface ILoginResponse {\n accessToken: string;\n refreshToken: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n companyFeatureEnabled?: boolean;\n}\n\n/**\n * Me Response Interface\n * Returned by GET /auth/me endpoint\n * Contains only user data, no tokens\n */\nexport interface IMeResponse {\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\n/**\n * Registration Response Interface\n * Returned on successful registration\n */\nexport interface IRegistrationResponse {\n accessToken?: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n companyFeatureEnabled?: boolean;\n requiresEmailVerification?: boolean;\n}\n\n/**\n * Company Selection Response Interface\n * Returned when user has multiple companies/branches to choose from\n */\nexport interface ICompanySelectionResponse {\n requiresSelection: true;\n sessionId: string;\n expiresAt: Date | string;\n user: IUserInfo;\n companies: ICompanyWithBranches[];\n}\n\n/**\n * Refresh Token Response Interface\n */\nexport interface IRefreshTokenResponse {\n accessToken: string;\n refreshToken?: string;\n}\n\n/**\n * Login Response when email verification required\n */\nexport interface ILoginRequiresEmailVerification {\n requiresEmailVerification: true;\n email: string;\n message: string;\n}\n\n/**\n * Auth Response Type - Can be login success, company selection, or email verification required\n */\nexport type AuthResponse = ILoginResponse | ICompanySelectionResponse | ILoginRequiresEmailVerification;\n\n/**\n * Type guard to check if response requires email verification\n */\nexport function isEmailVerificationRequired(\n response: AuthResponse\n): response is ILoginRequiresEmailVerification {\n return 'requiresEmailVerification' in response && response.requiresEmailVerification === true;\n}\n\n/**\n * Type guard to check if response requires company selection\n */\nexport function isCompanySelectionResponse(\n response: AuthResponse\n): response is ICompanySelectionResponse {\n return 'requiresSelection' in response && response.requiresSelection === true;\n}\n\n/**\n * Type guard to check if response is a successful login\n */\nexport function isLoginResponse(response: AuthResponse): response is ILoginResponse {\n return 'accessToken' in response && !('requiresSelection' in response) && !('requiresEmailVerification' in response);\n}\n\n","// =============================================================================\n// BRANCH INTERFACES - Matching NestJS Auth Package DTOs\n// =============================================================================\n\n/**\n * Create Company Branch Request Interface\n */\nexport interface ICreateBranchRequest {\n name: string;\n slug: string;\n companyId: string;\n parentId?: string;\n logoId?: string;\n address?: string;\n phone?: string;\n email?: string;\n serial?: number;\n isActive?: boolean;\n additionalFields?: Record<string, unknown>;\n}\n\n/**\n * Update Company Branch Request Interface\n */\nexport interface IUpdateBranchRequest extends Partial<Omit<ICreateBranchRequest, 'companyId'>> {\n id: string;\n}\n\n/**\n * Company Branch Response Interface\n */\nexport interface IBranch {\n id: string;\n name: string;\n slug: string;\n companyId: string;\n parentId?: string | null;\n logoId?: string | null;\n address?: string | null;\n phone?: string | null;\n email?: string | null;\n serial?: number;\n isActive: boolean;\n readOnly: boolean;\n additionalFields?: Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n","// =============================================================================\n// COMPANY INTERFACES - Matching NestJS Auth Package DTOs\n// =============================================================================\n\n/**\n * Create Company Request Interface\n */\nexport interface ICreateCompanyRequest {\n name: string;\n slug: string;\n logoId?: string;\n address?: string;\n phone?: string;\n email?: string;\n website?: string;\n serial?: number;\n isActive?: boolean;\n settings?: Record<string, unknown>;\n additionalFields?: Record<string, unknown>;\n}\n\n/**\n * Update Company Request Interface\n */\nexport interface IUpdateCompanyRequest extends Partial<ICreateCompanyRequest> {\n id: string;\n}\n\n/**\n * Company Response Interface\n */\nexport interface ICompany {\n id: string;\n name: string;\n slug: string;\n logoId?: string | null;\n address?: string | null;\n phone?: string | null;\n email?: string | null;\n website?: string | null;\n serial?: number;\n isActive: boolean;\n readOnly: boolean;\n settings?: Record<string, unknown> | null;\n additionalFields?: Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n","// =============================================================================\n// USER PERMISSION INTERFACES - Matching NestJS Auth Package DTOs\n// =============================================================================\n\n/**\n * Permission item for batch assignment/revocation\n */\nexport interface IPermissionItem {\n /** Target ID (Company ID or Branch ID) */\n targetId: string;\n /** Action: true to add permission, false to remove permission */\n isAdd: boolean;\n}\n\n/**\n * Batch assign/revoke user-company permissions request\n */\nexport interface IAssignUserCompanyRequest {\n /** User ID to assign/revoke permissions for */\n userId: string;\n /** List of company permissions to add or remove */\n items: IPermissionItem[];\n}\n\n/**\n * Batch assign/revoke user-branch permissions request\n */\nexport interface IAssignUserBranchRequest {\n /** User ID to assign/revoke permissions for */\n userId: string;\n /** List of branch permissions to add or remove */\n items: IPermissionItem[];\n}\n\n/**\n * User company permission with populated company details\n */\nexport interface IUserCompanyPermission {\n /** Permission ID */\n id: string;\n /** User ID */\n userId: string;\n /** Company ID */\n companyId: string;\n /** Company name */\n companyName: string;\n /** Company slug */\n companySlug: string;\n}\n\n/**\n * User branch permission with populated branch details\n */\nexport interface IUserBranchPermission {\n /** Permission ID */\n id: string;\n /** User ID */\n userId: string;\n /** Branch ID */\n branchId: string;\n /** Branch name */\n branchName: string;\n /** Branch slug */\n branchSlug: string;\n /** Company ID this branch belongs to */\n companyId: string;\n}\n\n/**\n * Response for user companies\n */\nexport interface IUserCompaniesResponse {\n data: IUserCompanyPermission[];\n}\n\n/**\n * Response for user branches\n */\nexport interface IUserBranchesResponse {\n data: IUserBranchPermission[];\n}\n\n/**\n * Batch operation result response\n */\nexport interface IBatchOperationResponse {\n success: boolean;\n message: string;\n}\n","// =============================================================================\n// USER INTERFACES - Matching NestJS Auth Package DTOs\n// =============================================================================\n\n/**\n * Create User Request Interface\n */\nexport interface ICreateUserRequest {\n name: string;\n email: string;\n password: string;\n phone?: string;\n profilePictureId?: string;\n isActive?: boolean;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n additionalFields?: Record<string, unknown>;\n}\n\n/**\n * Update User Request Interface\n */\nexport interface IUpdateUserRequest {\n id: string;\n name?: string;\n email?: string;\n password?: string;\n phone?: string;\n profilePictureId?: string;\n isActive?: boolean;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n additionalFields?: Record<string, unknown>;\n}\n\n/**\n * User Response Interface\n */\nexport interface IUser {\n id: string;\n name: string;\n email: string;\n phone?: string | null;\n profilePictureId?: string | null;\n isActive: boolean;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastLoginAt?: Date | string | null;\n additionalFields?: Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n deletedAt?: Date | string | null;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl } from '@flusys/ng-core';\nimport { IMessageResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n AuthResponse,\n IChangePasswordRequest,\n ILoginRequest,\n ILoginResponse,\n IMeResponse,\n IRefreshTokenResponse,\n IRegistrationRequest,\n IRegistrationResponse,\n ISelectRequest,\n ISwitchCompanyRequest,\n} from '../interfaces/auth.interface';\n\n/**\n * Auth API Service\n * Handles all authentication-related API calls matching NestJS auth endpoints\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthApiService {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl: string;\n\n constructor() {\n this.baseUrl = getServiceUrl(this.appConfig, 'auth');\n }\n\n /**\n * Login with email and password\n * Returns either:\n * - ILoginResponse (direct login success)\n * - ICompanySelectionResponse (requires company/branch selection)\n */\n login(data: ILoginRequest): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.baseUrl}/login`, data);\n }\n\n /**\n * Register new user\n * Supports simple registration and company-based registration\n * Returns RegistrationResponse directly (not wrapped in SingleResponse)\n */\n register(data: IRegistrationRequest): Observable<IRegistrationResponse> {\n return this.http.post<IRegistrationResponse>(\n `${this.baseUrl}/register`,\n data,\n );\n }\n\n /**\n * Select company and branch after login\n * Used when login returns requiresSelection: true\n * Returns LoginResponse directly (not wrapped)\n */\n select(data: ISelectRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/select`, data);\n }\n\n /**\n * Switch company/branch for logged-in user\n * Returns LoginResponse directly (not wrapped)\n */\n switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(\n `${this.baseUrl}/switch-company`,\n data,\n );\n }\n\n /**\n * Refresh access token\n * Refresh token is sent via HTTP-only cookie\n * Returns RefreshTokenResponse directly (not wrapped)\n */\n refresh(): Observable<IRefreshTokenResponse> {\n return this.http.post<IRefreshTokenResponse>(`${this.baseUrl}/refresh`, {});\n }\n\n /**\n * Get current user info\n * Returns only user data (no tokens) - IMeResponse\n */\n me(): Observable<IMeResponse> {\n return this.http.post<IMeResponse>(`${this.baseUrl}/me`, {});\n }\n\n /**\n * Logout current user\n */\n logout(): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/logout`, {});\n }\n\n /**\n * Change password for logged-in user\n */\n changePassword(data: IChangePasswordRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/change-password`,\n data,\n );\n }\n\n /**\n * Send forgot password email\n */\n forgotPassword(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/forgot-password`, {\n email,\n });\n }\n\n /**\n * Reset password with token\n */\n resetPassword(\n token: string,\n newPassword: string,\n ): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/reset-password`, {\n token,\n newPassword,\n });\n }\n\n /**\n * Resend verification email (unauthenticated)\n */\n resendVerification(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/resend-verification`,\n { email },\n );\n }\n\n /**\n * Verify email with token\n * Returns IMessageResponse for existing user verification\n * Returns IRegistrationResponse for pending registration completion\n */\n verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse> {\n return this.http.post<IMessageResponse | IRegistrationResponse>(`${this.baseUrl}/verify-email`, {\n token,\n });\n }\n}\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ICompanySelectionResponse,\n ICompanyWithBranches,\n ILoginResponse,\n IUserInfo,\n} from '../interfaces/auth.interface';\n\n/**\n * Storage keys (static constants)\n * NOTE: Access token is NOT stored - kept in memory only for security (XSS protection)\n * Only token expiry is stored to know when refresh is needed on page load\n */\nconst STORAGE = {\n TOKEN_EXPIRY: 'tokenExpiresAt', // Store expiry time, not the token itself\n COMPANY_ID: 'selectedCompanyId',\n BRANCH_ID: 'selectedBranchId',\n} as const;\n\n/**\n * Auth State Service\n * Minimal signal-based state management for authentication\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n // DI Injection\n private readonly appConfig = inject(APP_CONFIG);\n private readonly router = inject(Router);\n\n // Core State (private writable, public readonly)\n private readonly _user = signal<IUserInfo | null>(null);\n private readonly _accessToken = signal<string>(''); // Memory-only, not persisted\n private readonly _tokenExpiresAt = signal<number | null>(null); // Token expiry timestamp\n private readonly _company = signal<ICompanyInfo | null>(null);\n private readonly _branch = signal<IBranchInfo | null>(null);\n\n readonly user = this._user.asReadonly();\n readonly accessToken = this._accessToken.asReadonly();\n readonly tokenExpiresAt = this._tokenExpiresAt.asReadonly();\n readonly company = this._company.asReadonly();\n readonly branch = this._branch.asReadonly();\n\n // Company Selection State (temporary during login flow)\n private readonly _selectionSessionId = signal<string | null>(null);\n private readonly _availableCompanies = signal<ICompanyWithBranches[]>([]);\n private readonly _selectionExpiresAt = signal<Date | null>(null);\n\n readonly selectionSessionId = this._selectionSessionId.asReadonly();\n readonly availableCompanies = this._availableCompanies.asReadonly();\n readonly selectionExpiresAt = this._selectionExpiresAt.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 /**\n * Check if we need to refresh on app load (token expired but refresh cookie may exist)\n */\n readonly needsRefreshOnLoad = computed(() => {\n const expiresAt = this._tokenExpiresAt();\n const hasToken = !!this._accessToken();\n // Need refresh if: we have stored expiry (was logged in) but no current token\n return expiresAt !== null && !hasToken;\n });\n\n // Config-derived states\n readonly tenantId = computed(\n () => this.appConfig.multiTenant.tenantId ?? null,\n );\n\n constructor() {\n // Auto-persist token expiry (NOT the token itself - security)\n effect(() => {\n const expiresAt = this._tokenExpiresAt();\n expiresAt\n ? this.store(STORAGE.TOKEN_EXPIRY, expiresAt.toString())\n : this.remove(STORAGE.TOKEN_EXPIRY);\n });\n\n // Auto-persist company/branch IDs\n effect(() => {\n const companyId = this._company()?.id;\n const branchId = this._branch()?.id;\n companyId\n ? this.store(STORAGE.COMPANY_ID, companyId)\n : this.remove(STORAGE.COMPANY_ID);\n branchId\n ? this.store(STORAGE.BRANCH_ID, branchId)\n : this.remove(STORAGE.BRANCH_ID);\n });\n\n // Load initial state from storage (expiry only, not token)\n this.loadFromStorage();\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n setLoginState(response: ILoginResponse): void {\n this._accessToken.set(response.accessToken);\n this._user.set(response.user);\n this._company.set(response.company ?? null);\n this._branch.set(response.branch ?? null);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(response.accessToken);\n this._tokenExpiresAt.set(expiry);\n this.clearSelectionState();\n }\n\n setSelectionState(response: ICompanySelectionResponse): void {\n this._selectionSessionId.set(response.sessionId);\n this._availableCompanies.set(response.companies);\n this._selectionExpiresAt.set(new Date(response.expiresAt));\n this._user.set(response.user);\n }\n\n clearSelectionState(): void {\n this._selectionSessionId.set(null);\n this._availableCompanies.set([]);\n this._selectionExpiresAt.set(null);\n }\n\n resetState(): void {\n this._user.set(null);\n this._accessToken.set('');\n this._tokenExpiresAt.set(null);\n this._company.set(null);\n this._branch.set(null);\n this.clearSelectionState();\n Object.values(STORAGE).forEach((key) => this.remove(key));\n }\n\n // ==========================================================================\n // Individual Setters (for external use where needed)\n // ==========================================================================\n\n setUser(user: IUserInfo | null): void {\n this._user.set(user);\n }\n\n setAccessToken(token: string): void {\n this._accessToken.set(token);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(token);\n this._tokenExpiresAt.set(expiry);\n }\n\n setCompany(company: ICompanyInfo | null): void {\n this._company.set(company);\n }\n\n setBranch(branch: IBranchInfo | null): void {\n this._branch.set(branch);\n }\n\n // ==========================================================================\n // Navigation Helpers\n // ==========================================================================\n\n navigateToLogin(returnUrl?: string): void {\n this.router.navigate(\n ['/auth/login'],\n returnUrl ? { queryParams: { returnUrl } } : {},\n );\n }\n\n navigateAfterLogin(returnUrl?: string): void {\n // Validate returnUrl to prevent open redirect attacks\n const safeUrl = this.isValidReturnUrl(returnUrl) ? returnUrl : '/';\n this.router.navigateByUrl(safeUrl);\n }\n\n /** Validates a return URL to prevent open redirect attacks */\n private isValidReturnUrl(url: string | undefined): url is string {\n if (!url) return false;\n // Must start with '/' and not contain protocol indicators\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n }\n\n // Storage accessors (used by components)\n getStoredCompanyId(): string | null {\n return this.get(STORAGE.COMPANY_ID);\n }\n\n getStoredBranchId(): string | null {\n return this.get(STORAGE.BRANCH_ID);\n }\n\n // Storage helpers\n private loadFromStorage(): void {\n if (typeof window === 'undefined') 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 (typeof window !== 'undefined') localStorage.setItem(key, value);\n }\n\n private get(key: string): string | null {\n return typeof window !== 'undefined' ? localStorage.getItem(key) : null;\n }\n\n private remove(key: string): void {\n if (typeof window !== 'undefined') localStorage.removeItem(key);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n catchError,\n finalize,\n map,\n Observable,\n of,\n shareReplay,\n switchMap,\n tap,\n timeout,\n} from 'rxjs';\nimport { AuthApiService } from './auth-api.service';\nimport { AuthStateService } from './auth-state.service';\n\n/**\n * Auth Initialization Service\n * Handles app startup authentication flow:\n * 1. Check if user has valid session (via refresh token cookie)\n * 2. Restore user state from /auth/me\n * 3. Handle company selection if needed\n *\n * IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthInitService {\n private readonly authState = inject(AuthStateService);\n private readonly authApi = inject(AuthApiService);\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n\n /** Whether initial auth check has completed */\n readonly initialized = signal(false);\n\n /** Whether auth check is in progress */\n readonly loading = signal(false);\n\n /** Error from auth check */\n readonly error = signal<string | null>(null);\n\n /** Cached initialization observable to prevent duplicate calls */\n private initializationCache$: Observable<boolean> | null = null;\n\n /**\n * Initialize authentication state on app startup.\n *\n * Flow:\n * 1. If already authenticated with user data -> done\n * 2. Try refresh token (via cookie) -> get new access token\n * 3. Call /auth/me to get user info\n * 4. Update state accordingly\n *\n * Uses shareReplay to prevent duplicate initialization calls.\n */\n initialize(): Observable<boolean> {\n /**\n * 1. Already authenticated with full state\n */\n if (this.authState.isAuthenticated() && this.authState.user()) {\n this.initialized.set(true);\n return of(true);\n }\n\n /**\n * 2. Prevent infinite retry loops\n */\n if (this.initialized()) {\n return of(this.authState.isAuthenticated());\n }\n\n /**\n * 3. Reuse in-flight initialization\n */\n if (this.initializationCache$) {\n return this.initializationCache$;\n }\n\n this.loading.set(true);\n this.error.set(null);\n\n /**\n * 4. Start initialization\n * Timeout after 5 seconds to prevent app stability issues\n */\n this.initializationCache$ = this.authApi.refresh().pipe(\n timeout(5000),\n switchMap((refreshResponse) => {\n // Set access token from refresh\n this.authState.setAccessToken(refreshResponse.accessToken);\n // Fetch user profile\n return this.authApi.me().pipe(\n map((meResponse) => {\n const { user, company, branch } = meResponse;\n\n this.authState.setUser(user);\n\n if (this.appConfig.enableCompanyFeature) {\n this.authState.setCompany(company ?? null);\n this.authState.setBranch(branch ?? null);\n }\n\n return true;\n }),\n );\n }),\n\n tap(() => {\n this.initialized.set(true);\n this.loading.set(false);\n }),\n\n catchError((err) => {\n this.loading.set(false);\n // Always mark as initialized to prevent retry loops\n this.initialized.set(true);\n\n const errorMessage =\n err?.error?.message || err?.message || 'Authentication failed';\n\n const isCompanyError =\n errorMessage.includes('no company assigned') ||\n errorMessage.includes('Company with ID') ||\n errorMessage.includes('Please select a company') ||\n errorMessage.includes('Branch with ID');\n\n this.error.set(errorMessage);\n\n if (isCompanyError && this.appConfig.enableCompanyFeature) {\n // Keep token, force company selection\n this.authState.setUser(null);\n this.authState.setCompany(null);\n this.authState.setBranch(null);\n } else {\n // Full logout - but keep initialized=true to prevent retry\n this.authState.resetState();\n }\n\n return of(false);\n }),\n\n shareReplay({ bufferSize: 1, refCount: true }),\n\n finalize(() => {\n // IMPORTANT: allow re-initialization later\n this.initializationCache$ = null;\n }),\n );\n\n return this.initializationCache$;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { computed, Injectable, signal } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICreateBranchRequest,\n IUpdateBranchRequest,\n IBranch,\n} from '../interfaces/branch.interface';\n\n/**\n * Branch API Service\n * Signal-based service for branch CRUD operations\n * Branches default to current company context\n *\n * @example\n * ```typescript\n * branchService = inject(BranchApiService);\n *\n * // Set current company context\n * branchService.setCurrentCompanyId('company-uuid');\n *\n * // Access data via signals\n * branches = this.branchService.data;\n * isLoading = this.branchService.isLoading;\n *\n * // Fetch branches (will filter by current company)\n * this.branchService.fetchList('search');\n *\n * // Create branch (companyId will be auto-set if not provided)\n * await this.branchService.insertBranch({ name: 'New Branch', slug: 'new-branch' });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class BranchApiService extends ApiResourceService<\n ICreateBranchRequest | IUpdateBranchRequest,\n IBranch\n> {\n /** Current company context for branch operations */\n readonly currentCompanyId = signal<string | null>(null);\n\n /** Branches filtered by current company */\n readonly companyBranches = computed(() => {\n const companyId = this.currentCompanyId();\n if (!companyId) return this.data();\n return this.data().filter((branch) => branch.companyId === companyId);\n });\n\n constructor(http: HttpClient) {\n super('administration/branch', http);\n }\n\n /**\n * Set the current company context for branch operations\n */\n setCurrentCompanyId(companyId: string | null): void {\n this.currentCompanyId.set(companyId);\n }\n\n /**\n * Insert a new branch, auto-setting companyId if not provided\n */\n async insertBranch(\n data: Omit<ICreateBranchRequest, 'companyId'> & { companyId?: string }\n ): Promise<ReturnType<typeof this.insertAsync>> {\n const companyId = data.companyId ?? this.currentCompanyId();\n if (!companyId) {\n throw new Error('Company ID is required. Set currentCompanyId or provide companyId in data.');\n }\n return this.insertAsync({ ...data, companyId } as ICreateBranchRequest);\n }\n\n /**\n * Fetch branches for a specific company\n */\n fetchByCompany(companyId: string, search: string = ''): void {\n this.setCurrentCompanyId(companyId);\n this.fetchList(search, {\n filter: { companyId },\n });\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n ICompany,\n} from '../interfaces/company.interface';\n\n/**\n * Company API Service\n * Signal-based service for company CRUD operations\n *\n * @example\n * ```typescript\n * companyService = inject(CompanyApiService);\n *\n * // Access data via signals\n * companies = this.companyService.data;\n * isLoading = this.companyService.isLoading;\n *\n * // Fetch companies\n * this.companyService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });\n *\n * // Create company\n * await this.companyService.insertAsync({ name: 'New Company', slug: 'new-company' });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class CompanyApiService extends ApiResourceService<\n ICreateCompanyRequest | IUpdateCompanyRequest,\n ICompany\n> {\n constructor(http: HttpClient) {\n super('administration/company', http);\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Token Refresh State Service\n *\n * Manages token refresh state in a request-safe manner for SSR environments.\n * Replaces module-level state that would be shared across requests in SSR.\n *\n * NOTE: Uses BehaviorSubject intentionally for RxJS interoperability.\n * The HTTP interceptor needs to queue concurrent requests and have them\n * wait for the new token via Observable subscription. This is a valid\n * pattern that signals cannot replicate directly (no multi-subscriber\n * async coordination). Signal is used for the boolean flag only.\n *\n * @example\n * ```typescript\n * const refreshState = inject(TokenRefreshStateService);\n *\n * if (refreshState.isRefreshing()) {\n * // Queue request via refreshTokenSubject$\n * } else {\n * refreshState.startRefresh();\n * // Perform refresh\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class TokenRefreshStateService {\n /** Flag to track if token refresh is in progress */\n private readonly _isRefreshing = signal(false);\n readonly isRefreshing = this._isRefreshing.asReadonly();\n\n /** Subject to queue requests while refreshing */\n private readonly _refreshTokenSubject = new BehaviorSubject<string | null>(\n null,\n );\n readonly refreshTokenSubject$ = this._refreshTokenSubject.asObservable();\n\n /**\n * Mark refresh as started\n */\n startRefresh(): void {\n this._isRefreshing.set(true);\n this._refreshTokenSubject.next(null);\n }\n\n /**\n * Mark refresh as completed and broadcast new token\n */\n completeRefresh(newToken: string): void {\n this._isRefreshing.set(false);\n this._refreshTokenSubject.next(newToken);\n }\n\n /**\n * Mark refresh as failed\n */\n failRefresh(): void {\n this._isRefreshing.set(false);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { ApiResourceService, IMessageResponse, ISingleResponse } 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 * @example\n * ```typescript\n * userService = inject(UserApiService);\n *\n * // Access data via signals\n * users = this.userService.data;\n * isLoading = this.userService.isLoading;\n *\n * // Fetch users\n * this.userService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });\n *\n * // Create user\n * await this.userService.insertAsync({\n * name: 'John Doe',\n * email: 'john@example.com',\n * password: 'password123'\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UserApiService extends ApiResourceService<\n ICreateUserRequest | IUpdateUserRequest,\n IUser\n> {\n constructor(http: HttpClient) {\n super('administration/users', http);\n }\n\n /**\n * Verify user's email\n */\n verifyEmail(userId: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/${userId}/verify-email`, {});\n }\n\n /**\n * Verify user's phone\n */\n verifyPhone(userId: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/${userId}/verify-phone`, {});\n }\n\n /**\n * Update user status (active/inactive)\n */\n updateStatus(userId: string, isActive: boolean): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/${userId}/status`, { isActive });\n }\n\n /**\n * Update current user's profile\n */\n updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>> {\n return this.http.post<ISingleResponse<IUser>>(`${this.baseUrl}/profile`, data);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { Observable } from 'rxjs';\nimport {\n IAssignUserBranchRequest,\n IAssignUserCompanyRequest,\n IBatchOperationResponse,\n IUserBranchesResponse,\n IUserCompaniesResponse,\n} from '../interfaces/user-permission.interface';\n\n/**\n * User Permission API Service\n *\n * Handles user-company and user-branch permission assignments.\n * Uses batch operations for efficient permission management.\n *\n * Backend Endpoints (POST-only RPC):\n * - POST /administration/permissions/user-company/assign - Batch assign/revoke company permissions\n * - POST /administration/permissions/get-user-company - Get user's companies\n * - POST /administration/permissions/user-branch/assign - Batch assign/revoke branch permissions\n * - POST /administration/permissions/get-user-branch - Get user's branches\n */\n@Injectable({ providedIn: 'root' })\nexport class UserPermissionApiService {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl: string;\n\n constructor() {\n this.baseUrl = this.appConfig.apiBaseUrl + '/administration/permissions';\n }\n\n // ============================================\n // Company Permission Endpoints\n // ============================================\n\n /**\n * Batch assign/revoke user-company permissions\n *\n * @example\n * // Add company permissions\n * service.assignUserCompanies({\n * userId: 'user-id',\n * items: [\n * { targetId: 'company-1', isAdd: true },\n * { targetId: 'company-2', isAdd: true }\n * ]\n * });\n *\n * @example\n * // Remove company permissions\n * service.assignUserCompanies({\n * userId: 'user-id',\n * items: [\n * { targetId: 'company-1', isAdd: false }\n * ]\n * });\n */\n assignUserCompanies(\n data: IAssignUserCompanyRequest,\n ): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(\n `${this.baseUrl}/user-company/assign`,\n data,\n );\n }\n\n /**\n * Assign single company to user (convenience method)\n */\n assignUserToCompany(\n userId: string,\n companyId: string,\n ): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({\n userId,\n items: [{ targetId: companyId, isAdd: true }],\n });\n }\n\n /**\n * Revoke single company from user (convenience method)\n */\n revokeUserFromCompany(\n userId: string,\n companyId: string,\n ): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({\n userId,\n items: [{ targetId: companyId, isAdd: false }],\n });\n }\n\n /**\n * Get user's company permissions\n *\n * @param userId - User ID to get companies for\n * @returns Observable with user's company permissions\n */\n getUserCompanies(userId: string): Observable<IUserCompaniesResponse> {\n return this.http.post<IUserCompaniesResponse>(\n `${this.baseUrl}/get-user-company`,\n { userId },\n );\n }\n\n // ============================================\n // Branch Permission Endpoints\n // ============================================\n\n /**\n * Batch assign/revoke user-branch permissions\n *\n * @example\n * // Add branch permissions\n * service.assignUserBranches({\n * userId: 'user-id',\n * items: [\n * { targetId: 'branch-1', isAdd: true },\n * { targetId: 'branch-2', isAdd: true }\n * ]\n * });\n *\n * @example\n * // Remove branch permissions\n * service.assignUserBranches({\n * userId: 'user-id',\n * items: [\n * { targetId: 'branch-1', isAdd: false }\n * ]\n * });\n */\n assignUserBranches(\n data: IAssignUserBranchRequest,\n ): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(\n `${this.baseUrl}/user-branch/assign`,\n data,\n );\n }\n\n /**\n * Assign single branch to user (convenience method)\n */\n assignUserToBranch(\n userId: string,\n branchId: string,\n ): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({\n userId,\n items: [{ targetId: branchId, isAdd: true }],\n });\n }\n\n /**\n * Revoke single branch from user (convenience method)\n */\n revokeUserFromBranch(\n userId: string,\n branchId: string,\n ): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({\n userId,\n items: [{ targetId: branchId, isAdd: false }],\n });\n }\n\n /**\n * Get user's branch permissions\n *\n * @param userId - User ID to get branches for\n * @returns Observable with user's branch permissions\n */\n getUserBranches(userId: string): Observable<IUserBranchesResponse> {\n return this.http.post<IUserBranchesResponse>(\n `${this.baseUrl}/get-user-branch`,\n { userId },\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 *\n * @example\n * ```typescript\n * if (isAuthEndpoint(req.url)) {\n * // Skip interceptor logic\n * }\n * ```\n */\nexport const AUTH_ENDPOINTS = {\n LOGIN: '/auth/login',\n LOGOUT: '/auth/logout',\n REFRESH: '/auth/refresh',\n REGISTER: '/auth/register',\n SELECT: '/auth/select',\n SWITCH_COMPANY: '/auth/switch-company',\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/**\n * Check if a URL is an auth-related endpoint\n */\nexport function isAuthEndpoint(url: string): boolean {\n return Object.values(AUTH_ENDPOINTS).some((endpoint) =>\n url.includes(endpoint),\n );\n}\n\n/**\n * Check if a URL is a specific auth endpoint\n */\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\n/**\n * Validates a return URL to prevent open redirect attacks.\n * Only allows relative URLs that start with '/' and don't contain protocol.\n */\nfunction isValidReturnUrl(url: unknown): url is string {\n if (typeof url !== 'string' || !url) return false;\n // Must start with '/' and not contain protocol indicators\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n}\n\n/**\n * Auth Guard\n * Protects routes that require authentication.\n *\n * Session restoration is handled by guestGuard. This guard assumes\n * the session has already been restored if user accessed login page first.\n *\n * Handles company feature:\n * - If company feature enabled and no company selected, redirects to login\n * (login page handles company selection as step 2)\n * - If not authenticated, redirects to login\n *\n * @example\n * ```typescript\n * // In routes configuration\n * {\n * path: 'dashboard',\n * loadComponent: () => import('./dashboard.component'),\n * canActivate: [authGuard]\n * }\n * ```\n */\nexport const authGuard: CanActivateFn = (route, state) => {\n const authState = inject(AuthStateService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n // Check if user is authenticated\n if (!authState.isAuthenticated()) {\n // Store return URL for redirect after login\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], {\n queryParams: { returnUrl: state.url },\n });\n }\n\n // Check if company feature is enabled and company selection is required\n if (appConfig.enableCompanyFeature) {\n // If user needs to select company or no company selected, redirect to login\n // Login page handles company selection as step 2\n if (authState.requiresCompanySelection() || !authState.company()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], {\n queryParams: { returnUrl: state.url },\n });\n }\n }\n\n return true;\n};\n\n/**\n * Guest Guard\n * Protects auth routes (login, register) from authenticated users.\n * Redirects authenticated users to home page.\n *\n * CRITICAL: Unlike old implementation, this guard RESTORES the session first\n * before checking authentication. This handles the case when users directly\n * navigate to /auth/login via browser URL while having valid refresh token.\n *\n * Flow:\n * 1. Restore session (if needed) via AuthInitService.initialize()\n * 2. Check if user is authenticated\n * 3. If authenticated -> redirect to dashboard\n * 4. If not authenticated -> allow access to login page\n *\n * @example\n * ```typescript\n * // In routes configuration\n * {\n * path: 'auth/login',\n * loadComponent: () => import('./login.component'),\n * canActivate: [guestGuard]\n * }\n * ```\n */\nexport const guestGuard: CanActivateFn = (\n route,\n): 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 // Helper to check and redirect authenticated users\n const checkAndRedirect = (): boolean | UrlTree => {\n // Allow access if user needs company selection (login page handles this)\n if (authState.requiresCompanySelection()) {\n return true;\n }\n\n // If authenticated, check if company selection is needed\n if (authState.isAuthenticated()) {\n // If company feature enabled but no company, allow access to login for selection\n if (appConfig.enableCompanyFeature && !authState.company()) {\n return true;\n }\n\n // Redirect to home or returnUrl (with open redirect protection)\n const returnUrl = route.queryParams['returnUrl'];\n const safeUrl = isValidReturnUrl(returnUrl) ? returnUrl : '/';\n return router.createUrlTree([safeUrl]);\n }\n\n return true;\n };\n\n // If session already restored, just check authentication\n if (authInit.initialized()) {\n return checkAndRedirect();\n }\n\n // Otherwise, restore session first\n return authInit.initialize().pipe(\n map(() => checkAndRedirect()),\n catchError(() => of(true)), // On error, allow access to login\n );\n};\n\n/**\n * Company Feature Guard\n * Protects routes that require company feature to be enabled.\n * Redirects to home if company feature is disabled.\n *\n * Use this guard on company/branch management routes.\n *\n * @example\n * ```typescript\n * // In routes configuration\n * {\n * path: 'administration/company',\n * loadComponent: () => import('./company-list.component'),\n * canActivate: [authGuard, companyFeatureGuard]\n * }\n * ```\n */\nexport const companyFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n // If company feature not enabled, redirect to home\n if (!appConfig.enableCompanyFeature) {\n return router.createUrlTree(['/']);\n }\n\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 { MessageService } from 'primeng/api';\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/**\n * Token Refresh Interceptor\n * Handles token refresh both proactively and reactively.\n *\n * PROACTIVE REFRESH:\n * - Checks token expiry BEFORE making requests\n * - Refreshes token if expired or expiring soon (within 30 seconds)\n * - Prevents unnecessary 401 failures\n *\n * REACTIVE REFRESH:\n * - Still handles 401 errors as fallback\n * - Queues concurrent requests during refresh\n * - Redirects to login on refresh failure\n *\n * SECURITY:\n * - Token kept in memory only (not localStorage)\n * - Uses HTTP-only refresh token cookie\n * - SSR-safe: Uses injectable service\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * provideHttpClient(\n * withFetch(),\n * withInterceptors([authInterceptor, tokenRefreshInterceptor])\n * )\n * ```\n */\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\n // Skip refresh for these endpoints to prevent infinite loops\n const isRefreshRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REFRESH);\n const isLoginRequest = isEndpoint(req.url, AUTH_ENDPOINTS.LOGIN);\n const isSelectRequest = isEndpoint(req.url, AUTH_ENDPOINTS.SELECT);\n const isRegisterRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REGISTER);\n\n // Don't intercept auth-related endpoints\n if (isRefreshRequest || isLoginRequest || isSelectRequest || isRegisterRequest) {\n return next(req);\n }\n\n // PROACTIVE REFRESH: Check if token is expired or expiring soon\n if (authState.isTokenExpired() && authState.tokenExpiresAt() !== null) {\n // Token is expired/expiring - refresh proactively before request\n return handleTokenRefresh(\n req,\n next,\n authState,\n authApi,\n messageService,\n isBrowser,\n refreshState,\n );\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 );\n }),\n );\n}\n\n/**\n * Handle token refresh - either proactively or after 401\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): Observable<HttpEvent<unknown>> {\n // If already refreshing, queue this request\n if (refreshState.isRefreshing()) {\n return refreshState.refreshTokenSubject$.pipe(\n filter((token) => token !== null),\n take(1),\n switchMap((token) => {\n return next(\n req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n }),\n );\n }),\n );\n }\n\n // Start refresh process\n refreshState.startRefresh();\n\n return authApi.refresh().pipe(\n switchMap((response) => {\n const newToken = response.accessToken;\n\n // Update auth state (memory-only token + decoded expiry)\n authState.setAccessToken(newToken);\n\n // Complete refresh and notify queued requests\n refreshState.completeRefresh(newToken);\n\n // Continue with original request using new token\n return next(\n req.clone({\n setHeaders: { Authorization: `Bearer ${newToken}` },\n }),\n );\n }),\n catchError((refreshError) => {\n refreshState.failRefresh();\n return handleRefreshFailure(authState, messageService, isBrowser, refreshError);\n }),\n );\n}\n\n/**\n * Handle refresh token failure - logout and redirect\n */\nfunction handleRefreshFailure(\n authState: AuthStateService,\n messageService: MessageService,\n isBrowser: boolean,\n error: HttpErrorResponse,\n): Observable<never> {\n // Show message\n if (isBrowser) {\n messageService.add({\n severity: 'error',\n summary: 'Session Expired',\n detail: 'Please log in again.',\n });\n }\n\n // Reset auth state and redirect\n authState.resetState();\n authState.navigateToLogin();\n\n return throwError(() => error);\n}\n","import { Routes } from '@angular/router';\nimport {\n authGuard,\n companyFeatureGuard,\n guestGuard,\n} from '../guards/auth.guard';\n\n/**\n * Auth Routes Configuration\n * Public routes for authentication (login, register, etc.)\n *\n * Note: Company selection is now handled within the login page as a multi-step flow.\n */\nexport const AUTH_ROUTES: Routes = [\n {\n path: '',\n 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: [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: [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: [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 },\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, permissionGuard('admin-check')],\n canActivate: [authGuard],\n loadComponent: () =>\n import('../pages/administration/administration-page.component').then(\n (m) => m.AdministrationPageComponent,\n ),\n children: [\n // Users tab (always available)\n {\n path: 'users',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/users/user-list.component').then(\n (m) => m.UserListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n ],\n },\n // Company tab (requires company feature)\n {\n path: 'company',\n canActivate: [companyFeatureGuard],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/company/company-list.component').then(\n (m) => m.CompanyListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n ],\n },\n // Branch tab (requires company feature)\n {\n path: 'branch',\n canActivate: [companyFeatureGuard],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/branch/branch-list.component').then(\n (m) => m.BranchListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n ],\n },\n // Default redirect to users\n {\n path: '',\n redirectTo: 'users',\n pathMatch: 'full',\n },\n ],\n },\n];\n\n/**\n * Profile Routes Configuration\n * Protected route for user profile management\n */\nexport const PROFILE_ROUTES: Routes = [\n {\n path: '',\n canActivate: [authGuard],\n 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 * Auth Layout State Adapter\n * Bridges AuthStateService signals to ILayoutAuthState interface.\n * Provides ready-to-use integration between ng-auth, ng-layout, and ng-shared provider tokens.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthLayoutStateAdapter implements ILayoutAuthState {\n private readonly authState = inject(AuthStateService);\n\n /**\n * Maps company info to company info for layout.\n * Falls back to app name from config when no company is selected.\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 /**\n * Maps branch info to branch info for layout.\n * Returns null when no branch is selected.\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 /**\n * Maps user info from auth state to layout user info.\n * Profile picture URL is managed separately by AuthLayoutSyncService via FileUrlService.\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 ?? 'User',\n email: user.email,\n };\n }\n return null;\n });\n}\n\n/**\n * Auth Layout API Adapter\n * Bridges AuthApiService to ILayoutAuthApi interface.\n * Handles logout and navigation for layout components.\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 /**\n * Logout the current user.\n * Calls backend logout endpoint and resets local auth state.\n * Auth state reset handles clearing all localStorage including company/branch.\n */\n logOut(): Observable<any> {\n return this.authApi.logout().pipe(\n tap(() => {\n this.authState.resetState(); // Clears all auth state including localStorage\n }),\n );\n }\n\n /**\n * Navigate to login page.\n * Optionally preserves current URL as return URL.\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 /**\n * Switch to a different company and branch.\n * Calls backend switch endpoint, then triggers full page reload to\n * refresh permissions, reset component state, and re-filter all data.\n */\n switchCompany(companyId: string, branchId: string): Observable<any> {\n return this.authApi.switchCompany({ companyId, branchId }).pipe(\n tap(() => {\n // Reload page to refresh permissions and all component state\n // This ensures all data is filtered by new company/branch context\n window.location.reload();\n }),\n );\n }\n\n /**\n * Get list of companies the logged-in user has permissions for.\n * Uses permission API to filter by user's actual company-level permissions.\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 return (response.data || []).map((permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n slug: permission.companySlug ?? '',\n imageId: '',\n }));\n }),\n );\n }\n\n /**\n * Get branches for a specific company that the logged-in user has access to.\n * Fetches all user branches and filters by companyId.\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).pipe(\n map((response) => {\n return (response.data || [])\n .filter((permission) => permission.companyId === companyId)\n .map((permission) => ({\n id: permission.branchId,\n name: permission.branchName,\n slug: permission.branchSlug ?? '',\n }));\n }),\n );\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { IUserProvider, IUserBasicInfo, IListResponse } from '@flusys/ng-shared';\nimport { Observable, map } from 'rxjs';\nimport { UserApiService } from '../services/user-api.service';\n\n/**\n * Auth User Provider Adapter\n *\n * Implements IUserProvider interface from ng-shared using UserApiService from ng-auth.\n * This allows IAM and other packages to access user data without depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * { provide: USER_PROVIDER, useClass: AuthUserProviderAdapter }\n * ]\n *\n * // In IAM component\n * private readonly userProvider = inject(USER_PROVIDER);\n * this.userProvider.getUsers({ page: 0, pageSize: 50 }).subscribe(...);\n */\n@Injectable()\nexport class AuthUserProviderAdapter implements IUserProvider {\n private readonly userApi = inject(UserApiService);\n\n getUsers(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n companyId?: string;\n branchId?: string;\n isActive?: boolean;\n [key: string]: any;\n }): Observable<IListResponse<IUserBasicInfo>> {\n // Convert filter to API format\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n filter: {\n ...(filter?.companyId && { companyId: filter.companyId }),\n ...(filter?.branchId && { branchId: filter.branchId }),\n ...(filter?.isActive !== undefined && { isActive: filter.isActive }),\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.userApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((user) => ({\n id: user.id,\n name: user.name ?? user.email,\n email: user.email,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport {\n ICompanyApiProvider,\n ICompanyBasicInfo,\n IListResponse,\n} from '@flusys/ng-shared';\nimport { Observable, map } from 'rxjs';\nimport { CompanyApiService } from '../services/company-api.service';\n\n/**\n * Auth Company API Provider Adapter\n *\n * Implements ICompanyApiProvider interface from ng-shared using CompanyApiService.\n * Allows IAM package to access company data without depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter }\n * ]\n */\n@Injectable()\nexport class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {\n private readonly companyApi = inject(CompanyApiService);\n\n getCompanies(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n }): Observable<IListResponse<ICompanyBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.companyApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((company) => ({\n id: company.id,\n name: company.name,\n slug: company.slug,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ISingleResponse, IUserPermissionProvider } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\n/**\n * Auth User Permission Provider Adapter\n *\n * Implements IUserPermissionProvider interface from ng-shared using UserPermissionApiService.\n * Allows IAM package to query user permissions without depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter }\n * ]\n */\n@Injectable()\nexport class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {\n private readonly userPermissionApi = inject(UserPermissionApiService);\n\n getUserBranchPermissions(userId: string): Observable<ISingleResponse<any>> {\n return this.userPermissionApi.getUserBranches(userId) as Observable<\n ISingleResponse<any>\n >;\n }\n}\n","import { Injectable, inject, Signal } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport { IAuthStateProvider } from '@flusys/ng-shared';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\n\n/**\n * Auth State Provider Adapter\n *\n * Implements IAuthStateProvider interface from ng-shared using auth services from ng-auth.\n * This allows feature packages (form-builder, etc.) to check auth state without\n * depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * { provide: AUTH_STATE_PROVIDER, useClass: AuthStateProviderAdapter }\n * ]\n *\n * // In form-builder component\n * private readonly authStateProvider = inject(AUTH_STATE_PROVIDER);\n * const isLoggedIn = this.authStateProvider.isAuthenticated();\n */\n@Injectable()\nexport class AuthStateProviderAdapter implements IAuthStateProvider {\n private readonly authState = inject(AuthStateService);\n private readonly authInit = inject(AuthInitService);\n\n /**\n * Signal indicating if user is currently authenticated\n */\n get isAuthenticated(): Signal<boolean> {\n return this.authState.isAuthenticated;\n }\n\n /**\n * Initialize auth state (restore session from cookies/storage)\n * Returns Observable<void> that completes when initialization is done\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 {\n AuthLayoutApiAdapter,\n AuthLayoutStateAdapter,\n} from '../adapters/auth-layout-adapter';\n\n/**\n * Provides auth layout integration for ng-layout.\n * Call this in your app.config.ts to integrate ng-auth with ng-layout.\n *\n * Also registers LAYOUT_AUTH_STATE since AuthLayoutStateAdapter\n * implements both ILayoutAuthState and ICompanyContextProvider.\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * ...provideAuthLayoutIntegration(),\n * ],\n * };\n * ```\n */\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 {\n AUTH_STATE_PROVIDER,\n COMPANY_API_PROVIDER,\n USER_PERMISSION_PROVIDER,\n USER_PROVIDER,\n} from '@flusys/ng-shared';\nimport { AuthCompanyApiProviderAdapter } from '../adapters/auth-company-api-provider.adapter';\nimport { AuthStateProviderAdapter } from '../adapters/auth-state-provider.adapter';\nimport { AuthUserPermissionProviderAdapter } from '../adapters/auth-user-permission-provider.adapter';\nimport { AuthUserProviderAdapter } from '../adapters/auth-user-provider.adapter';\n\n/**\n * Provide Auth Provider Adapters\n *\n * Registers auth implementations for provider interfaces from ng-shared.\n * This allows IAM and Storage packages to use auth services without direct dependencies.\n *\n * @example\n * // In app.config.ts\n * import { provideAuthProviders } from '@flusys/ng-auth';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideAuthProviders(),\n * // ... other providers\n * ]\n * };\n *\n * @returns Array of Angular providers\n */\nexport function provideAuthProviders(): Provider[] {\n return [\n // User data provider (for IAM user selection)\n { provide: USER_PROVIDER, useClass: AuthUserProviderAdapter },\n\n // Company API provider (for IAM company selection)\n { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter },\n\n // User permission provider (for IAM permission assignment)\n { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter },\n\n // Auth state provider (for form-builder and other packages)\n { provide: AUTH_STATE_PROVIDER, useClass: AuthStateProviderAdapter },\n ];\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { CommonModule } from '@angular/common';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: 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 standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Administration</h1>\n <p class=\"text-muted-color mt-1\">{{ subtitle() }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div>\n <router-outlet />\n </div>\n </div>\n `,\n})\nexport class AdministrationPageComponent {\n private readonly appConfig = inject(APP_CONFIG);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'users',\n label: 'Users',\n icon: 'pi pi-users',\n route: 'users',\n },\n {\n id: 'companies',\n label: 'Companies',\n icon: 'pi pi-building',\n route: 'company',\n requiresCompanyFeature: true,\n },\n {\n id: 'branches',\n label: 'Branches',\n icon: 'pi pi-sitemap',\n route: 'branch',\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 */\n readonly visibleTabs = computed(() => {\n return this.allTabs.filter(\n (tab) => !tab.requiresCompanyFeature || this.companyFeatureEnabled()\n );\n });\n\n /** Dynamic subtitle based on visible features */\n readonly subtitle = computed(() => {\n return this.companyFeatureEnabled()\n ? 'Manage users, companies, and branches'\n : 'Manage users';\n });\n}\n","import { ChangeDetectionStrategy, 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 { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranch,\n ICreateBranchRequest,\n IUpdateBranchRequest,\n} from '../../interfaces/branch.interface';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Branch form model interface */\ninterface IBranchFormModel {\n companyId: string;\n name: string;\n slug: string;\n email: string;\n phone: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Branch Form Component\n * Handles creating and editing branches.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? 'Edit Branch' : 'New Branch' }}\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\">Company *</label>\n <select\n id=\"companyId\"\n class=\"p-select-native w-full\"\n [formField]=\"branchForm.companyId\">\n <option value=\"\">Select Company</option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"branchForm.name\"\n (blur)=\"generateSlug()\"\n placeholder=\"Branch name\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">Slug *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"branchForm.slug\"\n placeholder=\"branch-slug\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">Email</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"branchForm.email\"\n placeholder=\"branch@company.com\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"branchForm.phone\"\n placeholder=\"+1 234 567 8900\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"branchForm.isActive\" />\n <span>Active</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">Address</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"branchForm.address\"\n placeholder=\"123 Main St, City, Country\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n label=\"Cancel\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class BranchFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n\n // Route params as signals\n private readonly routeParams = toSignal(this.route.paramMap);\n private readonly queryParams = toSignal(this.route.queryParamMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing branch data when editing */\n readonly existingBranch = signal<IBranch | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingBranch());\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IBranchFormModel>({\n companyId: '',\n name: '',\n slug: '',\n email: '',\n phone: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly branchForm = form(this.formModel, (f) => {\n required(f.companyId, { message: 'Company is required' });\n required(f.name, { message: 'Name is required' });\n required(f.slug, { message: 'Slug is required' });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.companyId.trim().length > 0 &&\n model.name.trim().length > 0 &&\n model.slug.trim().length > 0\n );\n });\n\n constructor() {\n // Load companies on initialization\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n const query = this.queryParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadBranch(id);\n } else {\n // Set company from query params or current company\n const queryCompanyId = query?.get('companyId');\n const currentCompanyId = this.authState.company()?.id;\n const companyId = queryCompanyId || currentCompanyId;\n\n if (companyId) {\n this.formModel.update((m) => ({ ...m, companyId }));\n }\n }\n });\n }\n\n async loadBranch(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.branchService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingBranch.set(response.data);\n this.formModel.set({\n companyId: response.data.companyId,\n name: response.data.name,\n slug: response.data.slug,\n email: response.data.email || '',\n phone: response.data.phone || '',\n address: response.data.address || '',\n isActive: response.data.isActive,\n });\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/administration/branch']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const model = this.formModel();\n\n if (this.isEditMode() && this.existingBranch()) {\n // Update existing branch\n const updateData: IUpdateBranchRequest = {\n id: this.existingBranch()!.id,\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n\n await this.branchService.updateAsync(updateData);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Branch updated successfully.',\n });\n } else {\n // Create new branch\n const createData: ICreateBranchRequest = {\n companyId: model.companyId,\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n\n await this.branchService.insertAsync(createData);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Branch created successfully.',\n });\n }\n\n // Navigate back to branch list with company filter\n const companyId = this.existingBranch()?.companyId || model.companyId;\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId },\n });\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n const model = this.formModel();\n const companyId = this.existingBranch()?.companyId || model.companyId;\n this.router.navigate(['/administration/branch'], {\n queryParams: companyId ? { companyId } : {},\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, BRANCH_PERMISSIONS, HasPermissionDirective, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { IBranch } from '../../interfaces/branch.interface';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/**\n * Branch List Component\n * Displays a list of branches for a company with CRUD operations.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <div class=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\">\n <h2 class=\"text-xl font-semibold m-0\">Branches</h2>\n @if (companies().length > 1) {\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event); onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Company\"\n styleClass=\"w-full sm:w-64\" />\n }\n </div>\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.CREATE\"\n label=\"Add Branch\"\n icon=\"pi pi-plus\"\n [disabled]=\"!selectedCompanyId()\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"branches()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Status</th>\n <th class=\"w-[120px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-branch>\n <tr>\n <td>{{ branch.name }}</td>\n <td>{{ branch.slug }}</td>\n <td>{{ branch.email || '-' }}</td>\n <td>{{ branch.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"branch.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"branch.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n pTooltip=\"Edit\"\n (onClick)=\"onEdit(branch)\" />\n @if (!branch.readOnly) {\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n pTooltip=\"Delete\"\n (onClick)=\"onDelete(branch)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n @if (!selectedCompanyId()) {\n Please select a company to view branches.\n } @else {\n No branches found. Click \"Add Branch\" to create one.\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class BranchListComponent {\n // Permission constants for template\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n\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 // Load companies for dropdown\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Check for company ID from query params or use current company\n // p-table's onLazyLoad will handle the initial data fetch\n const queryCompanyId = params?.get('companyId') || null;\n const currentCompanyId = this.authState.company()?.id;\n\n this.selectedCompanyId.set(queryCompanyId || currentCompanyId || null);\n });\n }\n\n loadBranches(): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.branchService.fetchByCompany(companyId, '');\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId()) {\n this.loadBranches();\n }\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n\n // Use fetchByCompany to maintain company context\n this.branchService.setCurrentCompanyId(companyId);\n this.branchService.fetchList('', {\n filter: { companyId },\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/branch/new'], {\n queryParams: { companyId: this.selectedCompanyId() },\n });\n }\n\n onEdit(branch: IBranch): void {\n this.router.navigate(['/administration/branch', branch.id]);\n }\n\n onDelete(branch: IBranch): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${branch.name}\"?`,\n header: 'Delete Branch',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.branchService.deleteAsync({ id: branch.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Branch deleted successfully.',\n });\n this.branchService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, 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 { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n ICompany,\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n} from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Company form model interface */\ninterface ICompanyFormModel {\n name: string;\n slug: string;\n email: string;\n phone: string;\n website: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Company Form Component\n * Handles creating and editing companies.\n */\n@Component({\n selector: 'lib-company-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? 'Edit Company' : 'New Company' }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"companyForm.name\"\n (blur)=\"generateSlug()\"\n placeholder=\"Company name\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">Slug *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"companyForm.slug\"\n placeholder=\"company-slug\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">Email</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"companyForm.email\"\n placeholder=\"contact@company.com\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"companyForm.phone\"\n placeholder=\"+1 234 567 8900\"\n />\n </div>\n\n <!-- Website -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"website\" class=\"font-medium\">Website</label>\n <input\n pInputText\n id=\"website\"\n [formField]=\"companyForm.website\"\n placeholder=\"https://company.com\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"companyForm.isActive\" />\n <span>Active</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">Address</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"companyForm.address\"\n placeholder=\"123 Main St, City, Country\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n label=\"Cancel\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class CompanyFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly companyService = inject(CompanyApiService);\n\n // Route params as signal\n private readonly routeParams = toSignal(this.route.paramMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing company data when editing */\n readonly existingCompany = signal<ICompany | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingCompany());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<ICompanyFormModel>({\n name: '',\n slug: '',\n email: '',\n phone: '',\n website: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly companyForm = form(this.formModel, (f) => {\n required(f.name, { message: 'Name is required' });\n required(f.slug, { message: 'Slug is required' });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0 && model.slug.trim().length > 0;\n });\n\n constructor() {\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadCompany(id);\n }\n });\n }\n\n async loadCompany(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.companyService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingCompany.set(response.data);\n this.formModel.set({\n name: response.data.name,\n slug: response.data.slug,\n email: response.data.email || '',\n phone: response.data.phone || '',\n website: response.data.website || '',\n address: response.data.address || '',\n isActive: response.data.isActive,\n });\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/administration/company']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const model = this.formModel();\n\n if (this.isEditMode() && this.existingCompany()) {\n // Update existing company\n const updateData: IUpdateCompanyRequest = {\n id: this.existingCompany()!.id,\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n website: model.website || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n\n await this.companyService.updateAsync(updateData);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Company updated successfully.',\n });\n } else {\n // Create new company\n const createData: ICreateCompanyRequest = {\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n website: model.website || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n\n await this.companyService.insertAsync(createData);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Company created successfully.',\n });\n }\n\n this.router.navigate(['/administration/company']);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/company']);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AngularModule, BRANCH_PERMISSIONS, COMPANY_PERMISSIONS, HasPermissionDirective, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/**\n * Company List Component\n * Displays a list of companies with CRUD operations.\n * Only visible when company feature is enabled.\n */\n@Component({\n selector: 'lib-company-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">Companies</h2>\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.CREATE\"\n label=\"Add Company\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"companies()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Status</th>\n <th class=\"w-[150px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-company>\n <tr>\n <td>{{ company.name }}</td>\n <td>{{ company.slug }}</td>\n <td>{{ company.email || '-' }}</td>\n <td>{{ company.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"company.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"company.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n pTooltip=\"Edit\"\n (onClick)=\"onEdit(company)\" />\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.READ\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n pTooltip=\"View Branches\"\n (onClick)=\"onViewBranches(company)\" />\n @if (!company.readOnly) {\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n pTooltip=\"Delete\"\n (onClick)=\"onDelete(company)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n No companies found. Click \"Add Company\" to create one.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class CompanyListComponent {\n // Permission constants for template\n readonly COMPANY_PERMISSIONS = COMPANY_PERMISSIONS;\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly companyService = inject(CompanyApiService);\n\n /** Companies from service */\n readonly companies = this.companyService.data;\n\n /** Loading state from service */\n readonly isLoading = this.companyService.isLoading;\n\n /** Total count from service */\n readonly total = this.companyService.total;\n\n loadCompanies(): void {\n this.companyService.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.companyService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/company/new']);\n }\n\n onEdit(company: ICompany): void {\n this.router.navigate(['/administration/company', company.id]);\n }\n\n onViewBranches(company: ICompany): void {\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId: company.id },\n });\n }\n\n onDelete(company: ICompany): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${company.name}\"?`,\n header: 'Delete Company',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.companyService.deleteAsync({ id: company.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Company deleted successfully.',\n });\n this.companyService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n form,\n FormField,\n required,\n email as emailValidator,\n} from '@angular/forms/signals';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IForgotPasswordFormModel {\n email: string;\n}\n\n@Component({\n selector: 'lib-forgot-password-page',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @if (!emailSent()) {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Forgot Password\n </div>\n <span class=\"text-muted-color font-medium\">\n Enter your email address and we'll send you a link to reset your password.\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n Email\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n placeholder=\"Enter your email address\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"forgotForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n label=\"Send Reset Link\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <span class=\"font-medium\">Remember your password?</span>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Sign In\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Check Your Email\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n We've sent a password reset link to <strong>{{ submittedEmail() }}</strong>.\n Please check your inbox and follow the instructions.\n </p>\n <p class=\"text-sm text-muted-color mb-6\">\n Didn't receive the email? Check your spam folder or\n <span\n class=\"text-primary cursor-pointer font-semibold\"\n (click)=\"resetForm()\">\n try again\n </span>.\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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\n readonly isLoading = signal(false);\n readonly emailSent = signal(false);\n readonly submittedEmail = signal('');\n readonly formModel = signal<IForgotPasswordFormModel>({ email: '' });\n readonly forgotForm = form(this.formModel, (f) => {\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\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: 'Validation Error',\n detail: 'Please enter a valid email address.',\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.formModel().email;\n\n this.authApi\n .forgotPassword(email)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.isLoading.set(false);\n this.submittedEmail.set(email);\n this.emailSent.set(true);\n },\n error: () => {\n this.isLoading.set(false);\n this.submittedEmail.set(email);\n this.emailSent.set(true);\n },\n });\n }\n\n resetForm(): void {\n this.emailSent.set(false);\n this.submittedEmail.set('');\n this.formModel.set({ email: '' });\n }\n}\n","import {\n ChangeDetectionStrategy,\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 form,\n FormField,\n required,\n email as emailValidator,\n minLength,\n} from '@angular/forms/signals';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n isEmailVerificationRequired,\n ISelectRequest,\n} from '../../interfaces/auth.interface';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/** Login form model interface */\ninterface ILoginFormModel {\n email: string;\n password: string;\n rememberMe: boolean;\n}\n\n/** Company selection form model interface */\ninterface ISelectionFormModel {\n companyId: string;\n branchId: string;\n rememberSelection: boolean;\n}\n\ntype LoginStep = 'credentials' | 'company-selection' | 'email-verification';\n\n/**\n * Login Page Component\n * Multi-step authentication flow:\n * - Step 1: Email/Password credentials\n * - Step 2: Company/Branch selection (when company feature enabled and user has multiple)\n */\n@Component({\n selector: 'lib-login-page',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n <!-- 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]=\"currentStep() === 'credentials'\"\n [class.bg-surface-200]=\"currentStep() !== 'credentials'\"\n [class.text-muted-color]=\"currentStep() !== 'credentials'\">\n 1\n </div>\n <div class=\"w-12 h-0.5 bg-surface-200\"></div>\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'company-selection'\"\n [class.text-primary-contrast]=\"currentStep() === 'company-selection'\"\n [class.bg-surface-200]=\"currentStep() !== 'company-selection'\"\n [class.text-muted-color]=\"currentStep() !== 'company-selection'\">\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 Welcome!\n </div>\n <span class=\"text-muted-color font-medium\">Sign in to continue</span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n Email\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n placeholder=\"Email address\"\n class=\"w-full md:w-[25rem] mb-4\"\n [formField]=\"loginForm.email\"\n autocomplete=\"email\" />\n\n <label for=\"password\" class=\"block font-medium text-lg mb-2 text-color\">\n Password\n </label>\n <div class=\"mb-4\">\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n placeholder=\"Password\"\n class=\"w-full md:w-[25rem]\"\n [formField]=\"loginForm.password\"\n autocomplete=\"current-password\" />\n </div>\n\n <div class=\"flex flex-col sm:flex-row items-start sm:items-center justify-between mt-2 mb-8 gap-4\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"loginForm.rememberMe\" />\n <span>Remember me</span>\n </label>\n <span\n class=\"font-medium no-underline ml-2 text-right cursor-pointer text-primary\"\n routerLink=\"/auth/forgot-password\">\n Forgot password?\n </span>\n </div>\n\n <p-button\n label=\"Sign In\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isLoginFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">Don't have an account?</span>\n <a routerLink=\"/auth/register\" class=\"font-semibold text-primary cursor-pointer\">\n Sign Up\n </a>\n </div>\n </form>\n }\n\n <!-- Email Verification Required -->\n @if (currentStep() === 'email-verification') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-warn\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Email Not Verified\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n Please verify your email address <strong>{{ unverifiedEmail() }}</strong> before logging in.\n </p>\n <p-button\n label=\"Resend Verification Email\"\n styleClass=\"w-full mb-4\"\n [loading]=\"isLoading()\"\n (onClick)=\"onResendVerification()\" />\n <div class=\"mt-4\">\n <span\n class=\"font-semibold text-primary cursor-pointer\"\n (click)=\"goBackToCredentials()\">\n Back to Sign In\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 Select Company\n </div>\n <div class=\"text-muted-color font-medium\">\n Welcome, {{ userName() }}! Please select your company and branch.\n </div>\n </div>\n\n <form (ngSubmit)=\"onSelectCompany()\">\n <label for=\"company\" class=\"block text-lg font-medium mb-2 text-color\">\n Company\n </label>\n <select\n id=\"company\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.companyId\"\n (change)=\"onCompanyChange()\">\n <option value=\"\">Select Company</option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n\n <label for=\"branch\" class=\"block text-lg font-medium mb-2 text-color\">\n Branch\n </label>\n <select\n id=\"branch\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.branchId\">\n <option value=\"\">Select Branch</option>\n @for (branch of branches(); track branch.id) {\n <option [value]=\"branch.id\">{{ branch.name }}</option>\n }\n </select>\n\n <div class=\"flex items-center mt-2 mb-8\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"selectionForm.rememberSelection\" />\n <span>Remember this selection</span>\n </label>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <p-button\n label=\"Back\"\n styleClass=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (onClick)=\"goBackToCredentials()\" />\n <p-button\n label=\"Continue\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\" />\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\n readonly returnUrl = input<string>('');\n readonly currentStep = signal<LoginStep>('credentials');\n readonly isLoading = signal(false);\n readonly unverifiedEmail = signal('');\n\n // ============================================\n // Login Form (Signal Forms)\n // ============================================\n\n /** Login form model */\n readonly loginFormModel = signal<ILoginFormModel>({\n email: '',\n password: '',\n rememberMe: true,\n });\n\n /** Login form with validation schema */\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\n required(f.password, { message: 'Password is required' });\n minLength(f.password, 6, { message: 'Password must be at least 6 characters' });\n });\n\n /** Check if login form is valid */\n readonly isLoginFormValid = computed(() => this.loginForm().valid());\n\n // ============================================\n // Selection Form (Signal Forms)\n // ============================================\n\n /** Selection form model */\n readonly selectionFormModel = signal<ISelectionFormModel>({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n\n /** Selection form with validation schema */\n readonly selectionForm = form(this.selectionFormModel, (f) => {\n required(f.companyId, { message: 'Please select a company' });\n required(f.branchId, { message: 'Please select a branch' });\n });\n\n /** Check if selection form is valid */\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n // ============================================\n // Company Selection State (Step 2)\n // ============================================\n\n /** Session ID for company selection */\n private sessionId: string | null = null;\n\n /** Available companies */\n readonly companies = signal<ICompanyWithBranches[]>([]);\n\n /** User's name */\n readonly userName = signal<string>('');\n\n /** Branches for selected company */\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 to restore pending company selection state (e.g., on page refresh during Step 2)\n effect(() => {\n if (this.authState.requiresCompanySelection()) {\n this.restorePendingSelectionState();\n }\n });\n }\n\n /**\n * Restores pending company selection state from auth service.\n * Called when user refreshes page during Step 2 of login flow.\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 // ============================================\n // Step 1: Login\n // ============================================\n\n onSubmit(): void {\n if (!this.isLoginFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all required fields correctly.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.loginFormModel();\n const loginData: ILoginRequest = {\n email: formData.email,\n password: formData.password,\n };\n\n this.authApi\n .login(loginData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (isEmailVerificationRequired(response)) {\n this.unverifiedEmail.set(response.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n this.sessionId = response.sessionId;\n this.companies.set(response.companies);\n this.userName.set(response.user.name ?? response.user.email);\n this.authState.setSelectionState(response);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else {\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Login successful!',\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: () => {\n this.isLoading.set(false);\n // Error toast handled by global interceptor\n },\n });\n }\n\n // ============================================\n // Step 2: Company Selection\n // ============================================\n\n /** Handle company selection change */\n onCompanyChange(): void {\n // Reset branch when company changes\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: '',\n }));\n\n // Auto-select if only one branch\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: 'Selection Required',\n detail: 'Please select both company and branch.',\n });\n return;\n }\n\n if (!this.sessionId) {\n this.messageService.add({\n severity: 'error',\n summary: 'Session Expired',\n detail: 'Your session has expired. Please login again.',\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\n // Response is unwrapped - LoginResponse directly\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Login successful!',\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n },\n error: () => {\n this.isLoading.set(false);\n // Error toast handled by global interceptor\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: 'Email Sent',\n detail: response.message || 'Verification email has been sent.',\n });\n },\n error: () => {\n this.isLoading.set(false);\n // Error toast handled by global interceptor\n },\n });\n }\n\n // ============================================\n // Helpers\n // ============================================\n\n private autoSelectIfSingle(): void {\n // Auto-select if only one company\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 // Try to restore from storage\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 ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport {\n APP_CONFIG,\n getPermissionMode,\n isCompanyFeatureEnabled,\n isFeatureEnabled,\n} from '@flusys/ng-core';\nimport {\n AngularModule,\n FileUploaderComponent,\n FileUrlService,\n IProfileActionInfo,\n IProfileRoleInfo,\n IProfileUploadResult,\n PrimeModule,\n PROFILE_PERMISSION_PROVIDER,\n PROFILE_UPLOAD_PROVIDER,\n UploadFileFn,\n} from '@flusys/ng-shared';\nimport { map } from 'rxjs';\nimport { MessageService } from 'primeng/api';\nimport { IUpdateUserRequest } from '../../interfaces/user.interface';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { UserApiService } from '../../services/user-api.service';\n\n/** Profile form model */\ninterface IProfileFormModel {\n name: string;\n phone: string;\n}\n\n/** Password form model */\ninterface IPasswordFormModel {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n/**\n * Profile Page Component\n *\n * Allows users to view and update their profile information.\n * Features:\n * - Update name, phone, profile picture (if storage enabled)\n * - View company/branch info (read-only, if company feature enabled)\n * - View roles/actions (read-only, if IAM enabled via optional injection)\n *\n * Package Independence:\n * - Uses PROFILE_UPLOAD_PROVIDER (optional) for storage functionality\n * - Uses PROFILE_PERMISSION_PROVIDER (optional) for IAM functionality\n * - No direct imports from ng-storage or ng-iam\n */\n@Component({\n selector: 'lib-profile-page',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField, FileUploaderComponent],\n template: `\n <!-- Page Header -->\n <div class=\"mb-4 md:mb-6\">\n <h1 class=\"text-2xl font-bold text-color mb-2\">My Profile</h1>\n <p class=\"text-muted-color\">Manage your account settings and preferences.</p>\n </div>\n\n <!-- Profile Form Card (full width) -->\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex flex-col md:flex-row gap-4 md:gap-6\">\n <!-- Avatar Section -->\n <div class=\"flex flex-col items-center gap-4 md:w-72 lg:w-80 md:border-r md:border-surface-200 md:pr-6\">\n @if (profilePictureUrl()) {\n <p-avatar\n [image]=\"profilePictureUrl()!\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28\" />\n } @else {\n <p-avatar\n [label]=\"userInitials()\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28 text-3xl bg-primary text-primary-contrast\" />\n }\n <div class=\"text-center\">\n <div class=\"font-semibold text-color\">{{ userName() }}</div>\n <div class=\"text-muted-color text-sm\">{{ userEmail() }}</div>\n </div>\n <!-- Upload section - only show if storage is enabled and provider is available -->\n @if (showUploadSection()) {\n <lib-file-uploader\n [uploadFile]=\"uploadFileFn\"\n [acceptTypes]=\"['image/*']\"\n [multiple]=\"false\"\n [maxSizeMb]=\"5\"\n [showPreview]=\"false\"\n (fileUploaded)=\"onProfilePictureUploaded($event)\"\n class=\"w-full\" />\n } @else {\n <div class=\"w-full p-3 bg-surface-100 rounded-lg text-center\">\n <i class=\"pi pi-info-circle text-muted-color mr-2\"></i>\n <span class=\"text-sm text-muted-color\">Storage feature not enabled</span>\n </div>\n }\n </div>\n\n <!-- Form Section -->\n <div class=\"flex-1\">\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-4\">\n <!-- Email (read-only) -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-color\">Email</label>\n <input\n pInputText\n [value]=\"userEmail()\"\n disabled\n class=\"bg-surface-50\" />\n </div>\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium text-color\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n placeholder=\"Your full name\" />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium text-color\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n placeholder=\"+1 234 567 8900\" />\n </div>\n\n <!-- Submit -->\n <div class=\"flex justify-end pt-4\">\n <p-button\n label=\"Save Changes\"\n icon=\"pi pi-check\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <!-- Security Card -->\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-lock text-primary\"></i>\n <span class=\"font-semibold text-color\">Security</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 <!-- Current Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"currentPassword\" class=\"font-medium text-color\">Current Password *</label>\n <p-password\n id=\"currentPassword\"\n name=\"currentPassword\"\n [ngModel]=\"passwordModel().currentPassword\"\n (ngModelChange)=\"updatePasswordField('currentPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n placeholder=\"Enter current password\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <!-- New Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"newPassword\" class=\"font-medium text-color\">New Password *</label>\n <p-password\n id=\"newPassword\"\n name=\"newPassword\"\n [ngModel]=\"passwordModel().newPassword\"\n (ngModelChange)=\"updatePasswordField('newPassword', $event)\"\n [feedback]=\"true\"\n [toggleMask]=\"true\"\n placeholder=\"Min 6 characters\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <!-- Confirm Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"confirmPassword\" class=\"font-medium text-color\">Confirm Password *</label>\n <p-password\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n [ngModel]=\"passwordModel().confirmPassword\"\n (ngModelChange)=\"updatePasswordField('confirmPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n placeholder=\"Confirm new password\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n @if (!passwordsMatch()) {\n <small class=\"text-danger\">Passwords do not match</small>\n }\n </div>\n </div>\n\n <!-- Submit -->\n <div class=\"flex justify-end\">\n <p-button\n label=\"Change Password\"\n icon=\"pi pi-key\"\n type=\"submit\"\n [loading]=\"isPasswordLoading()\"\n [disabled]=\"!isPasswordFormValid() || isPasswordLoading()\" />\n </div>\n </form>\n </div>\n\n <!-- Company & Permissions Row (50/50 on desktop, stacked on mobile) -->\n @if (showBottomRow()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-4 flex-1\">\n <!-- Company/Branch Info -->\n @if (showCompanySection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-building text-primary\"></i>\n <span class=\"font-semibold text-color\">Company & Branch</span>\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-briefcase text-primary\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">Company</div>\n <div class=\"font-medium text-color\">{{ companyName() || 'Not assigned' }}</div>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-success/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-map-marker text-success\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">Branch</div>\n <div class=\"font-medium text-color\">{{ branchName() || 'Not assigned' }}</div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Permissions -->\n @if (showPermissionsSection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center justify-between mb-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-shield text-primary\"></i>\n <span class=\"font-semibold text-color\">My Permissions</span>\n </div>\n <p-tag value=\"Read-only\" severity=\"secondary\" />\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n <!-- Roles -->\n @if (showRoles()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-users\"></i> Roles\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userRoles().length === 0) {\n <span class=\"text-muted-color text-sm\">No roles assigned</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (role of userRoles(); track role.id) {\n <p-tag [value]=\"role.name\" severity=\"info\" />\n }\n </div>\n }\n </div>\n }\n\n <!-- Actions -->\n @if (showActions()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-bolt\"></i> Direct Actions\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userActions().length === 0) {\n <span class=\"text-muted-color text-sm\">No actions assigned</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (action of userActions(); track action.id) {\n <p-tag [value]=\"action.name\" severity=\"success\" />\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\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\n // Optional injection - null if storage not configured\n private readonly uploadProvider = inject(PROFILE_UPLOAD_PROVIDER, {\n optional: true,\n });\n\n // Optional injection - null if IAM not configured\n private readonly permissionProvider = inject(PROFILE_PERMISSION_PROVIDER, {\n optional: true,\n });\n\n // State\n readonly isLoading = signal(false);\n readonly isLoadingPermissions = signal(false);\n private readonly _profilePictureUrl = signal<string | null>(null);\n readonly profilePictureUrl = this._profilePictureUrl.asReadonly();\n\n // Permission data\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 // Computed from auth state\n readonly userEmail = computed(() => this.authState.user()?.email ?? '');\n readonly userName = computed(() => this.authState.user()?.name ?? 'User');\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 // Feature flags - Storage feature check\n readonly showUploadSection = computed(\n () =>\n isFeatureEnabled(this.appConfig, 'storage') &&\n this.uploadProvider !== null,\n );\n\n readonly showCompanySection = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n\n readonly showPermissionsSection = computed(\n () =>\n isFeatureEnabled(this.appConfig, 'iam') &&\n this.permissionProvider !== null,\n );\n\n readonly permissionMode = computed(() => getPermissionMode(this.appConfig));\n\n readonly showRoles = computed(() => {\n const mode = this.permissionMode();\n return mode === 'rbac' || mode === 'full';\n });\n\n readonly showActions = computed(() => {\n const mode = this.permissionMode();\n return mode === 'direct' || mode === 'full';\n });\n\n // Show bottom row only if at least one section is visible\n readonly showBottomRow = computed(\n () => this.showCompanySection() || this.showPermissionsSection(),\n );\n\n // Form\n readonly formModel = signal<IProfileFormModel>({\n name: '',\n phone: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: 'Name is required' });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n // Password form\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 model.confirmPassword.length === 0 || model.newPassword === model.confirmPassword;\n });\n\n // Upload function for FileUploader - uses provider if available\n readonly uploadFileFn: UploadFileFn = (file, options) => {\n if (!this.uploadProvider) {\n throw new Error('Upload provider not available');\n }\n return this.uploadProvider\n .uploadProfilePicture(file, {\n folderPath: options?.folderPath ?? 'profile-pictures',\n compress: options?.compress ?? true,\n maxWidth: options?.maxWidth ?? 400,\n maxHeight: options?.maxHeight ?? 400,\n })\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: response.data\n ? this.mapUploadResultToUploadedFile(response.data)\n : undefined,\n }))\n );\n };\n\n /** Map upload result to IUploadedFile format */\n private mapUploadResultToUploadedFile(result: IProfileUploadResult) {\n return {\n id: result.id, // UUID for storing in profilePictureId\n name: result.name,\n key: result.key,\n size: result.size,\n contentType: result.contentType,\n };\n }\n\n constructor() {\n // Initialize user data on construction\n this.loadUserData();\n\n // Effect for permissions loading when section is visible\n effect(() => {\n if (this.showPermissionsSection()) {\n this.loadPermissions();\n }\n });\n }\n\n private loadUserData(): void {\n const user = this.authState.user();\n if (user) {\n this.formModel.set({\n name: user.name ?? '',\n phone: user.phone ?? '',\n });\n\n // Load profile picture URL (only if storage is enabled)\n if (user.profilePictureId && isFeatureEnabled(this.appConfig, 'storage')) {\n this.fileUrlService\n .fetchSingleFileUrl(user.profilePictureId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((file) => {\n this._profilePictureUrl.set(file?.url ?? null);\n });\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 let rolesLoaded = !loadRoles;\n let actionsLoaded = !loadActions;\n\n const checkComplete = () => {\n if (rolesLoaded && actionsLoaded) {\n this.isLoadingPermissions.set(false);\n }\n };\n\n // Load roles (if applicable)\n if (loadRoles) {\n this.permissionProvider\n .getUserRoles(user.id, branch?.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this._userRoles.set(response.data ?? []);\n rolesLoaded = true;\n checkComplete();\n },\n error: () => {\n this._userRoles.set([]);\n rolesLoaded = true;\n checkComplete();\n },\n });\n }\n\n // Load actions (if applicable)\n if (loadActions) {\n this.permissionProvider\n .getUserActions(user.id, branch?.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this._userActions.set(response.data ?? []);\n actionsLoaded = true;\n checkComplete();\n },\n error: () => {\n this._userActions.set([]);\n actionsLoaded = true;\n checkComplete();\n },\n });\n }\n }\n\n onProfilePictureUploaded(file: { id?: string; name: string; key: string; size: number; contentType: string }): void {\n // Update user with new profile picture ID (file.id is the FileManager UUID)\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 // Update auth state with new profile picture ID\n this.authState.setUser({\n ...user,\n profilePictureId: fileManagerId,\n });\n // Fetch new profile picture URL (force refresh to get fresh URL)\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: 'Success',\n detail: 'Profile picture updated',\n });\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\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 this.userService\n .updateProfile(updateData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n // Update auth state with new user data (name and phone)\n this.authState.setUser({\n ...user,\n name: response.data.name,\n phone: response.data.phone ?? null,\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Profile updated successfully',\n });\n }\n this.isLoading.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this.isLoading.set(false);\n },\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(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Password changed successfully',\n });\n // Reset password form\n this.passwordModel.set({\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n });\n this.isPasswordLoading.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this.isPasswordLoading.set(false);\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n form,\n FormField,\n required,\n email as emailValidator,\n minLength,\n} from '@angular/forms/signals';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IRegistrationRequest } from '../../interfaces/auth.interface';\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 standalone: true,\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen py-8\"\n >\n <div class=\"flex flex-col items-center justify-center\">\n <div\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"py-8 px-4 sm:py-10 sm:px-8 md:py-12 md:px-12 w-full sm:w-[650px] max-w-[95vw] sm:max-w-[90vw]\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n <div class=\"text-center mb-6\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Create Account\n </div>\n <span class=\"text-muted-color font-medium\"\n >Register to get started</span\n >\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 >Full Name *</label\n >\n <input\n pInputText\n id=\"name\"\n [formField]=\"userForm.name\"\n placeholder=\"Your name\"\n class=\"w-full\"\n autocomplete=\"name\"\n />\n </div>\n\n <div>\n <label for=\"phone\" class=\"block font-medium mb-2\"\n >Phone</label\n >\n <input\n pInputText\n id=\"phone\"\n [formField]=\"userForm.phone\"\n placeholder=\"+1 234 567 8900\"\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 >Email *</label\n >\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"userForm.email\"\n placeholder=\"you@example.com\"\n class=\"w-full\"\n autocomplete=\"email\"\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 >Password *</label\n >\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"userForm.password\"\n placeholder=\"Min. 6 characters\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n </div>\n\n <div>\n <label for=\"confirmPassword\" class=\"block font-medium mb-2\"\n >Confirm Password *</label\n >\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n [formField]=\"userForm.confirmPassword\"\n placeholder=\"Confirm password\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch() && userFormModel().confirmPassword) {\n <small class=\"text-danger block mt-2\"\n >Passwords do not match</small\n >\n }\n </div>\n </div>\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 Company Details\n </div>\n <span class=\"text-muted-color font-medium\"\n >Join existing or create new company</span\n >\n </div>\n\n <div class=\"mb-4\">\n <label class=\"p-checkbox-native\" (click)=\"onCreateCompanyToggle()\">\n <input\n type=\"checkbox\"\n [formField]=\"companyForm.createNewCompany\"\n />\n <span>Create new company</span>\n </label>\n </div>\n\n @if (!companyFormModel().createNewCompany) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"companySlug\" class=\"block font-medium mb-2\"\n >Company Code</label\n >\n <input\n pInputText\n id=\"companySlug\"\n [formField]=\"companyForm.companySlug\"\n placeholder=\"Company code/slug\"\n class=\"w-full\"\n />\n <small class=\"text-muted-color\"\n >Enter company code to join</small\n >\n </div>\n\n <div>\n <label for=\"branchSlug\" class=\"block font-medium mb-2\"\n >Branch Code</label\n >\n <input\n pInputText\n id=\"branchSlug\"\n [formField]=\"companyForm.branchSlug\"\n placeholder=\"Branch code (optional)\"\n class=\"w-full\"\n />\n </div>\n </div>\n } @else {\n <div class=\"mb-4\">\n <label for=\"newCompanyName\" class=\"block font-medium mb-2\"\n >Company Name *</label\n >\n <input\n pInputText\n id=\"newCompanyName\"\n [formField]=\"companyForm.newCompanyName\"\n placeholder=\"Your company name\"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"newCompanyPhone\" class=\"block font-medium mb-2\"\n >Company Phone</label\n >\n <input\n pInputText\n id=\"newCompanyPhone\"\n [formField]=\"companyForm.newCompanyPhone\"\n placeholder=\"Company phone\"\n class=\"w-full\"\n />\n </div>\n\n <div>\n <label\n for=\"newCompanyAddress\"\n class=\"block font-medium mb-2\"\n >Address</label\n >\n <input\n pInputText\n id=\"newCompanyAddress\"\n [formField]=\"companyForm.newCompanyAddress\"\n placeholder=\"Company address\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <p-button\n label=\"Create Account\"\n styleClass=\"w-full mt-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">Already have an account?</span>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n Sign In\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 queryParamMap = toSignal(this.route.queryParamMap);\n private companySlugInitialized = false;\n\n readonly returnUrl = input<string>('');\n readonly isLoading = signal(false);\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n readonly userFormModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n confirmPassword: '',\n phone: '',\n });\n readonly userForm = form(this.userFormModel, (f) => {\n required(f.name, { message: 'Name is required' });\n minLength(f.name, 2, { message: 'Name must be at least 2 characters' });\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\n required(f.password, { message: 'Password is required' });\n minLength(f.password, 6, { message: 'Password must be at least 6 characters' });\n required(f.confirmPassword, { message: 'Please confirm your password' });\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, (f) => {});\n\n readonly passwordsMatch = computed(() => {\n const model = this.userFormModel();\n return model.password === model.confirmPassword;\n });\n readonly isFormValid = computed(() => {\n const userModel = this.userFormModel();\n const userValid =\n userModel.name.trim().length >= 2 &&\n userModel.email.includes('@') &&\n userModel.password.length >= 6 &&\n userModel.confirmPassword.length > 0 &&\n this.passwordsMatch();\n\n if (!isCompanyFeatureEnabled(this.appConfig)) return userValid;\n\n const companyModel = this.companyFormModel();\n if (companyModel.createNewCompany) {\n return userValid && companyModel.newCompanyName.trim().length > 0;\n }\n return userValid;\n });\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (!params || this.companySlugInitialized) return;\n\n this.companySlugInitialized = true;\n const companySlug = params.get('companySlug');\n if (companySlug) {\n this.companyFormModel.update((model) => ({ ...model, companySlug }));\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: 'Validation Error',\n detail: 'Please fill in all required fields correctly.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const userModel = this.userFormModel();\n const companyModel = this.companyFormModel();\n\n const registrationData: IRegistrationRequest = {\n name: userModel.name,\n email: userModel.email,\n password: userModel.password,\n phone: userModel.phone || undefined,\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)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (response.requiresEmailVerification) {\n this.messageService.add({\n severity: 'success',\n summary: 'Account Created',\n detail: 'Please check your email to verify your account.',\n life: 5000,\n });\n this.router.navigate(['/auth/login']);\n return;\n }\n\n if (response.accessToken) {\n this.authState.setLoginState({\n accessToken: response.accessToken,\n refreshToken: response.refreshToken!,\n user: response.user,\n company: response.company,\n branch: response.branch,\n companyFeatureEnabled: response.companyFeatureEnabled,\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Account created successfully!',\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: () => {\n this.isLoading.set(false);\n // Error toast handled by global interceptor\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\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 {\n form,\n FormField,\n required,\n minLength,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IResetPasswordFormModel {\n newPassword: string;\n confirmPassword: string;\n}\n\ntype PageState = 'form' | 'success' | 'invalid-token';\n\n@Component({\n selector: 'lib-reset-password-page',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('form') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Reset Password\n </div>\n <span class=\"text-muted-color font-medium\">\n Enter your new password below.\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"newPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n New Password\n </label>\n <input\n pInputText\n id=\"newPassword\"\n type=\"password\"\n placeholder=\"Enter new password\"\n class=\"w-full md:w-[25rem] mb-4\"\n [formField]=\"resetForm.newPassword\"\n autocomplete=\"new-password\" />\n\n <label for=\"confirmPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n Confirm Password\n </label>\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"w-full md:w-[25rem] mb-2\"\n [formField]=\"resetForm.confirmPassword\"\n autocomplete=\"new-password\" />\n\n @if (passwordMismatch()) {\n <small class=\"text-danger block mb-4\">Passwords do not match</small>\n }\n\n <p-button\n label=\"Reset Password\"\n styleClass=\"w-full mt-4 mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!canSubmit() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\n </a>\n </div>\n </form>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-6xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Password Reset Successful\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n Your password has been reset successfully.\n You can now sign in with your new password.\n </p>\n <a routerLink=\"/auth/login\">\n <p-button label=\"Sign In\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-6xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Invalid or Expired Link\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n This password reset link is invalid or has expired.\n Please request a new one.\n </p>\n <a routerLink=\"/auth/forgot-password\">\n <p-button label=\"Request New Link\" styleClass=\"w-full mb-4\" />\n </a>\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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\n private readonly queryParams = toSignal(this.route.queryParams);\n private tokenInitialized = false;\n\n private token = '';\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('form');\n readonly formModel = signal<IResetPasswordFormModel>({ newPassword: '', confirmPassword: '' });\n readonly resetForm = form(this.formModel, (f) => {\n required(f.newPassword, { message: 'New password is required' });\n minLength(f.newPassword, 6, { message: 'Password must be at least 6 characters' });\n required(f.confirmPassword, { message: 'Please confirm your password' });\n });\n readonly passwordMismatch = computed(() => {\n const model = this.formModel();\n return model.confirmPassword.length > 0 && model.newPassword !== model.confirmPassword;\n });\n readonly canSubmit = computed(() => this.resetForm().valid() && !this.passwordMismatch());\n\n constructor() {\n effect(() => {\n const params = this.queryParams();\n if (!params || this.tokenInitialized) return;\n\n this.tokenInitialized = true;\n this.token = params['token'] || '';\n if (!this.token) {\n this.pageState.set('invalid-token');\n }\n });\n }\n\n onSubmit(): void {\n if (!this.canSubmit()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all fields correctly.',\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(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Your password has been reset successfully.',\n });\n this.pageState.set('success');\n },\n error: (error) => {\n this.isLoading.set(false);\n const message = error.error?.message || '';\n // Show invalid-token state for expired/invalid token errors\n if (message.toLowerCase().includes('expired') || message.toLowerCase().includes('invalid')) {\n this.pageState.set('invalid-token');\n }\n // Other errors handled by global interceptor\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n form,\n FormField,\n required,\n email as emailValidator,\n minLength,\n} from '@angular/forms/signals';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IUser, ICreateUserRequest, IUpdateUserRequest } from '../../interfaces/user.interface';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserPermissionApiService } from '../../services/user-permission-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/** User form model interface */\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n phone: string;\n isActive: boolean;\n emailVerified: boolean;\n}\n\n/**\n * User Form Component\n * Handles creating and editing users.\n * When company feature is enabled, automatically assigns new users to current company/branch.\n */\n@Component({\n selector: 'lib-user-form',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? 'Edit User' : 'New User' }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n placeholder=\"Full name\" />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">Email *</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"formTree.email\"\n placeholder=\"user@example.com\" />\n </div>\n\n <!-- Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"password\" class=\"font-medium\">\n Password {{ isEditMode() ? '(leave blank to keep)' : '*' }}\n </label>\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"formTree.password\"\n placeholder=\"Password\" />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n placeholder=\"+1 234 567 8900\" />\n </div>\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.isActive\" />\n <span>Active</span>\n </label>\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.emailVerified\" />\n <span>Email Verified</span>\n </label>\n </div>\n\n <!-- Company Info (when company feature enabled) -->\n @if (companyFeatureEnabled() && !isEditMode()) {\n <div class=\"md:col-span-2 p-3 bg-primary/10 rounded-lg border border-primary/20\">\n <div class=\"flex items-center gap-2 text-primary\">\n <i class=\"pi pi-info-circle\"></i>\n <span class=\"text-sm\">\n User will be automatically assigned to\n <strong>{{ currentCompanyName() }}</strong>\n @if (currentBranchName()) {\n / <strong>{{ currentBranchName() }}</strong>\n }\n </span>\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n label=\"Cancel\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class UserFormComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly userService = inject(UserApiService);\n private readonly permissionService = inject(UserPermissionApiService);\n private readonly authState = inject(AuthStateService);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private userLoadTriggered = false;\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing user data when editing */\n readonly existingUser = signal<IUser | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingUser());\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Current company name */\n readonly currentCompanyName = computed(() => this.authState.companyName());\n\n /** Current branch name */\n readonly currentBranchName = computed(() => this.authState.branchName());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n phone: '',\n isActive: true,\n emailVerified: false,\n });\n\n /** Form with validation schema */\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: 'Name is required' });\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\n // Password validation is conditional - required only for new users\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n const isEdit = this.isEditMode();\n\n // Basic validation\n const nameValid = model.name.trim().length > 0;\n const emailValid = model.email.includes('@');\n\n // Password validation - required only for new users\n const passwordValid = isEdit ? true : model.password.length >= 6;\n\n return nameValid && emailValid && passwordValid;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.userLoadTriggered) return;\n\n this.userLoadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadUser(id);\n }\n });\n }\n\n loadUser(id: string): void {\n this.isLoading.set(true);\n this.userService.findById(id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingUser.set(response.data);\n this.formModel.set({\n name: response.data.name,\n email: response.data.email,\n password: '',\n phone: response.data.phone || '',\n isActive: response.data.isActive,\n emailVerified: response.data.emailVerified,\n });\n }\n this.isLoading.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this.router.navigate(['/administration/users']);\n this.isLoading.set(false);\n },\n });\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n this.isLoading.set(true);\n const model = this.formModel();\n\n if (this.isEditMode() && this.existingUser()) {\n // Update existing user\n const updateData: IUpdateUserRequest = {\n id: this.existingUser()!.id,\n name: model.name,\n email: model.email,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n // Only include password if provided\n if (model.password) {\n updateData.password = model.password;\n }\n\n this.userService.update(updateData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'User updated successfully.',\n });\n this.router.navigate(['/administration/users']);\n this.isLoading.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this.isLoading.set(false);\n },\n });\n } else {\n // Create new user\n const createData: ICreateUserRequest = {\n name: model.name,\n email: model.email,\n password: model.password,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n this.userService.insert(createData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (createResponse) => {\n // Auto-assign to company/branch if company feature enabled\n if (isCompanyFeatureEnabled(this.appConfig) && createResponse.success && createResponse.data) {\n const userId = createResponse.data.id;\n this.assignUserToCompanyAndBranch(userId);\n }\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'User created successfully.',\n });\n this.router.navigate(['/administration/users']);\n this.isLoading.set(false);\n },\n error: () => {\n // Error toast handled by global interceptor\n this.isLoading.set(false);\n },\n });\n }\n }\n\n /**\n * Assign user to current company and branch\n */\n private assignUserToCompanyAndBranch(userId: string): void {\n const company = this.authState.company();\n const branch = this.authState.branch();\n\n if (!company) return;\n\n // Assign to company\n this.permissionService.assignUserToCompany(userId, company.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // If branch exists, assign to branch\n if (branch) {\n this.permissionService.assignUserToBranch(userId, branch.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n // Silently fail - user was created successfully\n });\n }\n },\n // Silently fail - user was created successfully\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/users']);\n }\n}\n","import { ChangeDetectionStrategy, Component, effect, inject, input, output, signal } from '@angular/core';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\nimport { IUser } from '../interfaces/user.interface';\nimport { ICompany } from '../interfaces/company.interface';\n\n/**\n * User Company Permission Dialog\n * Shows all companies with checkboxes\n * Initially assigned companies are checked\n * Check to assign, uncheck to revoke\n */\n@Component({\n selector: 'lib-user-company-permission-dialog',\n standalone: true,\n imports: [AngularModule, PrimeModule, DialogModule, ProgressSpinnerModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n header=\"Manage Company Permissions\"\n (onHide)=\"onClose()\">\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color\">\n User: <strong>{{ user()?.name }}</strong> ({{ user()?.email }})\n </p>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (company of companies(); track company.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"company.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'company-' + company.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onCompanyToggle(company)\" />\n <label [for]=\"'company-' + company.id\" class=\"ml-3 flex-1 cursor-pointer\">\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 No companies available\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n label=\"Close\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\" />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserCompanyPermissionDialogComponent {\n private readonly companyApi = inject(CompanyApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n\n /** Dialog visibility */\n readonly visible = input.required<boolean>();\n\n /** User to manage permissions for */\n readonly user = input.required<IUser | null>();\n\n /** Close event */\n readonly closed = output<void>();\n\n /** Refresh event after changes */\n readonly permissionsChanged = output<void>();\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Saving state */\n readonly isSaving = signal(false);\n\n /** Companies with assignment status */\n readonly companies = signal<CompanyWithAssignment[]>([]);\n\n /** Currently assigned company IDs */\n private assignedCompanyIds = new Set<string>();\n\n constructor() {\n // Load companies and permissions when dialog becomes visible\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 // Load all companies\n const companiesResponse = await firstValueFrom(\n this.companyApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n select: [],\n sort: {},\n })\n );\n\n // Load user's assigned companies\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id)\n );\n\n // Build set of assigned company IDs\n this.assignedCompanyIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n this.assignedCompanyIds.add(permission.companyId);\n });\n }\n\n // Map companies with assignment status\n const companiesWithStatus: CompanyWithAssignment[] =\n (companiesResponse.data || []).map((company) => ({\n ...company,\n isAssigned: this.assignedCompanyIds.has(company.id),\n }));\n\n this.companies.set(companiesWithStatus);\n } catch {\n // Error toast handled by global interceptor\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 // Assign company\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: 'Success',\n detail: `Assigned ${company.name}`,\n });\n this.permissionsChanged.emit();\n }\n } else {\n // Revoke company\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: 'Success',\n detail: `Revoked ${company.name}`,\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n // Revert checkbox on error\n company.isAssigned = !company.isAssigned;\n // Error toast handled by global interceptor\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n\ninterface CompanyWithAssignment extends ICompany {\n isAssigned: boolean;\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { BranchApiService } from '../services/branch-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { IUser } from '../interfaces/user.interface';\nimport { IBranch } from '../interfaces/branch.interface';\n\n/**\n * User Branch Permission Dialog\n *\n * Workflow:\n * 1. Dialog opens → Shows company dropdown with user's permitted companies\n * 2. User selects a company → Branches load for that company\n * 3. Branches show with checkboxes (checked = already assigned)\n * 4. Check to assign, uncheck to revoke\n *\n * Company dropdown only shows companies the user has company-level permissions for.\n * Branch permissions can only be assigned within user's permitted companies.\n */\n@Component({\n selector: 'lib-user-branch-permission-dialog',\n standalone: true,\n imports: [AngularModule, PrimeModule, DialogModule, ProgressSpinnerModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n header=\"Manage Branch Permissions\"\n (onHide)=\"onClose()\">\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color mb-3\">\n User: <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]\">Company:</label>\n <p-select\n [options]=\"companies()\"\n [(ngModel)]=\"selectedCompanyId\"\n (onChange)=\"onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Company\"\n styleClass=\"w-full\"\n [disabled]=\"isLoading() || isSaving()\" />\n </div>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (branch of branches(); track branch.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"branch.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'branch-' + branch.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onBranchToggle(branch)\" />\n <label [for]=\"'branch-' + branch.id\" class=\"ml-3 flex-1 cursor-pointer\">\n <div class=\"font-semibold\">{{ branch.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ branch.slug }}</div>\n </label>\n </div>\n } @empty {\n <div class=\"text-center py-4 text-muted-color\">\n @if (companies().length === 0) {\n This user has no company permissions assigned.<br/>\n <span class=\"text-xs\">Assign company permissions first before managing branch access.</span>\n } @else if (!selectedCompanyId) {\n Please select a company to view branches.\n } @else {\n No branches available for the selected company.\n }\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n label=\"Close\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\" />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserBranchPermissionDialogComponent {\n private readonly branchApi = inject(BranchApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly authState = inject(AuthStateService);\n private readonly messageService = inject(MessageService);\n\n /** Dialog visibility */\n readonly visible = input.required<boolean>();\n\n /** User to manage permissions for */\n readonly user = input.required<IUser | null>();\n\n /** Close event */\n readonly closed = output<void>();\n\n /** Refresh event after changes */\n readonly permissionsChanged = output<void>();\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Saving state */\n readonly isSaving = signal(false);\n\n /** Branches with assignment status */\n readonly branches = signal<BranchWithAssignment[]>([]);\n\n /** Available companies (filtered by user's company permissions) */\n readonly companies = signal<Array<{ id: string; name: string }>>([]);\n\n /** Selected company ID */\n selectedCompanyId: string | null = null;\n\n /** Current company from auth state */\n readonly currentCompany = computed(() => this.authState.company());\n\n /** Currently assigned branch IDs */\n private assignedBranchIds = new Set<string>();\n\n constructor() {\n // Load user's companies and branches when dialog becomes visible\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadUserCompaniesAndData();\n }\n });\n }\n\n /**\n * Load user's assigned companies (does not auto-select or load branches)\n */\n private async loadUserCompaniesAndData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n try {\n // Load user's company permissions\n const companiesResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id)\n );\n\n // Map to company dropdown options\n const userCompanies = (companiesResponse.data || []).map((permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n }));\n\n this.companies.set(userCompanies);\n\n // Clear selection and branches when dialog reopens\n this.selectedCompanyId = null;\n this.branches.set([]);\n } catch {\n // Error toast handled by global interceptor\n }\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n const companyId = this.selectedCompanyId;\n\n if (!currentUser || !companyId) return;\n\n this.isLoading.set(true);\n try {\n // Load all branches for selected company\n const branchesResponse = await firstValueFrom(\n this.branchApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { companyId },\n select: [],\n sort: {},\n })\n );\n\n // Load user's assigned branches\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserBranches(currentUser.id)\n );\n\n // Build set of assigned branch IDs (filter by selected company)\n this.assignedBranchIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n // Filter by selected company\n if (permission.companyId === companyId) {\n this.assignedBranchIds.add(permission.branchId);\n }\n });\n }\n\n // Map branches with assignment status\n const branchesWithStatus: BranchWithAssignment[] =\n (branchesResponse.data || []).map((branch) => ({\n ...branch,\n isAssigned: this.assignedBranchIds.has(branch.id),\n }));\n\n this.branches.set(branchesWithStatus);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId) {\n this.loadData();\n }\n }\n\n async onBranchToggle(branch: BranchWithAssignment): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (branch.isAssigned) {\n // Assign branch\n const response = await firstValueFrom(\n this.permissionApi.assignUserToBranch(currentUser.id, branch.id)\n );\n\n if (response.success) {\n this.assignedBranchIds.add(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Assigned ${branch.name}`,\n });\n this.permissionsChanged.emit();\n }\n } else {\n // Revoke branch\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromBranch(currentUser.id, branch.id)\n );\n\n if (response.success) {\n this.assignedBranchIds.delete(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Revoked ${branch.name}`,\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n // Revert checkbox on error\n branch.isAssigned = !branch.isAssigned;\n // Error toast handled by global interceptor\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n\ninterface BranchWithAssignment extends IBranch {\n isAssigned: boolean;\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AngularModule, HasPermissionDirective, PrimeModule, USER_PERMISSIONS } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { IUser } from '../../interfaces/user.interface';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserCompanyPermissionDialogComponent } from '../../components/user-company-permission-dialog.component';\nimport { UserBranchPermissionDialogComponent } from '../../components/user-branch-permission-dialog.component';\n\n/**\n * User List Component\n * Displays a list of users with CRUD operations.\n */\n@Component({\n selector: 'lib-user-list',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AngularModule,\n PrimeModule,\n TagModule,\n HasPermissionDirective,\n UserCompanyPermissionDialogComponent,\n UserBranchPermissionDialogComponent,\n ],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">Users</h2>\n <p-button *hasPermission=\"USER_PERMISSIONS.CREATE\" label=\"Add User\" icon=\"pi pi-plus\" (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"users()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Email Verified</th>\n <th>Status</th>\n <th class=\"w-[150px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-user>\n <tr>\n <td>{{ user.name }}</td>\n <td>{{ user.email }}</td>\n <td>{{ user.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"user.emailVerified ? 'Verified' : 'Unverified'\"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\" />\n </td>\n <td>\n <p-tag\n [value]=\"user.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"user.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n pTooltip=\"Edit\"\n (onClick)=\"onEdit(user)\" />\n @if (companyFeatureEnabled()) {\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n pTooltip=\"Company Permissions\"\n (onClick)=\"onManageCompanyPermissions(user)\" />\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-sitemap\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n pTooltip=\"Branch Permissions\"\n (onClick)=\"onManageBranchPermissions(user)\" />\n }\n <p-button\n *hasPermission=\"USER_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n pTooltip=\"Delete\"\n (onClick)=\"onDelete(user)\" />\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 No users found. Click \"Add User\" to create one.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n\n <!-- Permission Dialogs -->\n @if (companyFeatureEnabled()) {\n <lib-user-company-permission-dialog\n [visible]=\"showCompanyDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showCompanyDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n\n <lib-user-branch-permission-dialog\n [visible]=\"showBranchDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showBranchDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n }\n `,\n})\nexport class UserListComponent {\n // Permission constants for template\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 /** Users from service */\n readonly users = this.userService.data;\n\n /** Loading state from service */\n readonly isLoading = this.userService.isLoading;\n\n /** Total count from service */\n readonly total = this.userService.total;\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Dialog visibility */\n readonly showCompanyDialog = signal(false);\n readonly showBranchDialog = signal(false);\n\n /** Selected user for permission management */\n readonly selectedUser = signal<IUser | null>(null);\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.selectedUser.set(user);\n this.showCompanyDialog.set(true);\n }\n\n onManageBranchPermissions(user: IUser): void {\n this.selectedUser.set(user);\n this.showBranchDialog.set(true);\n }\n\n onDelete(user: IUser): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${user.name}\"?`,\n header: 'Delete User',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.userService.deleteAsync({ id: user.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'User deleted successfully.',\n });\n this.userService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\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 form,\n FormField,\n required,\n email as emailValidator,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\nconst VERIFY_EMAIL_KEY = makeStateKey<'success' | 'error'>('verify-email-result');\n\ninterface IResendFormModel {\n email: string;\n}\n\ntype PageState = 'verifying' | 'success' | 'invalid-token' | 'resend';\n\n@Component({\n selector: 'lib-verify-email-page',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('verifying') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-spin pi-spinner text-8xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Verifying Email\n </div>\n <p class=\"text-muted-color font-medium\">\n Please wait while we verify your email address...\n </p>\n </div>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-8xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Email Verified\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n Your email address has been verified successfully.\n You can now access all features of your account.\n </p>\n <a routerLink=\"/auth/login\">\n <p-button label=\"Sign In\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-8xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Verification Failed\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n This verification link is invalid or has expired.\n </p>\n <p-button\n label=\"Resend Verification Email\"\n styleClass=\"w-full mb-4\"\n (onClick)=\"showResendForm()\" />\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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 Resend Verification\n </div>\n <span class=\"text-muted-color font-medium\">\n Enter your email to receive a new verification link.\n </span>\n </div>\n\n @if (!resendSuccess()) {\n <form (ngSubmit)=\"onResend()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n Email\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n placeholder=\"Enter your email address\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"resendForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n label=\"Resend Verification\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isResendFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-8xl text-primary\"></i>\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n We've sent a new verification link to <strong>{{ submittedEmail() }}</strong>.\n Please check your inbox.\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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\n private readonly queryParams = toSignal(this.route.queryParams);\n private verificationTriggered = false;\n\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('verifying');\n readonly resendSuccess = signal(false);\n readonly submittedEmail = signal('');\n readonly resendFormModel = signal<IResendFormModel>({ email: '' });\n readonly resendForm = form(this.resendFormModel, (f) => {\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\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: 'Success',\n detail: 'Your email has been verified successfully.',\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: 'Validation Error',\n detail: 'Please enter a valid email address.',\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.resendFormModel().email;\n\n this.authApi\n .resendVerification(email)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.handleResendComplete(email),\n error: () => this.handleResendComplete(email),\n });\n }\n\n private handleResendComplete(email: string): void {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: 'Email Sent',\n detail: 'If the email exists, a verification link has been 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 (for ng-layout integration)\nexport * from './adapters/auth-layout-adapter';\n\n// Adapters (for provider interfaces from ng-shared)\nexport * from './adapters/auth-user-provider.adapter';\nexport * from './adapters/auth-company-api-provider.adapter';\nexport * from './adapters/auth-user-permission-provider.adapter';\nexport * from './adapters/auth-state-provider.adapter';\n\n// Providers\nexport * from './providers/auth-layout.providers';\nexport * from './providers/auth-providers';\n\n// Constants\nexport * from './constants/auth-endpoints.const';\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","i1","i4","i5","i6","i7","i2","i3","emailValidator"],"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/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/pages/administration/administration-page.component.ts","../../../projects/ng-auth/pages/branch/branch-form.component.ts","../../../projects/ng-auth/pages/branch/branch-list.component.ts","../../../projects/ng-auth/pages/company/company-form.component.ts","../../../projects/ng-auth/pages/company/company-list.component.ts","../../../projects/ng-auth/pages/forgot-password/forgot-password-page.component.ts","../../../projects/ng-auth/pages/login/login-page.component.ts","../../../projects/ng-auth/pages/profile/profile-page.component.ts","../../../projects/ng-auth/pages/register/register-page.component.ts","../../../projects/ng-auth/pages/reset-password/reset-password-page.component.ts","../../../projects/ng-auth/pages/users/user-form.component.ts","../../../projects/ng-auth/components/user-company-permission-dialog.component.ts","../../../projects/ng-auth/components/user-branch-permission-dialog.component.ts","../../../projects/ng-auth/pages/users/user-list.component.ts","../../../projects/ng-auth/pages/verify-email/verify-email-page.component.ts","../../../projects/ng-auth/public-api.ts","../../../projects/ng-auth/flusys-ng-auth.ts"],"sourcesContent":["// Request Interfaces\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}\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\n// Response Helper Interfaces\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// Response Interfaces\nexport interface ILoginResponse {\n accessToken: string;\n refreshToken: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IMeResponse {\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n}\n\nexport interface IRegistrationResponse {\n accessToken?: string;\n refreshToken?: string;\n user: IUserInfo;\n company?: ICompanyInfo;\n branch?: IBranchInfo;\n requiresEmailVerification?: boolean;\n}\n\nexport interface ICompanySelectionResponse {\n requiresSelection: true;\n sessionId: string;\n expiresAt: Date | string;\n user: IUserInfo;\n companies: ICompanyWithBranches[];\n}\n\nexport interface IRefreshTokenResponse {\n accessToken: string;\n refreshToken?: string;\n}\n\nexport interface ILoginRequiresEmailVerification {\n requiresEmailVerification: true;\n email: string;\n message: string;\n}\n\n// Type Guards\nexport type AuthResponse = ILoginResponse | ICompanySelectionResponse | ILoginRequiresEmailVerification;\n\nexport function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification {\n return 'requiresEmailVerification' in response && response.requiresEmailVerification === true;\n}\n\nexport function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse {\n return 'requiresSelection' in response && response.requiresSelection === true;\n}\n\nexport function isLoginResponse(response: AuthResponse): response is ILoginResponse {\n return 'accessToken' in response && !('requiresSelection' in response) && !('requiresEmailVerification' in response);\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl } from '@flusys/ng-core';\nimport { IMessageResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n AuthResponse,\n IChangePasswordRequest,\n ILoginRequest,\n ILoginResponse,\n IMeResponse,\n IRefreshTokenResponse,\n IRegistrationRequest,\n IRegistrationResponse,\n ISelectRequest,\n ISwitchCompanyRequest,\n} from '../interfaces/auth.interface';\n\n/**\n * Auth API Service\n * Handles all authentication-related API calls matching NestJS auth endpoints\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthApiService {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl: string;\n\n constructor() {\n this.baseUrl = getServiceUrl(this.appConfig, 'auth');\n }\n\n /**\n * Login with email and password\n * Returns either:\n * - ILoginResponse (direct login success)\n * - ICompanySelectionResponse (requires company/branch selection)\n */\n login(data: ILoginRequest): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${this.baseUrl}/login`, data);\n }\n\n /**\n * Register new user\n * Supports simple registration and company-based registration\n * Returns RegistrationResponse directly (not wrapped in SingleResponse)\n */\n register(data: IRegistrationRequest): Observable<IRegistrationResponse> {\n return this.http.post<IRegistrationResponse>(\n `${this.baseUrl}/register`,\n data,\n );\n }\n\n /**\n * Select company and branch after login\n * Used when login returns requiresSelection: true\n * Returns LoginResponse directly (not wrapped)\n */\n select(data: ISelectRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(`${this.baseUrl}/select`, data);\n }\n\n /**\n * Switch company/branch for logged-in user\n * Returns LoginResponse directly (not wrapped)\n */\n switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse> {\n return this.http.post<ILoginResponse>(\n `${this.baseUrl}/switch-company`,\n data,\n );\n }\n\n /**\n * Refresh access token\n * Refresh token is sent via HTTP-only cookie\n * Returns RefreshTokenResponse directly (not wrapped)\n */\n refresh(): Observable<IRefreshTokenResponse> {\n return this.http.post<IRefreshTokenResponse>(`${this.baseUrl}/refresh`, {});\n }\n\n /**\n * Get current user info\n * Returns only user data (no tokens) - IMeResponse\n */\n me(): Observable<IMeResponse> {\n return this.http.post<IMeResponse>(`${this.baseUrl}/me`, {});\n }\n\n /**\n * Logout current user\n */\n logout(): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/logout`, {});\n }\n\n /**\n * Change password for logged-in user\n */\n changePassword(data: IChangePasswordRequest): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/change-password`,\n data,\n );\n }\n\n /**\n * Send forgot password email\n */\n forgotPassword(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/forgot-password`, {\n email,\n });\n }\n\n /**\n * Reset password with token\n */\n resetPassword(\n token: string,\n newPassword: string,\n ): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(`${this.baseUrl}/reset-password`, {\n token,\n newPassword,\n });\n }\n\n /**\n * Resend verification email (unauthenticated)\n */\n resendVerification(email: string): Observable<IMessageResponse> {\n return this.http.post<IMessageResponse>(\n `${this.baseUrl}/resend-verification`,\n { email },\n );\n }\n\n /**\n * Verify email with token\n * Returns IMessageResponse for existing user verification\n * Returns IRegistrationResponse for pending registration completion\n */\n verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse> {\n return this.http.post<IMessageResponse | IRegistrationResponse>(`${this.baseUrl}/verify-email`, {\n token,\n });\n }\n}\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { PlatformService } from '@flusys/ng-shared';\nimport {\n IBranchInfo,\n ICompanyInfo,\n ICompanySelectionResponse,\n ICompanyWithBranches,\n ILoginResponse,\n IUserInfo,\n} from '../interfaces/auth.interface';\n\n/**\n * Storage keys (static constants)\n * NOTE: Access token is NOT stored - kept in memory only for security (XSS protection)\n * Only token expiry is stored to know when refresh is needed on page load\n */\nconst STORAGE = {\n TOKEN_EXPIRY: 'tokenExpiresAt', // Store expiry time, not the token itself\n COMPANY_ID: 'selectedCompanyId',\n BRANCH_ID: 'selectedBranchId',\n} as const;\n\n/**\n * Auth State Service\n * Minimal signal-based state management for authentication\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n // DI Injection\n private readonly appConfig = inject(APP_CONFIG);\n private readonly router = inject(Router);\n private readonly platform = inject(PlatformService);\n\n // Core State (private writable, public readonly)\n private readonly _user = signal<IUserInfo | null>(null);\n private readonly _accessToken = signal<string>(''); // Memory-only, not persisted\n private readonly _tokenExpiresAt = signal<number | null>(null); // Token expiry timestamp\n private readonly _company = signal<ICompanyInfo | null>(null);\n private readonly _branch = signal<IBranchInfo | null>(null);\n\n readonly user = this._user.asReadonly();\n readonly accessToken = this._accessToken.asReadonly();\n readonly tokenExpiresAt = this._tokenExpiresAt.asReadonly();\n readonly company = this._company.asReadonly();\n readonly branch = this._branch.asReadonly();\n\n // Company Selection State (temporary during login flow)\n private readonly _selectionSessionId = signal<string | null>(null);\n private readonly _availableCompanies = signal<ICompanyWithBranches[]>([]);\n private readonly _selectionExpiresAt = signal<Date | null>(null);\n\n readonly selectionSessionId = this._selectionSessionId.asReadonly();\n readonly availableCompanies = this._availableCompanies.asReadonly();\n\n // Computed States\n readonly isAuthenticated = computed(\n () => !!this._accessToken() && !!this._user(),\n );\n readonly requiresCompanySelection = computed(\n () => !!this._selectionSessionId() && this._availableCompanies().length > 0,\n );\n readonly userName = computed(() => this._user()?.name ?? 'User');\n readonly companyName = computed(() => this._company()?.name ?? '');\n readonly branchName = computed(() => this._branch()?.name ?? '');\n\n /**\n * Check if token is expired or will expire soon (within 30 seconds).\n * Used to proactively refresh token before requests fail.\n */\n readonly isTokenExpired = computed(() => {\n const expiresAt = this._tokenExpiresAt();\n if (!expiresAt) return true;\n // Consider expired 30 seconds before actual expiry\n return Date.now() >= expiresAt - 30000;\n });\n\n // Config-derived states\n readonly tenantId = computed(\n () => this.appConfig.multiTenant.tenantId ?? null,\n );\n\n constructor() {\n // Auto-persist token expiry (NOT the token itself - security)\n effect(() => {\n const expiresAt = this._tokenExpiresAt();\n expiresAt\n ? this.store(STORAGE.TOKEN_EXPIRY, expiresAt.toString())\n : this.remove(STORAGE.TOKEN_EXPIRY);\n });\n\n // Auto-persist company/branch IDs\n effect(() => {\n const companyId = this._company()?.id;\n const branchId = this._branch()?.id;\n companyId\n ? this.store(STORAGE.COMPANY_ID, companyId)\n : this.remove(STORAGE.COMPANY_ID);\n branchId\n ? this.store(STORAGE.BRANCH_ID, branchId)\n : this.remove(STORAGE.BRANCH_ID);\n });\n\n // Load initial state from storage (expiry only, not token)\n this.loadFromStorage();\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n setLoginState(response: ILoginResponse): void {\n this._accessToken.set(response.accessToken);\n this._user.set(response.user);\n this._company.set(response.company ?? null);\n this._branch.set(response.branch ?? null);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(response.accessToken);\n this._tokenExpiresAt.set(expiry);\n this.clearSelectionState();\n }\n\n setSelectionState(response: ICompanySelectionResponse): void {\n this._selectionSessionId.set(response.sessionId);\n this._availableCompanies.set(response.companies);\n this._selectionExpiresAt.set(new Date(response.expiresAt));\n this._user.set(response.user);\n }\n\n clearSelectionState(): void {\n this._selectionSessionId.set(null);\n this._availableCompanies.set([]);\n this._selectionExpiresAt.set(null);\n }\n\n resetState(): void {\n this._user.set(null);\n this._accessToken.set('');\n this._tokenExpiresAt.set(null);\n this._company.set(null);\n this._branch.set(null);\n this.clearSelectionState();\n Object.values(STORAGE).forEach((key) => this.remove(key));\n }\n\n // ==========================================================================\n // Individual Setters (for external use where needed)\n // ==========================================================================\n\n setUser(user: IUserInfo | null): void {\n this._user.set(user);\n }\n\n setAccessToken(token: string): void {\n this._accessToken.set(token);\n // Decode token to get expiry time\n const expiry = this.decodeTokenExpiry(token);\n this._tokenExpiresAt.set(expiry);\n }\n\n setCompany(company: ICompanyInfo | null): void {\n this._company.set(company);\n }\n\n setBranch(branch: IBranchInfo | null): void {\n this._branch.set(branch);\n }\n\n // ==========================================================================\n // Navigation Helpers\n // ==========================================================================\n\n navigateToLogin(returnUrl?: string): void {\n this.router.navigate(\n ['/auth/login'],\n returnUrl ? { queryParams: { returnUrl } } : {},\n );\n }\n\n navigateAfterLogin(returnUrl?: string): void {\n // Validate returnUrl to prevent open redirect attacks\n const safeUrl = this.isValidReturnUrl(returnUrl) ? returnUrl : '/';\n this.router.navigateByUrl(safeUrl);\n }\n\n /** Validates a return URL to prevent open redirect attacks */\n private isValidReturnUrl(url: string | undefined): url is string {\n if (!url) return false;\n // Must start with '/' and not contain protocol indicators\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n }\n\n // Storage accessors (used by components)\n getStoredCompanyId(): string | null {\n return this.get(STORAGE.COMPANY_ID);\n }\n\n getStoredBranchId(): string | null {\n return this.get(STORAGE.BRANCH_ID);\n }\n\n // Storage helpers\n private loadFromStorage(): void {\n if (this.platform.isServer) return;\n // Load token expiry (NOT the token - it's memory-only for security)\n const expiryStr = this.get(STORAGE.TOKEN_EXPIRY);\n if (expiryStr) {\n this._tokenExpiresAt.set(parseInt(expiryStr, 10));\n }\n }\n\n /**\n * Decode JWT expiry without verification (client-side only).\n * Returns expiry timestamp in milliseconds.\n */\n private decodeTokenExpiry(token: string): number | null {\n try {\n if (!token) return null;\n const payload = token.split('.')[1];\n if (!payload) return null;\n // Convert base64url to base64 and add padding\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const decoded = JSON.parse(atob(padded));\n return decoded.exp ? decoded.exp * 1000 : null; // Convert to milliseconds\n } catch {\n return null;\n }\n }\n\n private store(key: string, value: string): void {\n if (!this.platform.isServer) localStorage.setItem(key, value);\n }\n\n private get(key: string): string | null {\n return !this.platform.isServer ? localStorage.getItem(key) : null;\n }\n\n private remove(key: string): void {\n if (!this.platform.isServer) localStorage.removeItem(key);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport {\n catchError,\n finalize,\n map,\n Observable,\n of,\n shareReplay,\n switchMap,\n tap,\n timeout,\n} from 'rxjs';\nimport { AuthApiService } from './auth-api.service';\nimport { AuthStateService } from './auth-state.service';\n\n/**\n * Auth Initialization Service\n * Handles app startup authentication flow:\n * 1. Check if user has valid session (via refresh token cookie)\n * 2. Restore user state from /auth/me\n * 3. Handle company selection if needed\n *\n * IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthInitService {\n private readonly authState = inject(AuthStateService);\n private readonly authApi = inject(AuthApiService);\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n\n /** Whether initial auth check has completed */\n readonly initialized = signal(false);\n\n /** Whether auth check is in progress */\n readonly loading = signal(false);\n\n /** Error from auth check */\n readonly error = signal<string | null>(null);\n\n /** Cached initialization observable to prevent duplicate calls */\n private initializationCache$: Observable<boolean> | null = null;\n\n /**\n * Initialize authentication state on app startup.\n *\n * Flow:\n * 1. If already authenticated with user data -> done\n * 2. Try refresh token (via cookie) -> get new access token\n * 3. Call /auth/me to get user info\n * 4. Update state accordingly\n *\n * Uses shareReplay to prevent duplicate initialization calls.\n */\n initialize(): Observable<boolean> {\n /**\n * 1. Already authenticated with full state\n */\n if (this.authState.isAuthenticated() && this.authState.user()) {\n this.initialized.set(true);\n return of(true);\n }\n\n /**\n * 2. Prevent infinite retry loops\n */\n if (this.initialized()) {\n return of(this.authState.isAuthenticated());\n }\n\n /**\n * 3. Reuse in-flight initialization\n */\n if (this.initializationCache$) {\n return this.initializationCache$;\n }\n\n this.loading.set(true);\n this.error.set(null);\n\n /**\n * 4. Start initialization\n * Timeout after 5 seconds to prevent app stability issues\n */\n this.initializationCache$ = this.authApi.refresh().pipe(\n timeout(5000),\n switchMap((refreshResponse) => {\n // Set access token from refresh\n this.authState.setAccessToken(refreshResponse.accessToken);\n // Fetch user profile\n return this.authApi.me().pipe(\n map((meResponse) => {\n const { user, company, branch } = meResponse;\n\n this.authState.setUser(user);\n\n if (this.appConfig.enableCompanyFeature) {\n this.authState.setCompany(company ?? null);\n this.authState.setBranch(branch ?? null);\n }\n\n return true;\n }),\n );\n }),\n\n tap(() => {\n this.initialized.set(true);\n this.loading.set(false);\n }),\n\n catchError((err) => {\n this.loading.set(false);\n // Always mark as initialized to prevent retry loops\n this.initialized.set(true);\n\n const errorMessage =\n err?.error?.message || err?.message || 'Authentication failed';\n\n const isCompanyError =\n errorMessage.includes('no company assigned') ||\n errorMessage.includes('Company with ID') ||\n errorMessage.includes('Please select a company') ||\n errorMessage.includes('Branch with ID');\n\n this.error.set(errorMessage);\n\n if (isCompanyError && this.appConfig.enableCompanyFeature) {\n // Keep token, force company selection\n this.authState.setUser(null);\n this.authState.setCompany(null);\n this.authState.setBranch(null);\n } else {\n // Full logout - but keep initialized=true to prevent retry\n this.authState.resetState();\n }\n\n return of(false);\n }),\n\n shareReplay({ bufferSize: 1, refCount: true }),\n\n finalize(() => {\n // IMPORTANT: allow re-initialization later\n this.initializationCache$ = null;\n }),\n );\n\n return this.initializationCache$;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, signal } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateBranchRequest, IUpdateBranchRequest, IBranch } from '../interfaces/branch.interface';\n\n/**\n * Branch API Service\n * Signal-based service for branch CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class BranchApiService extends ApiResourceService<\n ICreateBranchRequest | IUpdateBranchRequest,\n IBranch\n> {\n private readonly _currentCompanyId = signal<string | null>(null);\n\n constructor(http: HttpClient) {\n super('administration/branch', http);\n }\n\n setCurrentCompanyId(companyId: string | null): void {\n this._currentCompanyId.set(companyId);\n }\n\n fetchByCompany(companyId: string, search = ''): void {\n this.setCurrentCompanyId(companyId);\n this.fetchList(search, { filter: { companyId } });\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateCompanyRequest, IUpdateCompanyRequest, ICompany } from '../interfaces/company.interface';\n\n/**\n * Company API Service\n * Signal-based service for company CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class CompanyApiService extends ApiResourceService<\n ICreateCompanyRequest | IUpdateCompanyRequest,\n ICompany\n> {\n constructor(http: HttpClient) {\n super('administration/company', http);\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Token Refresh State Service\n * Manages token refresh state for SSR-safe request queuing.\n * Uses BehaviorSubject for RxJS interop (multi-subscriber async coordination).\n */\n@Injectable({ providedIn: 'root' })\nexport class TokenRefreshStateService {\n private readonly _isRefreshing = signal(false);\n readonly isRefreshing = this._isRefreshing.asReadonly();\n\n private readonly _refreshTokenSubject = new BehaviorSubject<string | null>(null);\n readonly refreshTokenSubject$ = this._refreshTokenSubject.asObservable();\n\n startRefresh(): void {\n this._isRefreshing.set(true);\n this._refreshTokenSubject.next(null);\n }\n\n completeRefresh(newToken: string): void {\n this._isRefreshing.set(false);\n this._refreshTokenSubject.next(newToken);\n }\n\n failRefresh(): void {\n this._isRefreshing.set(false);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { ICreateUserRequest, IUpdateUserRequest, IUser } from '../interfaces/user.interface';\n\n/**\n * User API Service\n * Signal-based service for user CRUD operations\n */\n@Injectable({ providedIn: 'root' })\nexport class UserApiService extends ApiResourceService<\n ICreateUserRequest | IUpdateUserRequest,\n IUser\n> {\n constructor(http: HttpClient) {\n super('administration/users', http);\n }\n\n updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>> {\n return this.http.post<ISingleResponse<IUser>>(`${this.baseUrl}/profile`, data);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { Observable } from 'rxjs';\nimport {\n IAssignUserBranchRequest,\n IAssignUserCompanyRequest,\n IBatchOperationResponse,\n IUserBranchesResponse,\n IUserCompaniesResponse,\n} from '../interfaces/user-permission.interface';\n\n/**\n * User Permission API Service\n * Handles user-company and user-branch permission assignments.\n */\n@Injectable({ providedIn: 'root' })\nexport class UserPermissionApiService {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly http = inject(HttpClient);\n private readonly baseUrl = this.appConfig.apiBaseUrl + '/administration/permissions';\n\n // Company Permissions\n assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(`${this.baseUrl}/user-company/assign`, data);\n }\n\n assignUserToCompany(userId: string, companyId: string): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: true }] });\n }\n\n revokeUserFromCompany(userId: string, companyId: string): Observable<IBatchOperationResponse> {\n return this.assignUserCompanies({ userId, items: [{ targetId: companyId, isAdd: false }] });\n }\n\n getUserCompanies(userId: string): Observable<IUserCompaniesResponse> {\n return this.http.post<IUserCompaniesResponse>(`${this.baseUrl}/get-user-company`, { userId });\n }\n\n // Branch Permissions\n assignUserBranches(data: IAssignUserBranchRequest): Observable<IBatchOperationResponse> {\n return this.http.post<IBatchOperationResponse>(`${this.baseUrl}/user-branch/assign`, data);\n }\n\n assignUserToBranch(userId: string, branchId: string): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: true }] });\n }\n\n revokeUserFromBranch(userId: string, branchId: string): Observable<IBatchOperationResponse> {\n return this.assignUserBranches({ userId, items: [{ targetId: branchId, isAdd: false }] });\n }\n\n getUserBranches(userId: string, companyId?: string): Observable<IUserBranchesResponse> {\n return this.http.post<IUserBranchesResponse>(`${this.baseUrl}/get-user-branch`, {\n userId,\n ...(companyId && { companyId }),\n });\n }\n}\n","/**\n * Authentication API Endpoints\n *\n * Centralized endpoint definitions to prevent inconsistencies across interceptors\n * and services. All auth-related endpoints should be referenced from here.\n */\nexport const AUTH_ENDPOINTS = {\n LOGIN: '/auth/login',\n LOGOUT: '/auth/logout',\n REFRESH: '/auth/refresh',\n REGISTER: '/auth/register',\n ME: '/auth/me',\n SELECT: '/auth/select',\n SWITCH_COMPANY: '/auth/switch-company',\n CHANGE_PASSWORD: '/auth/change-password',\n VERIFY_EMAIL: '/auth/verify-email',\n FORGOT_PASSWORD: '/auth/forgot-password',\n RESET_PASSWORD: '/auth/reset-password',\n RESEND_VERIFICATION: '/auth/resend-verification',\n} as const;\n\n/** Check if a URL matches a specific endpoint */\nexport function isEndpoint(url: string, endpoint: string): boolean {\n return url.includes(endpoint);\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router, UrlTree } from '@angular/router';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { AUTH_ENDPOINTS } from '../constants/auth-endpoints.const';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\n\nfunction isValidReturnUrl(url: unknown): url is string {\n if (typeof url !== 'string' || !url) return false;\n return url.startsWith('/') && !url.includes('://') && !url.startsWith('//');\n}\n\n/** Protects routes requiring authentication */\nexport const authGuard: CanActivateFn = (route, state) => {\n const authState = inject(AuthStateService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!authState.isAuthenticated()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], { queryParams: { returnUrl: state.url } });\n }\n\n if (appConfig.enableCompanyFeature) {\n if (authState.requiresCompanySelection() || !authState.company()) {\n return router.createUrlTree([AUTH_ENDPOINTS.LOGIN], { queryParams: { returnUrl: state.url } });\n }\n }\n\n return true;\n};\n\n/** Protects auth routes from authenticated users, restores session first */\nexport const guestGuard: CanActivateFn = (route): boolean | UrlTree | Observable<boolean | UrlTree> => {\n const authState = inject(AuthStateService);\n const authInit = inject(AuthInitService);\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n const checkAndRedirect = (): boolean | UrlTree => {\n if (authState.requiresCompanySelection()) return true;\n\n if (authState.isAuthenticated()) {\n if (appConfig.enableCompanyFeature && !authState.company()) return true;\n const returnUrl = route.queryParams['returnUrl'];\n return router.createUrlTree([isValidReturnUrl(returnUrl) ? returnUrl : '/']);\n }\n\n return true;\n };\n\n if (authInit.initialized()) return checkAndRedirect();\n\n return authInit.initialize().pipe(\n map(() => checkAndRedirect()),\n catchError(() => of(true)),\n );\n};\n\n/** Protects routes requiring company feature to be enabled */\nexport const companyFeatureGuard: CanActivateFn = () => {\n const router = inject(Router);\n const appConfig = inject(APP_CONFIG);\n\n if (!appConfig.enableCompanyFeature) return router.createUrlTree(['/']);\n return true;\n};\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { CookieService } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport { AUTH_ENDPOINTS, isEndpoint } from '../constants/auth-endpoints.const';\nimport { AuthStateService } from '../services/auth-state.service';\n\n/** Endpoints that need withCredentials for cookie handling */\nconst COOKIE_ENDPOINTS = [\n AUTH_ENDPOINTS.LOGIN,\n AUTH_ENDPOINTS.LOGOUT,\n AUTH_ENDPOINTS.REFRESH,\n AUTH_ENDPOINTS.REGISTER,\n AUTH_ENDPOINTS.SELECT,\n AUTH_ENDPOINTS.SWITCH_COMPANY,\n AUTH_ENDPOINTS.VERIFY_EMAIL,\n] as const;\n\n/**\n * Auth Interceptor - Adds auth headers and cookie credentials to requests\n */\nexport function authInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const authState = inject(AuthStateService);\n const cookieService = inject(CookieService);\n const appConfig = inject(APP_CONFIG);\n\n const headers: Record<string, string> = {};\n\n // Add tenant header if multi-tenant mode\n if (appConfig.multiTenant.enabled) {\n const tenantId = authState.tenantId();\n if (tenantId) {\n headers[appConfig.multiTenant.tenantHeader] = tenantId;\n }\n }\n\n // Add Bearer token if available\n const token = authState.accessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n // Check if this endpoint needs withCredentials for cookies\n const needsCredentials = COOKIE_ENDPOINTS.some((ep) => isEndpoint(req.url, ep));\n\n if (needsCredentials) {\n headers['cookie'] = cookieService.get();\n return next(req.clone({ withCredentials: true, setHeaders: headers }));\n }\n\n if (Object.keys(headers).length > 0) {\n return next(req.clone({ setHeaders: headers }));\n }\n\n return next(req);\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { MessageService } from 'primeng/api';\nimport { catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\nimport { AUTH_ENDPOINTS, isEndpoint } from '../constants/auth-endpoints.const';\nimport { AuthApiService } from '../services/auth-api.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { TokenRefreshStateService } from '../services/token-refresh-state.service';\n\n/** Token Refresh Interceptor - Proactive and reactive token refresh with request queuing */\nexport function tokenRefreshInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const authState = inject(AuthStateService);\n const authApi = inject(AuthApiService);\n const messageService = inject(MessageService);\n const platformId = inject(PLATFORM_ID);\n const isBrowser = isPlatformBrowser(platformId);\n const refreshState = inject(TokenRefreshStateService);\n\n // Skip refresh for these endpoints to prevent infinite loops\n const isRefreshRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REFRESH);\n const isLoginRequest = isEndpoint(req.url, AUTH_ENDPOINTS.LOGIN);\n const isSelectRequest = isEndpoint(req.url, AUTH_ENDPOINTS.SELECT);\n const isRegisterRequest = isEndpoint(req.url, AUTH_ENDPOINTS.REGISTER);\n\n // Don't intercept auth-related endpoints\n if (isRefreshRequest || isLoginRequest || isSelectRequest || isRegisterRequest) {\n return next(req);\n }\n\n // PROACTIVE REFRESH: Check if token is expired or expiring soon\n if (authState.isTokenExpired() && authState.tokenExpiresAt() !== null) {\n // Token is expired/expiring - refresh proactively before request\n return handleTokenRefresh(\n req,\n next,\n authState,\n authApi,\n messageService,\n isBrowser,\n refreshState,\n );\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 );\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): Observable<HttpEvent<unknown>> {\n if (refreshState.isRefreshing()) {\n return refreshState.refreshTokenSubject$.pipe(\n filter((token) => token !== null),\n take(1),\n switchMap((token) => next(req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }))),\n );\n }\n\n refreshState.startRefresh();\n\n return authApi.refresh().pipe(\n switchMap((response) => {\n const newToken = response.accessToken;\n authState.setAccessToken(newToken);\n refreshState.completeRefresh(newToken);\n return next(req.clone({ setHeaders: { Authorization: `Bearer ${newToken}` } }));\n }),\n catchError((refreshError) => {\n refreshState.failRefresh();\n return handleRefreshFailure(authState, messageService, isBrowser, refreshError);\n }),\n );\n}\n\nfunction handleRefreshFailure(\n authState: AuthStateService,\n messageService: MessageService,\n isBrowser: boolean,\n error: HttpErrorResponse,\n): Observable<never> {\n if (isBrowser) {\n messageService.add({ severity: 'error', summary: 'Session Expired', detail: 'Please log in again.' });\n }\n authState.resetState();\n authState.navigateToLogin();\n\n return throwError(() => error);\n}\n","import { Routes } from '@angular/router';\nimport {\n permissionGuard,\n USER_PERMISSIONS,\n COMPANY_PERMISSIONS,\n BRANCH_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n authGuard,\n companyFeatureGuard,\n guestGuard,\n} from '../guards/auth.guard';\n\n/**\n * Auth Routes Configuration\n * Public routes for authentication (login, register, etc.)\n *\n * Note: Company selection is now handled within the login page as a multi-step flow.\n */\nexport const AUTH_ROUTES: Routes = [\n {\n path: '',\n 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: [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: [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: [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 },\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 loadComponent: () =>\n import('../pages/administration/administration-page.component').then(\n (m) => m.AdministrationPageComponent,\n ),\n children: [\n // Users tab\n {\n path: 'users',\n canActivate: [permissionGuard(USER_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/users/user-list.component').then(\n (m) => m.UserListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/users/user-form.component').then(\n (m) => m.UserFormComponent,\n ),\n },\n ],\n },\n // Company tab (requires company feature)\n {\n path: 'company',\n canActivate: [companyFeatureGuard, permissionGuard(COMPANY_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/company/company-list.component').then(\n (m) => m.CompanyListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/company/company-form.component').then(\n (m) => m.CompanyFormComponent,\n ),\n },\n ],\n },\n // Branch tab (requires company feature)\n {\n path: 'branch',\n canActivate: [companyFeatureGuard, permissionGuard(BRANCH_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/branch/branch-list.component').then(\n (m) => m.BranchListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/branch/branch-form.component').then(\n (m) => m.BranchFormComponent,\n ),\n },\n ],\n },\n // Default redirect to users\n {\n path: '',\n redirectTo: 'users',\n pathMatch: 'full',\n },\n ],\n },\n];\n\n/**\n * Profile Routes Configuration\n * Protected route for user profile management\n */\nexport const PROFILE_ROUTES: Routes = [\n {\n path: '',\n canActivate: [authGuard],\n 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 ?? 'User',\n email: user.email,\n };\n }\n return null;\n });\n}\n\n// =============================================================================\n// Layout API Adapter\n// =============================================================================\n\n@Injectable({ providedIn: 'root' })\nexport class AuthLayoutApiAdapter implements ILayoutAuthApi {\n private readonly authApi = inject(AuthApiService);\n private readonly authState = inject(AuthStateService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly router = inject(Router);\n\n logOut(): Observable<any> {\n return this.authApi.logout().pipe(\n tap(() => {\n this.authState.resetState();\n }),\n );\n }\n\n navigateLogin(withUrl?: boolean): void {\n if (withUrl) {\n const currentUrl = this.router.url;\n this.authState.navigateToLogin(currentUrl);\n } else {\n this.authState.navigateToLogin();\n }\n }\n\n switchCompany(companyId: string, branchId: string): Observable<any> {\n return this.authApi.switchCompany({ companyId, branchId }).pipe(\n tap(() => {\n window.location.reload();\n }),\n );\n }\n\n getUserCompanies(): Observable<ICompanyInfo[]> {\n const userId = this.authState.user()?.id;\n if (!userId) {\n return of([]);\n }\n\n return this.permissionApi.getUserCompanies(userId).pipe(\n map((response) =>\n (response.data || []).map((permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n slug: permission.companySlug ?? '',\n imageId: '',\n })),\n ),\n );\n }\n\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]> {\n const userId = this.authState.user()?.id;\n if (!userId) {\n return of([]);\n }\n\n return this.permissionApi.getUserBranches(userId, companyId).pipe(\n map((response) =>\n (response.data || []).map((permission) => ({\n id: permission.branchId,\n name: permission.branchName,\n slug: permission.branchSlug ?? '',\n })),\n ),\n );\n }\n}\n","import { inject, Injectable, Signal } from '@angular/core';\nimport {\n IAuthStateProvider,\n ICompanyApiProvider,\n ICompanyBasicInfo,\n IListResponse,\n ISingleResponse,\n IUserBasicInfo,\n IUserPermissionProvider,\n IUserProvider,\n} from '@flusys/ng-shared';\nimport { map, Observable } from 'rxjs';\nimport { AuthInitService } from '../services/auth-init.service';\nimport { AuthStateService } from '../services/auth-state.service';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserApiService } from '../services/user-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\n/**\n * Auth Shared Provider Adapters\n *\n * Implements provider interfaces from ng-shared using ng-auth services.\n * Allows IAM, Storage, and Form-Builder packages to access auth data\n * without depending on ng-auth directly.\n *\n * @example\n * // In app.config.ts\n * import { provideAuthProviders } from '@flusys/ng-auth';\n * providers: [...provideAuthProviders()]\n */\n\n// =============================================================================\n// User Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthUserProviderAdapter implements IUserProvider {\n private readonly userApi = inject(UserApiService);\n\n getUsers(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n companyId?: string;\n branchId?: string;\n isActive?: boolean;\n [key: string]: any;\n }): Observable<IListResponse<IUserBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n filter: {\n ...(filter?.companyId && { companyId: filter.companyId }),\n ...(filter?.branchId && { branchId: filter.branchId }),\n ...(filter?.isActive !== undefined && { isActive: filter.isActive }),\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.userApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((user) => ({\n id: user.id,\n name: user.name ?? user.email,\n email: user.email,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n\n// =============================================================================\n// Company API Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {\n private readonly companyApi = inject(CompanyApiService);\n\n getCompanies(filter?: {\n page?: number;\n pageSize?: number;\n search?: string;\n }): Observable<IListResponse<ICompanyBasicInfo>> {\n const apiFilter = {\n pagination: {\n currentPage: filter?.page ?? 0,\n pageSize: filter?.pageSize ?? 50,\n },\n sort: { name: 'ASC' as const },\n };\n\n return this.companyApi.getAll(filter?.search ?? '', apiFilter).pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: (response.data ?? []).map((company) => ({\n id: company.id,\n name: company.name,\n slug: company.slug,\n })),\n meta: response.meta,\n })),\n );\n }\n}\n\n// =============================================================================\n// User Permission Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {\n private readonly userPermissionApi = inject(UserPermissionApiService);\n\n getUserBranchPermissions(\n userId: string,\n companyId?: string,\n ): Observable<ISingleResponse<any>> {\n return this.userPermissionApi.getUserBranches(\n userId,\n companyId,\n ) as Observable<ISingleResponse<any>>;\n }\n}\n\n// =============================================================================\n// Auth State Provider Adapter\n// =============================================================================\n\n@Injectable()\nexport class AuthStateProviderAdapter implements IAuthStateProvider {\n private readonly authState = inject(AuthStateService);\n private readonly authInit = inject(AuthInitService);\n\n get isAuthenticated(): Signal<boolean> {\n return this.authState.isAuthenticated;\n }\n\n initialize(): Observable<void> {\n return this.authInit.initialize().pipe(map(() => undefined));\n }\n}\n","import { Provider } from '@angular/core';\nimport { LAYOUT_AUTH_API, LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AuthLayoutApiAdapter, AuthLayoutStateAdapter } from '../adapters/auth-layout-providers.adapter';\n\n/** Provides auth integration for ng-layout */\nexport function provideAuthLayoutIntegration(): Provider[] {\n return [\n { provide: LAYOUT_AUTH_STATE, useClass: AuthLayoutStateAdapter },\n { provide: LAYOUT_AUTH_API, useClass: AuthLayoutApiAdapter },\n ];\n}\n","import { Provider } from '@angular/core';\nimport { AUTH_STATE_PROVIDER, COMPANY_API_PROVIDER, USER_PERMISSION_PROVIDER, USER_PROVIDER } from '@flusys/ng-shared';\nimport {\n AuthCompanyApiProviderAdapter,\n AuthStateProviderAdapter,\n AuthUserPermissionProviderAdapter,\n AuthUserProviderAdapter,\n} from '../adapters/auth-shared-providers.adapter';\n\n/** Provides auth implementations for ng-shared provider interfaces */\nexport function provideAuthProviders(): Provider[] {\n return [\n { provide: USER_PROVIDER, useClass: AuthUserProviderAdapter },\n { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter },\n { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter },\n { provide: AUTH_STATE_PROVIDER, useClass: AuthStateProviderAdapter },\n ];\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport {\n PermissionValidatorService,\n USER_PERMISSIONS,\n COMPANY_PERMISSIONS,\n BRANCH_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport { CommonModule } from '@angular/common';\n\ninterface ITab {\n id: string;\n label: 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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Administration</h1>\n <p class=\"text-muted-color mt-1\">{{ subtitle() }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div>\n <router-outlet />\n </div>\n </div>\n `,\n})\nexport class AdministrationPageComponent {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs */\n private readonly allTabs: ITab[] = [\n {\n id: 'users',\n label: 'Users',\n icon: 'pi pi-users',\n route: 'users',\n permission: USER_PERMISSIONS.READ,\n },\n {\n id: 'companies',\n label: 'Companies',\n icon: 'pi pi-building',\n route: 'company',\n permission: COMPANY_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n {\n id: 'branches',\n label: 'Branches',\n icon: 'pi pi-sitemap',\n route: 'branch',\n permission: BRANCH_PERMISSIONS.READ,\n requiresCompanyFeature: true,\n },\n ];\n\n /** Check if company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Visible tabs based on config and permissions */\n readonly visibleTabs = computed(() => {\n return this.allTabs.filter((tab) => {\n const hasCompanyFeature = !tab.requiresCompanyFeature || this.companyFeatureEnabled();\n const hasPermission = this.permissionValidator.hasPermission(tab.permission);\n return hasCompanyFeature && hasPermission;\n });\n });\n\n /** Dynamic subtitle based on visible tabs */\n readonly subtitle = computed(() => {\n const tabs = this.visibleTabs();\n if (tabs.length === 0) return 'No permissions available';\n return `Manage ${tabs.map((t) => t.label.toLowerCase()).join(', ')}`;\n });\n}\n","import { ChangeDetectionStrategy, 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 { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranch,\n ICreateBranchRequest,\n IUpdateBranchRequest,\n} from '../../interfaces/branch.interface';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Branch form model interface */\ninterface IBranchFormModel {\n companyId: string;\n name: string;\n slug: string;\n email: string;\n phone: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Branch Form Component\n * Handles creating and editing branches.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-form',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? 'Edit Branch' : 'New Branch' }}\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\">Company *</label>\n <select\n id=\"companyId\"\n class=\"p-select-native w-full\"\n [formField]=\"branchForm.companyId\">\n <option value=\"\">Select Company</option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"branchForm.name\"\n (blur)=\"generateSlug()\"\n placeholder=\"Branch name\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">Slug *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"branchForm.slug\"\n placeholder=\"branch-slug\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">Email</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"branchForm.email\"\n placeholder=\"branch@company.com\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"branchForm.phone\"\n placeholder=\"+1 234 567 8900\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"branchForm.isActive\" />\n <span>Active</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">Address</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"branchForm.address\"\n placeholder=\"123 Main St, City, Country\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n label=\"Cancel\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class BranchFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n\n // Route params as signals\n private readonly routeParams = toSignal(this.route.paramMap);\n private readonly queryParams = toSignal(this.route.queryParamMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing branch data when editing */\n readonly existingBranch = signal<IBranch | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingBranch());\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IBranchFormModel>({\n companyId: '',\n name: '',\n slug: '',\n email: '',\n phone: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly branchForm = form(this.formModel, (f) => {\n required(f.companyId, { message: 'Company is required' });\n required(f.name, { message: 'Name is required' });\n required(f.slug, { message: 'Slug is required' });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return (\n model.companyId.trim().length > 0 &&\n model.name.trim().length > 0 &&\n model.slug.trim().length > 0\n );\n });\n\n constructor() {\n // Load companies on initialization\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n const query = this.queryParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadBranch(id);\n } else {\n // Set company from query params or current company\n const queryCompanyId = query?.get('companyId');\n const currentCompanyId = this.authState.company()?.id;\n const companyId = queryCompanyId || currentCompanyId;\n\n if (companyId) {\n this.formModel.update((m) => ({ ...m, companyId }));\n }\n }\n });\n }\n\n async loadBranch(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.branchService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingBranch.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n } catch {\n this.router.navigate(['/administration/branch']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private toFormModel(branch: IBranch): IBranchFormModel {\n return {\n companyId: branch.companyId,\n name: branch.name,\n slug: branch.slug,\n email: branch.email || '',\n phone: branch.phone || '',\n address: branch.address || '',\n isActive: branch.isActive,\n };\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all 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 await this.branchService.updateAsync(updateData);\n this.onSaveSuccess('Branch updated successfully.');\n }\n\n private async createBranch(): Promise<void> {\n const model = this.formModel();\n const createData: ICreateBranchRequest = {\n companyId: model.companyId,\n name: model.name,\n slug: model.slug,\n ...this.buildOptionalFields(model),\n };\n await this.branchService.insertAsync(createData);\n this.onSaveSuccess('Branch created successfully.');\n }\n\n private buildOptionalFields(model: IBranchFormModel) {\n return {\n email: model.email || undefined,\n phone: model.phone || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({ severity: 'success', summary: 'Success', detail: message });\n }\n\n private getTargetCompanyId(): string | null {\n return this.existingBranch()?.companyId || this.formModel().companyId || null;\n }\n\n private navigateToList(): void {\n const companyId = this.getTargetCompanyId();\n this.router.navigate(['/administration/branch'], {\n queryParams: companyId ? { companyId } : {},\n });\n }\n\n onCancel(): void {\n this.navigateToList();\n }\n}\n","import { ChangeDetectionStrategy, Component, effect, inject, signal, untracked } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, BRANCH_PERMISSIONS, HasPermissionDirective, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { IBranch } from '../../interfaces/branch.interface';\nimport { BranchApiService } from '../../services/branch-api.service';\nimport { CompanyApiService } from '../../services/company-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/**\n * Branch List Component\n * Displays a list of branches for a company with CRUD operations.\n * Defaults to current company context.\n */\n@Component({\n selector: 'lib-branch-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <div class=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4 w-full sm:w-auto\">\n <h2 class=\"text-xl font-semibold m-0\">Branches</h2>\n @if (companies().length > 1) {\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"selectedCompanyId.set($event); onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Company\"\n styleClass=\"w-full sm:w-64\" />\n }\n </div>\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.CREATE\"\n label=\"Add Branch\"\n icon=\"pi pi-plus\"\n [disabled]=\"!selectedCompanyId()\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"branches()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Status</th>\n <th class=\"w-[120px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-branch>\n <tr>\n <td>{{ branch.name }}</td>\n <td>{{ branch.slug }}</td>\n <td>{{ branch.email || '-' }}</td>\n <td>{{ branch.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"branch.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"branch.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n pTooltip=\"Edit\"\n (onClick)=\"onEdit(branch)\" />\n @if (!branch.readOnly) {\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n pTooltip=\"Delete\"\n (onClick)=\"onDelete(branch)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n @if (!selectedCompanyId()) {\n Please select a company to view branches.\n } @else {\n No branches found. Click \"Add Branch\" to create one.\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class BranchListComponent {\n // Permission constants for template\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly branchService = inject(BranchApiService);\n private readonly companyService = inject(CompanyApiService);\n private readonly authState = inject(AuthStateService);\n\n private readonly queryParamMap = toSignal(this.route.queryParamMap);\n private initialized = false;\n\n /** Selected company ID (signal for zoneless change detection) */\n readonly selectedCompanyId = signal<string | null>(null);\n\n /** Companies list for dropdown */\n readonly companies = this.companyService.data;\n\n /** Branches from service */\n readonly branches = this.branchService.data;\n\n /** Loading state from service */\n readonly isLoading = this.branchService.isLoading;\n\n /** Total count from service */\n readonly total = this.branchService.total;\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (this.initialized) return;\n\n this.initialized = true;\n\n // Use untracked to avoid nested effect error when initializing resources\n untracked(() => {\n // Load companies for dropdown\n this.companyService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n });\n\n // Check for company ID from query params or use current company\n // p-table's onLazyLoad will handle the initial data fetch\n const queryCompanyId = params?.get('companyId') || null;\n const currentCompanyId = this.authState.company()?.id;\n\n this.selectedCompanyId.set(queryCompanyId || currentCompanyId || null);\n });\n });\n }\n\n loadBranches(): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n this.branchService.fetchByCompany(companyId, '');\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId()) {\n this.loadBranches();\n }\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const companyId = this.selectedCompanyId();\n if (!companyId) return;\n\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n\n // Use fetchByCompany to maintain company context\n this.branchService.setCurrentCompanyId(companyId);\n this.branchService.fetchList('', {\n filter: { companyId },\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/branch/new'], {\n queryParams: { companyId: this.selectedCompanyId() },\n });\n }\n\n onEdit(branch: IBranch): void {\n this.router.navigate(['/administration/branch', branch.id]);\n }\n\n onDelete(branch: IBranch): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${branch.name}\"?`,\n header: 'Delete Branch',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.branchService.deleteAsync({ id: branch.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Branch deleted successfully.',\n });\n this.branchService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, 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 { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n ICompany,\n ICreateCompanyRequest,\n IUpdateCompanyRequest,\n} from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/** Company form model interface */\ninterface ICompanyFormModel {\n name: string;\n slug: string;\n email: string;\n phone: string;\n website: string;\n address: string;\n isActive: boolean;\n}\n\n/**\n * Company Form Component\n * Handles creating and editing companies.\n */\n@Component({\n selector: 'lib-company-form',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? 'Edit Company' : 'New Company' }}\n </h2>\n </div>\n </ng-template>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"companyForm.name\"\n (blur)=\"generateSlug()\"\n placeholder=\"Company name\"\n />\n </div>\n\n <!-- Slug -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"slug\" class=\"font-medium\">Slug *</label>\n <input\n pInputText\n id=\"slug\"\n [formField]=\"companyForm.slug\"\n placeholder=\"company-slug\"\n />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">Email</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"companyForm.email\"\n placeholder=\"contact@company.com\"\n />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"companyForm.phone\"\n placeholder=\"+1 234 567 8900\"\n />\n </div>\n\n <!-- Website -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"website\" class=\"font-medium\">Website</label>\n <input\n pInputText\n id=\"website\"\n [formField]=\"companyForm.website\"\n placeholder=\"https://company.com\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-center pt-6\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"companyForm.isActive\" />\n <span>Active</span>\n </label>\n </div>\n\n <!-- Address -->\n <div class=\"flex flex-col gap-2 md:col-span-2\">\n <label for=\"address\" class=\"font-medium\">Address</label>\n <textarea\n id=\"address\"\n class=\"p-inputtextarea p-inputtext p-component\"\n [formField]=\"companyForm.address\"\n placeholder=\"123 Main St, City, Country\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n label=\"Cancel\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class CompanyFormComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly companyService = inject(CompanyApiService);\n\n // Route params as signal\n private readonly routeParams = toSignal(this.route.paramMap);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing company data when editing */\n readonly existingCompany = signal<ICompany | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingCompany());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<ICompanyFormModel>({\n name: '',\n slug: '',\n email: '',\n phone: '',\n website: '',\n address: '',\n isActive: true,\n });\n\n /** Form with validation schema */\n readonly companyForm = form(this.formModel, (f) => {\n required(f.name, { message: 'Name is required' });\n required(f.slug, { message: 'Slug is required' });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0 && model.slug.trim().length > 0;\n });\n\n constructor() {\n // Effect to handle route-based initialization\n effect(() => {\n const params = this.routeParams();\n if (!params) return;\n\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadCompany(id);\n }\n });\n }\n\n private async loadCompany(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.companyService.findByIdAsync(id);\n if (response.success && response.data) {\n this.existingCompany.set(response.data);\n this.formModel.set({\n name: response.data.name,\n slug: response.data.slug,\n email: response.data.email || '',\n phone: response.data.phone || '',\n website: response.data.website || '',\n address: response.data.address || '',\n isActive: response.data.isActive,\n });\n }\n } catch {\n // Error toast handled by global interceptor\n this.router.navigate(['/administration/company']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n generateSlug(): void {\n const model = this.formModel();\n if (!model.slug && model.name) {\n const slug = model.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n this.formModel.update((m) => ({ ...m, slug }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all required fields.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const isEdit = this.isEditMode() && this.existingCompany();\n\n if (isEdit) {\n const updateData: IUpdateCompanyRequest = {\n id: this.existingCompany()!.id,\n ...this.buildCompanyData(),\n };\n await this.companyService.updateAsync(updateData);\n } else {\n await this.companyService.insertAsync(this.buildCompanyData());\n }\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Company ${isEdit ? 'updated' : 'created'} successfully.`,\n });\n this.router.navigate(['/administration/company']);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/company']);\n }\n\n /** Build company data from form model */\n private buildCompanyData(): ICreateCompanyRequest {\n const model = this.formModel();\n return {\n name: model.name,\n slug: model.slug,\n email: model.email || undefined,\n phone: model.phone || undefined,\n website: model.website || undefined,\n address: model.address || undefined,\n isActive: model.isActive,\n };\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AngularModule, BRANCH_PERMISSIONS, COMPANY_PERMISSIONS, HasPermissionDirective, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { ICompany } from '../../interfaces/company.interface';\nimport { CompanyApiService } from '../../services/company-api.service';\n\n/**\n * Company List Component\n * Displays a list of companies with CRUD operations.\n * Only visible when company feature is enabled.\n */\n@Component({\n selector: 'lib-company-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, TagModule, HasPermissionDirective],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">Companies</h2>\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.CREATE\"\n label=\"Add Company\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"companies()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Status</th>\n <th class=\"w-[150px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-company>\n <tr>\n <td>{{ company.name }}</td>\n <td>{{ company.slug }}</td>\n <td>{{ company.email || '-' }}</td>\n <td>{{ company.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"company.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"company.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n pTooltip=\"Edit\"\n (onClick)=\"onEdit(company)\" />\n <p-button\n *hasPermission=\"BRANCH_PERMISSIONS.READ\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n pTooltip=\"View Branches\"\n (onClick)=\"onViewBranches(company)\" />\n @if (!company.readOnly) {\n <p-button\n *hasPermission=\"COMPANY_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n pTooltip=\"Delete\"\n (onClick)=\"onDelete(company)\" />\n }\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-8\">\n No companies found. Click \"Add Company\" to create one.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n `,\n})\nexport class CompanyListComponent {\n // Permission constants for template\n readonly COMPANY_PERMISSIONS = COMPANY_PERMISSIONS;\n readonly BRANCH_PERMISSIONS = BRANCH_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly companyService = inject(CompanyApiService);\n\n /** Companies from service */\n readonly companies = this.companyService.data;\n\n /** Loading state from service */\n readonly isLoading = this.companyService.isLoading;\n\n /** Total count from service */\n readonly total = this.companyService.total;\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n this.companyService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/company/new']);\n }\n\n onEdit(company: ICompany): void {\n this.router.navigate(['/administration/company', company.id]);\n }\n\n onViewBranches(company: ICompany): void {\n this.router.navigate(['/administration/branch'], {\n queryParams: { companyId: company.id },\n });\n }\n\n onDelete(company: ICompany): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${company.name}\"?`,\n header: 'Delete Company',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.companyService.deleteAsync({ id: company.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Company deleted successfully.',\n });\n this.companyService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required, email as emailValidator } from '@angular/forms/signals';\nimport { finalize, tap } from 'rxjs';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IForgotPasswordFormModel {\n email: string;\n}\n\n@Component({\n selector: 'lib-forgot-password-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @if (!emailSent()) {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Forgot Password\n </div>\n <span class=\"text-muted-color font-medium\">\n Enter your email address and we'll send you a link to reset your password.\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n Email\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n placeholder=\"Enter your email address\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"forgotForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n label=\"Send Reset Link\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <span class=\"font-medium\">Remember your password?</span>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Sign In\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Check Your Email\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n We've sent a password reset link to <strong>{{ submittedEmail() }}</strong>.\n Please check your inbox and follow the instructions.\n </p>\n <p class=\"text-sm text-muted-color mb-6\">\n Didn't receive the email? Check your spam folder or\n <span\n class=\"text-primary cursor-pointer font-semibold\"\n (click)=\"resetForm()\">\n try again\n </span>.\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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\n readonly isLoading = signal(false);\n readonly emailSent = signal(false);\n readonly submittedEmail = signal('');\n readonly formModel = signal<IForgotPasswordFormModel>({ email: '' });\n readonly forgotForm = form(this.formModel, (f) => {\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\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: 'Validation Error',\n detail: 'Please enter a valid email address.',\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.formModel().email;\n\n // Always show success (security: don't reveal if email exists)\n this.authApi\n .forgotPassword(email)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n tap({ next: () => this.showEmailSent(email), error: () => this.showEmailSent(email) }),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe();\n }\n\n private showEmailSent(email: string): void {\n this.submittedEmail.set(email);\n this.emailSent.set(true);\n }\n\n resetForm(): void {\n this.emailSent.set(false);\n this.submittedEmail.set('');\n this.formModel.set({ email: '' });\n }\n}\n","import {\n ChangeDetectionStrategy,\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 form,\n FormField,\n required,\n email as emailValidator,\n minLength,\n} from '@angular/forms/signals';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport {\n IBranchSelectionInfo,\n ICompanyWithBranches,\n ILoginRequest,\n isCompanySelectionResponse,\n isEmailVerificationRequired,\n ISelectRequest,\n} from '../../interfaces/auth.interface';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\ninterface ILoginFormModel {\n email: string;\n password: string;\n rememberMe: boolean;\n}\n\ninterface ISelectionFormModel {\n companyId: string;\n branchId: string;\n rememberSelection: boolean;\n}\n\ntype LoginStep = 'credentials' | 'company-selection' | 'email-verification';\n\n@Component({\n selector: 'lib-login-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n <!-- 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]=\"currentStep() === 'credentials'\"\n [class.bg-surface-200]=\"currentStep() !== 'credentials'\"\n [class.text-muted-color]=\"currentStep() !== 'credentials'\">\n 1\n </div>\n <div class=\"w-12 h-0.5 bg-surface-200\"></div>\n <div\n class=\"flex items-center justify-center w-8 h-8 rounded-full text-sm font-semibold transition-colors\"\n [class.bg-primary]=\"currentStep() === 'company-selection'\"\n [class.text-primary-contrast]=\"currentStep() === 'company-selection'\"\n [class.bg-surface-200]=\"currentStep() !== 'company-selection'\"\n [class.text-muted-color]=\"currentStep() !== 'company-selection'\">\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 Welcome!\n </div>\n <span class=\"text-muted-color font-medium\">Sign in to continue</span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n Email\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n placeholder=\"Email address\"\n class=\"w-full md:w-[25rem] mb-4\"\n [formField]=\"loginForm.email\"\n autocomplete=\"email\" />\n\n <label for=\"password\" class=\"block font-medium text-lg mb-2 text-color\">\n Password\n </label>\n <div class=\"mb-4\">\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n placeholder=\"Password\"\n class=\"w-full md:w-[25rem]\"\n [formField]=\"loginForm.password\"\n autocomplete=\"current-password\" />\n </div>\n\n <div class=\"flex flex-col sm:flex-row items-start sm:items-center justify-between mt-2 mb-8 gap-4\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"loginForm.rememberMe\" />\n <span>Remember me</span>\n </label>\n <span\n class=\"font-medium no-underline ml-2 text-right cursor-pointer text-primary\"\n routerLink=\"/auth/forgot-password\">\n Forgot password?\n </span>\n </div>\n\n <p-button\n label=\"Sign In\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isLoginFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">Don't have an account?</span>\n <a routerLink=\"/auth/register\" class=\"font-semibold text-primary cursor-pointer\">\n Sign Up\n </a>\n </div>\n </form>\n }\n\n <!-- Email Verification Required -->\n @if (currentStep() === 'email-verification') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-6xl text-warn\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Email Not Verified\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n Please verify your email address <strong>{{ unverifiedEmail() }}</strong> before logging in.\n </p>\n <p-button\n label=\"Resend Verification Email\"\n styleClass=\"w-full mb-4\"\n [loading]=\"isLoading()\"\n (onClick)=\"onResendVerification()\" />\n <div class=\"mt-4\">\n <span\n class=\"font-semibold text-primary cursor-pointer\"\n (click)=\"goBackToCredentials()\">\n Back to Sign In\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 Select Company\n </div>\n <div class=\"text-muted-color font-medium\">\n Welcome, {{ userName() }}! Please select your company and branch.\n </div>\n </div>\n\n <form (ngSubmit)=\"onSelectCompany()\">\n <label for=\"company\" class=\"block text-lg font-medium mb-2 text-color\">\n Company\n </label>\n <select\n id=\"company\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.companyId\"\n (change)=\"onCompanyChange()\">\n <option value=\"\">Select Company</option>\n @for (company of companies(); track company.id) {\n <option [value]=\"company.id\">{{ company.name }}</option>\n }\n </select>\n\n <label for=\"branch\" class=\"block text-lg font-medium mb-2 text-color\">\n Branch\n </label>\n <select\n id=\"branch\"\n class=\"p-select-native w-full md:w-[25rem] mb-4\"\n [formField]=\"selectionForm.branchId\">\n <option value=\"\">Select Branch</option>\n @for (branch of branches(); track branch.id) {\n <option [value]=\"branch.id\">{{ branch.name }}</option>\n }\n </select>\n\n <div class=\"flex items-center mt-2 mb-8\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"selectionForm.rememberSelection\" />\n <span>Remember this selection</span>\n </label>\n </div>\n\n <div class=\"flex flex-col sm:flex-row gap-4\">\n <p-button\n label=\"Back\"\n styleClass=\"w-full\"\n severity=\"secondary\"\n [outlined]=\"true\"\n type=\"button\"\n (onClick)=\"goBackToCredentials()\" />\n <p-button\n label=\"Continue\"\n styleClass=\"w-full\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isSelectionFormValid() || isLoading()\" />\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\n readonly returnUrl = input<string>('');\n readonly currentStep = signal<LoginStep>('credentials');\n readonly isLoading = signal(false);\n readonly unverifiedEmail = signal('');\n\n readonly loginFormModel = signal<ILoginFormModel>({\n email: '',\n password: '',\n rememberMe: true,\n });\n\n readonly loginForm = form(this.loginFormModel, (f) => {\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\n required(f.password, { message: 'Password is required' });\n minLength(f.password, 8, { message: 'Password must be at least 8 characters' });\n });\n\n readonly isLoginFormValid = computed(() => this.loginForm().valid());\n\n readonly selectionFormModel = signal<ISelectionFormModel>({\n companyId: '',\n branchId: '',\n rememberSelection: true,\n });\n\n readonly selectionForm = form(this.selectionFormModel, (f) => {\n required(f.companyId, { message: 'Please select a company' });\n required(f.branchId, { message: 'Please select a branch' });\n });\n\n readonly isSelectionFormValid = computed(() => this.selectionForm().valid());\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(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: 'Validation Error',\n detail: 'Please fill in all required fields correctly.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.loginFormModel();\n const loginData: ILoginRequest = {\n email: formData.email,\n password: formData.password,\n };\n\n this.authApi\n .login(loginData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (isEmailVerificationRequired(response)) {\n this.unverifiedEmail.set(response.email);\n this.currentStep.set('email-verification');\n return;\n }\n\n if (isCompanySelectionResponse(response)) {\n this.sessionId = response.sessionId;\n this.companies.set(response.companies);\n this.userName.set(response.user.name ?? response.user.email);\n this.authState.setSelectionState(response);\n this.currentStep.set('company-selection');\n this.autoSelectIfSingle();\n } else {\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Login successful!',\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n const message = error?.error?.message || 'Login failed. Please try again.';\n this.messageService.add({\n severity: 'error',\n summary: 'Login Failed',\n detail: message,\n });\n },\n });\n }\n\n onCompanyChange(): void {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: '',\n }));\n\n const branches = this.branches();\n if (branches.length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: branches[0].id,\n }));\n }\n }\n\n onSelectCompany(): void {\n if (!this.isSelectionFormValid()) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Selection Required',\n detail: 'Please select both company and branch.',\n });\n return;\n }\n\n if (!this.sessionId) {\n this.messageService.add({\n severity: 'error',\n summary: 'Session Expired',\n detail: 'Your session has expired. Please login again.',\n });\n this.goBackToCredentials();\n return;\n }\n\n this.isLoading.set(true);\n\n const formData = this.selectionFormModel();\n const selectData: ISelectRequest = {\n sessionId: this.sessionId,\n companyId: formData.companyId!,\n branchId: formData.branchId!,\n };\n\n this.authApi\n .select(selectData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.authState.setLoginState(response);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Login successful!',\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: 'Email Sent',\n detail: response.message || 'Verification email has been sent.',\n });\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n\n private autoSelectIfSingle(): void {\n if (this.companies().length === 1) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: this.companies()[0].id,\n }));\n this.onCompanyChange();\n }\n\n const storedCompanyId = this.authState.getStoredCompanyId();\n const storedBranchId = this.authState.getStoredBranchId();\n\n if (storedCompanyId) {\n const company = this.companies().find((c) => c.id === storedCompanyId);\n if (company) {\n this.selectionFormModel.update((model) => ({\n ...model,\n companyId: storedCompanyId,\n }));\n if (storedBranchId) {\n const branch = company.branches.find((b) => b.id === storedBranchId);\n if (branch) {\n this.selectionFormModel.update((model) => ({\n ...model,\n branchId: storedBranchId,\n }));\n }\n }\n }\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport {\n APP_CONFIG,\n getPermissionMode,\n isCompanyFeatureEnabled,\n isFeatureEnabled,\n} from '@flusys/ng-core';\nimport {\n AngularModule,\n FileUploaderComponent,\n FileUrlService,\n IProfileActionInfo,\n IProfileRoleInfo,\n IProfileUploadResult,\n PrimeModule,\n PROFILE_PERMISSION_PROVIDER,\n PROFILE_UPLOAD_PROVIDER,\n UploadFileFn,\n} from '@flusys/ng-shared';\nimport { finalize, map } from 'rxjs';\nimport { MessageService } from 'primeng/api';\nimport { IUpdateUserRequest } from '../../interfaces/user.interface';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\nimport { UserApiService } from '../../services/user-api.service';\n\n/** Profile form model */\ninterface IProfileFormModel {\n name: string;\n phone: string;\n}\n\n/** Password form model */\ninterface IPasswordFormModel {\n currentPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n/**\n * Profile Page Component\n *\n * Allows users to view and update their profile information.\n * Features:\n * - Update name, phone, profile picture (if storage enabled)\n * - View company/branch info (read-only, if company feature enabled)\n * - View roles/actions (read-only, if IAM enabled via optional injection)\n *\n * Package Independence:\n * - Uses PROFILE_UPLOAD_PROVIDER (optional) for storage functionality\n * - Uses PROFILE_PERMISSION_PROVIDER (optional) for IAM functionality\n * - No direct imports from ng-storage or ng-iam\n */\n@Component({\n selector: 'lib-profile-page',\n imports: [AngularModule, PrimeModule, FormField, FileUploaderComponent],\n template: `\n <!-- Page Header -->\n <div class=\"mb-4 md:mb-6\">\n <h1 class=\"text-2xl font-bold text-color mb-2\">My Profile</h1>\n <p class=\"text-muted-color\">Manage your account settings and preferences.</p>\n </div>\n\n <!-- Profile Form Card (full width) -->\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex flex-col md:flex-row gap-4 md:gap-6\">\n <!-- Avatar Section -->\n <div class=\"flex flex-col items-center gap-4 md:w-72 lg:w-80 md:border-r md:border-surface-200 md:pr-6\">\n @if (profilePictureUrl()) {\n <p-avatar\n [image]=\"profilePictureUrl()!\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28\" />\n } @else {\n <p-avatar\n [label]=\"userInitials()\"\n size=\"xlarge\"\n shape=\"circle\"\n styleClass=\"w-28 h-28 text-3xl bg-primary text-primary-contrast\" />\n }\n <div class=\"text-center\">\n <div class=\"font-semibold text-color\">{{ userName() }}</div>\n <div class=\"text-muted-color text-sm\">{{ userEmail() }}</div>\n </div>\n <!-- Upload section - only show if storage is enabled and provider is available -->\n @if (showUploadSection()) {\n <lib-file-uploader\n [uploadFile]=\"uploadFileFn\"\n [acceptTypes]=\"['image/*']\"\n [multiple]=\"false\"\n [maxSizeMb]=\"5\"\n [showPreview]=\"false\"\n (fileUploaded)=\"onProfilePictureUploaded($event)\"\n class=\"w-full\" />\n } @else {\n <div class=\"w-full p-3 bg-surface-100 rounded-lg text-center\">\n <i class=\"pi pi-info-circle text-muted-color mr-2\"></i>\n <span class=\"text-sm text-muted-color\">Storage feature not enabled</span>\n </div>\n }\n </div>\n\n <!-- Form Section -->\n <div class=\"flex-1\">\n <form (ngSubmit)=\"onSubmit()\" class=\"flex flex-col gap-4\">\n <!-- Email (read-only) -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"font-medium text-color\">Email</label>\n <input\n pInputText\n [value]=\"userEmail()\"\n disabled\n class=\"bg-surface-50\" />\n </div>\n\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium text-color\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n placeholder=\"Your full name\" />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium text-color\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n placeholder=\"+1 234 567 8900\" />\n </div>\n\n <!-- Submit -->\n <div class=\"flex justify-end pt-4\">\n <p-button\n label=\"Save Changes\"\n icon=\"pi pi-check\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || !isFormDirty() || isLoading()\" />\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <!-- Security Card -->\n <div class=\"card mb-2 md:mb-4\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-lock text-primary\"></i>\n <span class=\"font-semibold text-color\">Security</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 <!-- Current Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"currentPassword\" class=\"font-medium text-color\">Current Password *</label>\n <p-password\n id=\"currentPassword\"\n name=\"currentPassword\"\n [ngModel]=\"passwordModel().currentPassword\"\n (ngModelChange)=\"updatePasswordField('currentPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n placeholder=\"Enter current password\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <!-- New Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"newPassword\" class=\"font-medium text-color\">New Password *</label>\n <p-password\n id=\"newPassword\"\n name=\"newPassword\"\n [ngModel]=\"passwordModel().newPassword\"\n (ngModelChange)=\"updatePasswordField('newPassword', $event)\"\n [feedback]=\"true\"\n [toggleMask]=\"true\"\n placeholder=\"Min 6 characters\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n </div>\n\n <!-- Confirm Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"confirmPassword\" class=\"font-medium text-color\">Confirm Password *</label>\n <p-password\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n [ngModel]=\"passwordModel().confirmPassword\"\n (ngModelChange)=\"updatePasswordField('confirmPassword', $event)\"\n [feedback]=\"false\"\n [toggleMask]=\"true\"\n placeholder=\"Confirm new password\"\n styleClass=\"w-full\"\n inputStyleClass=\"w-full\" />\n @if (!passwordsMatch()) {\n <small class=\"text-danger\">Passwords do not match</small>\n }\n </div>\n </div>\n\n <!-- Submit -->\n <div class=\"flex justify-end\">\n <p-button\n label=\"Change Password\"\n icon=\"pi pi-key\"\n type=\"submit\"\n [loading]=\"isPasswordLoading()\"\n [disabled]=\"!isPasswordFormValid() || isPasswordLoading()\" />\n </div>\n </form>\n </div>\n\n <!-- Company & Permissions Row (50/50 on desktop, stacked on mobile) -->\n @if (showBottomRow()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-4 flex-1\">\n <!-- Company/Branch Info -->\n @if (showCompanySection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center gap-2 mb-4\">\n <i class=\"pi pi-building text-primary\"></i>\n <span class=\"font-semibold text-color\">Company & Branch</span>\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-briefcase text-primary\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">Company</div>\n <div class=\"font-medium text-color\">{{ companyName() || 'Not assigned' }}</div>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 rounded-lg bg-success/10 flex items-center justify-center flex-shrink-0\">\n <i class=\"pi pi-map-marker text-success\"></i>\n </div>\n <div>\n <div class=\"text-sm text-muted-color\">Branch</div>\n <div class=\"font-medium text-color\">{{ branchName() || 'Not assigned' }}</div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Permissions -->\n @if (showPermissionsSection()) {\n <div class=\"card h-48 md:h-56 flex flex-col\">\n <div class=\"flex items-center justify-between mb-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-shield text-primary\"></i>\n <span class=\"font-semibold text-color\">My Permissions</span>\n </div>\n <p-tag value=\"Read-only\" severity=\"secondary\" />\n </div>\n <div class=\"flex flex-col gap-4 flex-1 overflow-auto\">\n <!-- Roles -->\n @if (showRoles()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-users\"></i> Roles\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userRoles().length === 0) {\n <span class=\"text-muted-color text-sm\">No roles assigned</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (role of userRoles(); track role.id) {\n <p-tag [value]=\"role.name\" severity=\"info\" />\n }\n </div>\n }\n </div>\n }\n\n <!-- Actions -->\n @if (showActions()) {\n <div>\n <div class=\"text-sm text-muted-color mb-2 flex items-center gap-2\">\n <i class=\"pi pi-bolt\"></i> Direct Actions\n </div>\n @if (isLoadingPermissions()) {\n <p-skeleton height=\"1.5rem\" styleClass=\"mb-2\" />\n } @else if (userActions().length === 0) {\n <span class=\"text-muted-color text-sm\">No actions assigned</span>\n } @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (action of userActions(); track action.id) {\n <p-tag [value]=\"action.name\" severity=\"success\" />\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\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\n // Optional injection - null if storage not configured\n private readonly uploadProvider = inject(PROFILE_UPLOAD_PROVIDER, {\n optional: true,\n });\n\n // Optional injection - null if IAM not configured\n private readonly permissionProvider = inject(PROFILE_PERMISSION_PROVIDER, {\n optional: true,\n });\n\n // State\n readonly isLoading = signal(false);\n readonly isLoadingPermissions = signal(false);\n private readonly _profilePictureUrl = signal<string | null>(null);\n readonly profilePictureUrl = this._profilePictureUrl.asReadonly();\n\n // Permission data\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 // Computed from auth state\n readonly userEmail = computed(() => this.authState.user()?.email ?? '');\n readonly userName = computed(() => this.authState.user()?.name ?? 'User');\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 // Feature flags - Storage feature check\n readonly showUploadSection = computed(\n () =>\n isFeatureEnabled(this.appConfig, 'storage') &&\n this.uploadProvider !== null,\n );\n\n readonly showCompanySection = computed(() =>\n isCompanyFeatureEnabled(this.appConfig),\n );\n\n readonly showPermissionsSection = computed(\n () =>\n isFeatureEnabled(this.appConfig, 'iam') &&\n this.permissionProvider !== null,\n );\n\n readonly permissionMode = computed(() => getPermissionMode(this.appConfig));\n\n readonly showRoles = computed(() => {\n const mode = this.permissionMode();\n return mode === 'rbac' || mode === 'full';\n });\n\n readonly showActions = computed(() => {\n const mode = this.permissionMode();\n return mode === 'direct' || mode === 'full';\n });\n\n // Show bottom row only if at least one section is visible\n readonly showBottomRow = computed(\n () => this.showCompanySection() || this.showPermissionsSection(),\n );\n\n // Form\n private readonly originalFormModel = signal<IProfileFormModel>({\n name: '',\n phone: '',\n });\n readonly formModel = signal<IProfileFormModel>({\n name: '',\n phone: '',\n });\n\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: 'Name is required' });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n readonly isFormDirty = computed(() => {\n const current = this.formModel();\n const original = this.originalFormModel();\n return current.name !== original.name || current.phone !== original.phone;\n });\n\n // Password form\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 model.confirmPassword.length === 0 || model.newPassword === model.confirmPassword;\n });\n\n // Upload function for FileUploader - uses provider if available\n readonly uploadFileFn: UploadFileFn = (file, options) => {\n if (!this.uploadProvider) {\n throw new Error('Upload provider not available');\n }\n return this.uploadProvider\n .uploadProfilePicture(file, {\n folderPath: options?.folderPath ?? 'profile-pictures',\n compress: options?.compress ?? true,\n maxWidth: options?.maxWidth ?? 400,\n maxHeight: options?.maxHeight ?? 400,\n })\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: response.data\n ? this.mapUploadResultToUploadedFile(response.data)\n : undefined,\n }))\n );\n };\n\n /** Map upload result to IUploadedFile format */\n private mapUploadResultToUploadedFile(result: IProfileUploadResult) {\n return {\n id: result.id, // UUID for storing in profilePictureId\n name: result.name,\n key: result.key,\n size: result.size,\n contentType: result.contentType,\n };\n }\n\n constructor() {\n // Initialize user data on construction\n this.loadUserData();\n\n // Effect for permissions loading when section is visible\n effect(() => {\n if (this.showPermissionsSection()) {\n this.loadPermissions();\n }\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 // Load profile picture URL (only if storage is enabled)\n if (user.profilePictureId && isFeatureEnabled(this.appConfig, 'storage')) {\n this.fileUrlService\n .fetchSingleFileUrl(user.profilePictureId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((file) => {\n this._profilePictureUrl.set(file?.url ?? null);\n });\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 let rolesLoaded = !loadRoles;\n let actionsLoaded = !loadActions;\n\n const checkComplete = () => {\n if (rolesLoaded && actionsLoaded) {\n this.isLoadingPermissions.set(false);\n }\n };\n\n // Load roles (if applicable)\n if (loadRoles) {\n this.permissionProvider\n .getUserRoles(user.id, branch?.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this._userRoles.set(response.data ?? []);\n rolesLoaded = true;\n checkComplete();\n },\n error: () => {\n this._userRoles.set([]);\n rolesLoaded = true;\n checkComplete();\n },\n });\n }\n\n // Load actions (if applicable)\n if (loadActions) {\n this.permissionProvider\n .getUserActions(user.id, branch?.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this._userActions.set(response.data ?? []);\n actionsLoaded = true;\n checkComplete();\n },\n error: () => {\n this._userActions.set([]);\n actionsLoaded = true;\n checkComplete();\n },\n });\n }\n }\n\n onProfilePictureUploaded(file: { id?: string; name: string; key: string; size: number; contentType: string }): void {\n // Update user with new profile picture ID (file.id is the FileManager UUID)\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 // Update auth state with new profile picture ID\n this.authState.setUser({\n ...user,\n profilePictureId: fileManagerId,\n });\n // Fetch new profile picture URL (force refresh to get fresh URL)\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: 'Success',\n detail: 'Profile picture updated',\n });\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n\n onSubmit(): void {\n if (!this.isFormValid()) return;\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 this.userService\n .updateProfile(updateData)\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 // Update auth state with new user data (name and phone)\n this.authState.setUser({\n ...user,\n name: response.data.name,\n phone: response.data.phone ?? null,\n });\n // Update original form model to reset dirty state\n this.originalFormModel.set({\n name: response.data.name,\n phone: response.data.phone ?? '',\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Profile updated successfully',\n });\n }\n },\n error: () => {\n // Error toast handled by global interceptor\n },\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: () => {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Password changed successfully',\n });\n // Reset password form\n this.passwordModel.set({\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n });\n },\n error: () => {\n // Error toast handled by global interceptor\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\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 { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IRegistrationRequest } from '../../interfaces/auth.interface';\nimport { AuthApiService } from '../../services/auth-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n confirmPassword: string;\n phone: string;\n}\n\ninterface ICompanyFormModel {\n createNewCompany: boolean;\n companySlug: string;\n branchSlug: string;\n newCompanyName: string;\n newCompanyPhone: string;\n newCompanyAddress: string;\n}\n\n@Component({\n selector: 'lib-register-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div\n class=\"bg-surface-ground flex items-center justify-center min-h-screen py-8\"\n >\n <div class=\"flex flex-col items-center justify-center\">\n <div\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\"\n >\n <div\n class=\"py-8 px-4 sm:py-10 sm:px-8 md:py-12 md:px-12 w-full sm:w-[650px] max-w-[95vw] sm:max-w-[90vw]\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\"\n >\n <div class=\"text-center mb-6\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Create Account\n </div>\n <span class=\"text-muted-color font-medium\"\n >Register to get started</span\n >\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 >Full Name *</label\n >\n <input\n pInputText\n id=\"name\"\n [formField]=\"userForm.name\"\n placeholder=\"Your name\"\n class=\"w-full\"\n autocomplete=\"name\"\n />\n </div>\n\n <div>\n <label for=\"phone\" class=\"block font-medium mb-2\"\n >Phone</label\n >\n <input\n pInputText\n id=\"phone\"\n [formField]=\"userForm.phone\"\n placeholder=\"+1 234 567 8900\"\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 >Email *</label\n >\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"userForm.email\"\n placeholder=\"you@example.com\"\n class=\"w-full\"\n autocomplete=\"email\"\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 >Password *</label\n >\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"userForm.password\"\n placeholder=\"Min. 8 characters\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n </div>\n\n <div>\n <label for=\"confirmPassword\" class=\"block font-medium mb-2\"\n >Confirm Password *</label\n >\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n [formField]=\"userForm.confirmPassword\"\n placeholder=\"Confirm password\"\n class=\"w-full\"\n autocomplete=\"new-password\"\n />\n @if (!passwordsMatch() && userFormModel().confirmPassword) {\n <small class=\"text-danger block mt-2\"\n >Passwords do not match</small\n >\n }\n </div>\n </div>\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 Company Details\n </div>\n <span class=\"text-muted-color font-medium\"\n >Join existing or create new company</span\n >\n </div>\n\n <div class=\"mb-4\">\n <label\n class=\"p-checkbox-native\"\n (click)=\"onCreateCompanyToggle()\"\n >\n <input\n type=\"checkbox\"\n [formField]=\"companyForm.createNewCompany\"\n />\n <span>Create new company</span>\n </label>\n </div>\n\n @if (!companyFormModel().createNewCompany) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div>\n <label for=\"companySlug\" class=\"block font-medium mb-2\"\n >Company Code</label\n >\n <input\n pInputText\n id=\"companySlug\"\n [formField]=\"companyForm.companySlug\"\n placeholder=\"Company code/slug\"\n class=\"w-full\"\n />\n <small class=\"text-muted-color\"\n >Enter company code to join</small\n >\n </div>\n\n <div>\n <label for=\"branchSlug\" class=\"block font-medium mb-2\"\n >Branch Code</label\n >\n <input\n pInputText\n id=\"branchSlug\"\n [formField]=\"companyForm.branchSlug\"\n placeholder=\"Branch code (optional)\"\n class=\"w-full\"\n />\n </div>\n </div>\n } @else {\n <div class=\"mb-4\">\n <label for=\"newCompanyName\" class=\"block font-medium mb-2\"\n >Company Name *</label\n >\n <input\n pInputText\n id=\"newCompanyName\"\n [formField]=\"companyForm.newCompanyName\"\n placeholder=\"Your company name\"\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 >Company Phone</label\n >\n <input\n pInputText\n id=\"newCompanyPhone\"\n [formField]=\"companyForm.newCompanyPhone\"\n placeholder=\"Company phone\"\n class=\"w-full\"\n />\n </div>\n\n <div>\n <label\n for=\"newCompanyAddress\"\n class=\"block font-medium mb-2\"\n >Address</label\n >\n <input\n pInputText\n id=\"newCompanyAddress\"\n [formField]=\"companyForm.newCompanyAddress\"\n placeholder=\"Company address\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <p-button\n label=\"Create Account\"\n styleClass=\"w-full mt-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n\n <div class=\"flex items-center justify-center mt-4 gap-2\">\n <span class=\"font-medium\">Already have an account?</span>\n <a\n routerLink=\"/auth/login\"\n class=\"font-semibold text-primary cursor-pointer\"\n >\n Sign In\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 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\n readonly userFormModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n confirmPassword: '',\n phone: '',\n });\n readonly userForm = form(this.userFormModel, (f) => {\n required(f.name, { message: 'Name is required' });\n minLength(f.name, 2, { message: 'Name must be at least 2 characters' });\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\n required(f.password, { message: 'Password is required' });\n minLength(f.password, 8, {\n message: 'Password must be at least 8 characters',\n });\n required(f.confirmPassword, { message: 'Please confirm your password' });\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, (f) => {});\n\n readonly passwordsMatch = computed(() => {\n const model = this.userFormModel();\n return model.password === model.confirmPassword;\n });\n readonly isFormValid = computed(() => {\n const userModel = this.userFormModel();\n const userValid =\n userModel.name.trim().length >= 2 &&\n userModel.email.includes('@') &&\n userModel.password.length >= 8 &&\n userModel.confirmPassword.length > 0 &&\n this.passwordsMatch();\n\n if (!isCompanyFeatureEnabled(this.appConfig)) return userValid;\n\n const companyModel = this.companyFormModel();\n if (companyModel.createNewCompany) {\n return userValid && companyModel.newCompanyName.trim().length > 0;\n }\n return userValid;\n });\n\n constructor() {\n effect(() => {\n const params = this.queryParamMap();\n if (!params || this.companySlugInitialized) return;\n\n this.companySlugInitialized = true;\n const companySlug = params.get('companySlug');\n if (companySlug) {\n this.companyFormModel.update((model) => ({ ...model, companySlug }));\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: 'Validation Error',\n detail: 'Please fill in all required fields correctly.',\n });\n return;\n }\n\n this.isLoading.set(true);\n\n const userModel = this.userFormModel();\n const companyModel = this.companyFormModel();\n\n const registrationData: IRegistrationRequest = {\n name: userModel.name,\n email: userModel.email,\n password: userModel.password,\n phone: userModel.phone || undefined,\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)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.isLoading.set(false);\n\n if (response.requiresEmailVerification) {\n this.messageService.add({\n severity: 'success',\n summary: 'Account Created',\n detail: 'Please check your email to verify your account.',\n life: 5000,\n });\n this.router.navigate(['/auth/login']);\n return;\n }\n\n if (response.accessToken) {\n this.authState.setLoginState({\n accessToken: response.accessToken,\n refreshToken: response.refreshToken!,\n user: response.user,\n company: response.company,\n branch: response.branch,\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Account created successfully!',\n });\n this.authState.navigateAfterLogin(this.returnUrl());\n }\n },\n error: () => {\n this.isLoading.set(false);\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\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 { finalize } from 'rxjs';\nimport {\n form,\n FormField,\n required,\n minLength,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\ninterface IResetPasswordFormModel {\n newPassword: string;\n confirmPassword: string;\n}\n\ntype PageState = 'form' | 'success' | 'invalid-token';\n\n@Component({\n selector: 'lib-reset-password-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('form') {\n <div class=\"text-center mb-8\">\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Reset Password\n </div>\n <span class=\"text-muted-color font-medium\">\n Enter your new password below.\n </span>\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <label for=\"newPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n New Password\n </label>\n <input\n pInputText\n id=\"newPassword\"\n type=\"password\"\n placeholder=\"Enter new password\"\n class=\"w-full md:w-[25rem] mb-4\"\n [formField]=\"resetForm.newPassword\"\n autocomplete=\"new-password\" />\n\n <label for=\"confirmPassword\" class=\"block text-lg font-medium mb-2 text-color\">\n Confirm Password\n </label>\n <input\n pInputText\n id=\"confirmPassword\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"w-full md:w-[25rem] mb-2\"\n [formField]=\"resetForm.confirmPassword\"\n autocomplete=\"new-password\" />\n\n @if (passwordMismatch()) {\n <small class=\"text-danger block mb-4\">Passwords do not match</small>\n }\n\n <p-button\n label=\"Reset Password\"\n styleClass=\"w-full mt-4 mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!canSubmit() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\n </a>\n </div>\n </form>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-6xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Password Reset Successful\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n Your password has been reset successfully.\n You can now sign in with your new password.\n </p>\n <a routerLink=\"/auth/login\">\n <p-button label=\"Sign In\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-6xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Invalid or Expired Link\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n This password reset link is invalid or has expired.\n Please request a new one.\n </p>\n <a routerLink=\"/auth/forgot-password\">\n <p-button label=\"Request New Link\" styleClass=\"w-full mb-4\" />\n </a>\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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\n private readonly queryParams = toSignal(this.route.queryParams);\n private tokenInitialized = false;\n\n private token = '';\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('form');\n readonly formModel = signal<IResetPasswordFormModel>({ newPassword: '', confirmPassword: '' });\n readonly resetForm = form(this.formModel, (f) => {\n required(f.newPassword, { message: 'New password is required' });\n minLength(f.newPassword, 8, { message: 'Password must be at least 8 characters' });\n required(f.confirmPassword, { message: 'Please confirm your password' });\n });\n readonly passwordMismatch = computed(() => {\n const model = this.formModel();\n return model.confirmPassword.length > 0 && model.newPassword !== model.confirmPassword;\n });\n readonly canSubmit = computed(() => this.resetForm().valid() && !this.passwordMismatch());\n\n constructor() {\n effect(() => {\n const params = this.queryParams();\n if (!params || this.tokenInitialized) return;\n\n this.tokenInitialized = true;\n this.token = params['token'] || '';\n if (!this.token) {\n this.pageState.set('invalid-token');\n }\n });\n }\n\n onSubmit(): void {\n if (!this.canSubmit()) {\n this.messageService.add({\n severity: 'error',\n summary: 'Validation Error',\n detail: 'Please fill in all fields correctly.',\n });\n return;\n }\n\n this.isLoading.set(true);\n const newPassword = this.formModel().newPassword;\n\n this.authApi\n .resetPassword(this.token, newPassword)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: () => {\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Your password has been reset successfully.',\n });\n this.pageState.set('success');\n },\n error: (error) => {\n const message = error.error?.message || '';\n // Show invalid-token state for expired/invalid token errors\n if (message.toLowerCase().includes('expired') || message.toLowerCase().includes('invalid')) {\n this.pageState.set('invalid-token');\n }\n // Other errors handled by global interceptor\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required, email as emailValidator } from '@angular/forms/signals';\nimport { finalize } from 'rxjs';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IUser, ICreateUserRequest, IUpdateUserRequest } from '../../interfaces/user.interface';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserPermissionApiService } from '../../services/user-permission-api.service';\nimport { AuthStateService } from '../../services/auth-state.service';\n\n/** User form model interface */\ninterface IUserFormModel {\n name: string;\n email: string;\n password: string;\n phone: string;\n isActive: boolean;\n emailVerified: boolean;\n}\n\n/**\n * User Form Component\n * Handles creating and editing users.\n * When company feature is enabled, automatically assigns new users to current company/branch.\n */\n@Component({\n selector: 'lib-user-form',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex justify-between items-center p-4\">\n <h2 class=\"text-xl font-semibold m-0\">\n {{ isEditMode() ? 'Edit User' : 'New User' }}\n </h2>\n </div>\n </ng-template>\n\n <form (ngSubmit)=\"onSubmit()\" class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\">Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"formTree.name\"\n placeholder=\"Full name\" />\n </div>\n\n <!-- Email -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"email\" class=\"font-medium\">Email *</label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n [formField]=\"formTree.email\"\n placeholder=\"user@example.com\" />\n </div>\n\n <!-- Password -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"password\" class=\"font-medium\">\n Password {{ isEditMode() ? '(leave blank to keep)' : '*' }}\n </label>\n <input\n pInputText\n id=\"password\"\n type=\"password\"\n [formField]=\"formTree.password\"\n placeholder=\"Password\" />\n </div>\n\n <!-- Phone -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"phone\" class=\"font-medium\">Phone</label>\n <input\n pInputText\n id=\"phone\"\n [formField]=\"formTree.phone\"\n placeholder=\"+1 234 567 8900\" />\n </div>\n\n <!-- Checkboxes -->\n <div class=\"flex items-center gap-6 md:col-span-2 pt-4\">\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.isActive\" />\n <span>Active</span>\n </label>\n <label class=\"p-checkbox-native\">\n <input\n type=\"checkbox\"\n [formField]=\"formTree.emailVerified\" />\n <span>Email Verified</span>\n </label>\n </div>\n\n <!-- Company Info (when company feature enabled) -->\n @if (companyFeatureEnabled() && !isEditMode()) {\n <div class=\"md:col-span-2 p-3 bg-primary/10 rounded-lg border border-primary/20\">\n <div class=\"flex items-center gap-2 text-primary\">\n <i class=\"pi pi-info-circle\"></i>\n <span class=\"text-sm\">\n User will be automatically assigned to\n <strong>{{ currentCompanyName() }}</strong>\n @if (currentBranchName()) {\n / <strong>{{ currentBranchName() }}</strong>\n }\n </span>\n </div>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-4 md:col-span-2 pt-4\">\n <p-button\n label=\"Cancel\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\" />\n <p-button\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </p-card>\n `,\n})\nexport class UserFormComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly messageService = inject(MessageService);\n private readonly userService = inject(UserApiService);\n private readonly permissionService = inject(UserPermissionApiService);\n private readonly authState = inject(AuthStateService);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private userLoadTriggered = false;\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Existing user data when editing */\n readonly existingUser = signal<IUser | null>(null);\n\n /** Whether in edit mode */\n readonly isEditMode = computed(() => !!this.existingUser());\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Current company name */\n readonly currentCompanyName = computed(() => this.authState.companyName());\n\n /** Current branch name */\n readonly currentBranchName = computed(() => this.authState.branchName());\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IUserFormModel>({\n name: '',\n email: '',\n password: '',\n phone: '',\n isActive: true,\n emailVerified: false,\n });\n\n /** Form with validation schema */\n readonly formTree = form(this.formModel, (f) => {\n required(f.name, { message: 'Name is required' });\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\n // Password validation is conditional - required only for new users\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n const isEdit = this.isEditMode();\n\n // Basic validation\n const nameValid = model.name.trim().length > 0;\n const emailValid = model.email.includes('@');\n\n const passwordValid = isEdit ? true : model.password.length >= 8;\n\n return nameValid && emailValid && passwordValid;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.userLoadTriggered) return;\n\n this.userLoadTriggered = true;\n const id = params.get('id');\n if (id && id !== 'new') {\n this.loadUser(id);\n }\n });\n }\n\n loadUser(id: string): void {\n this.isLoading.set(true);\n this.userService.findById(id)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.existingUser.set(response.data);\n this.formModel.set(this.toFormModel(response.data));\n }\n },\n error: () => this.router.navigate(['/administration/users']),\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: 'Validation Error',\n detail: 'Please fill in all 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 updateUser(): void {\n const model = this.formModel();\n const updateData: IUpdateUserRequest = {\n id: this.existingUser()!.id,\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 this.userService.update(updateData)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: () => this.onSaveSuccess('User updated successfully.'),\n });\n }\n\n private createUser(): void {\n const model = this.formModel();\n const createData: ICreateUserRequest = {\n name: model.name,\n email: model.email,\n password: model.password,\n phone: model.phone || undefined,\n isActive: model.isActive,\n emailVerified: model.emailVerified,\n };\n\n this.userService.insert(createData)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.isLoading.set(false))\n )\n .subscribe({\n next: (response) => {\n if (this.companyFeatureEnabled() && response.success && response.data) {\n this.assignUserToCompanyAndBranch(response.data.id);\n }\n this.onSaveSuccess('User created successfully.');\n },\n });\n }\n\n private onSaveSuccess(message: string): void {\n this.messageService.add({ severity: 'success', summary: 'Success', detail: message });\n this.router.navigate(['/administration/users']);\n }\n\n /**\n * Assign user to current company and branch\n */\n private assignUserToCompanyAndBranch(userId: string): void {\n const company = this.authState.company();\n const branch = this.authState.branch();\n\n if (!company) return;\n\n // Assign to company\n this.permissionService.assignUserToCompany(userId, company.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // If branch exists, assign to branch\n if (branch) {\n this.permissionService.assignUserToBranch(userId, branch.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n // Silently fail - user was created successfully\n });\n }\n },\n // Silently fail - user was created successfully\n });\n }\n\n onCancel(): void {\n this.router.navigate(['/administration/users']);\n }\n}\n","import { ChangeDetectionStrategy, Component, effect, inject, input, output, signal } from '@angular/core';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { ICompany } from '../interfaces/company.interface';\nimport { IUser } from '../interfaces/user.interface';\nimport { CompanyApiService } from '../services/company-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\ninterface CompanyWithAssignment extends ICompany {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-company-permission-dialog',\n imports: [AngularModule, PrimeModule, DialogModule, ProgressSpinnerModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n header=\"Manage Company Permissions\"\n (onHide)=\"onClose()\">\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color\">\n User: <strong>{{ user()?.name }}</strong> ({{ user()?.email }})\n </p>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (company of companies(); track company.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"company.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'company-' + company.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onCompanyToggle(company)\" />\n <label [for]=\"'company-' + company.id\" class=\"ml-3 flex-1 cursor-pointer\">\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 No companies available\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n label=\"Close\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\" />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserCompanyPermissionDialogComponent {\n private readonly companyApi = inject(CompanyApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n\n readonly visible = input.required<boolean>();\n readonly user = input.required<IUser | null>();\n readonly closed = output<void>();\n readonly permissionsChanged = output<void>();\n\n readonly isLoading = signal(false);\n readonly isSaving = signal(false);\n readonly companies = signal<CompanyWithAssignment[]>([]);\n\n private assignedCompanyIds = new Set<string>();\n\n constructor() {\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadData();\n }\n });\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isLoading.set(true);\n try {\n const companiesResponse = await firstValueFrom(\n this.companyApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: {},\n select: [],\n sort: {},\n })\n );\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id)\n );\n\n this.assignedCompanyIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n this.assignedCompanyIds.add(permission.companyId);\n });\n }\n\n const companiesWithStatus: CompanyWithAssignment[] =\n (companiesResponse.data || []).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: 'Success',\n detail: `Assigned ${company.name}`,\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: 'Success',\n detail: `Revoked ${company.name}`,\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 { ChangeDetectionStrategy, Component, effect, inject, input, output, signal } from '@angular/core';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { DialogModule } from 'primeng/dialog';\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\nimport { firstValueFrom } from 'rxjs';\nimport { IBranch } from '../interfaces/branch.interface';\nimport { IUser } from '../interfaces/user.interface';\nimport { BranchApiService } from '../services/branch-api.service';\nimport { UserPermissionApiService } from '../services/user-permission-api.service';\n\ninterface BranchWithAssignment extends IBranch {\n isAssigned: boolean;\n}\n\n@Component({\n selector: 'lib-user-branch-permission-dialog',\n imports: [AngularModule, PrimeModule, DialogModule, ProgressSpinnerModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p-dialog\n [visible]=\"visible()\"\n [modal]=\"true\"\n [closable]=\"true\"\n [breakpoints]=\"{ '960px': '90vw', '640px': '95vw' }\"\n [style]=\"{ width: '50vw', maxWidth: '600px' }\"\n header=\"Manage Branch Permissions\"\n (onHide)=\"onClose()\">\n <div class=\"mb-4\">\n <p class=\"text-sm text-muted-color mb-3\">\n User: <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]\">Company:</label>\n <p-select\n [options]=\"companies()\"\n [(ngModel)]=\"selectedCompanyId\"\n (onChange)=\"onCompanyChange()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Company\"\n styleClass=\"w-full\"\n [disabled]=\"isLoading() || isSaving()\" />\n </div>\n </div>\n\n @if (isLoading()) {\n <div class=\"flex justify-center items-center py-8\">\n <p-progressSpinner />\n </div>\n } @else {\n <div class=\"flex flex-col gap-3\">\n @for (branch of branches(); track branch.id) {\n <div class=\"flex items-center p-3 border border-surface rounded\">\n <p-checkbox\n [(ngModel)]=\"branch.isAssigned\"\n [binary]=\"true\"\n [inputId]=\"'branch-' + branch.id\"\n [disabled]=\"isSaving()\"\n (onChange)=\"onBranchToggle(branch)\" />\n <label [for]=\"'branch-' + branch.id\" class=\"ml-3 flex-1 cursor-pointer\">\n <div class=\"font-semibold\">{{ branch.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ branch.slug }}</div>\n </label>\n </div>\n } @empty {\n <div class=\"text-center py-4 text-muted-color\">\n @if (companies().length === 0) {\n This user has no company permissions assigned.<br/>\n <span class=\"text-xs\">Assign company permissions first before managing branch access.</span>\n } @else if (!selectedCompanyId) {\n Please select a company to view branches.\n } @else {\n No branches available for the selected company.\n }\n </div>\n }\n </div>\n }\n\n <ng-template #footer>\n <p-button\n label=\"Close\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n [disabled]=\"isSaving()\" />\n </ng-template>\n </p-dialog>\n `,\n})\nexport class UserBranchPermissionDialogComponent {\n private readonly branchApi = inject(BranchApiService);\n private readonly permissionApi = inject(UserPermissionApiService);\n private readonly messageService = inject(MessageService);\n\n readonly visible = input.required<boolean>();\n readonly user = input.required<IUser | null>();\n readonly closed = output<void>();\n readonly permissionsChanged = output<void>();\n\n readonly isLoading = signal(false);\n readonly isSaving = signal(false);\n readonly branches = signal<BranchWithAssignment[]>([]);\n readonly companies = signal<Array<{ id: string; name: string }>>([]);\n\n selectedCompanyId: string | null = null;\n private assignedBranchIds = new Set<string>();\n\n constructor() {\n effect(() => {\n if (this.visible() && this.user()) {\n this.loadUserCompaniesAndData();\n }\n });\n }\n\n private async loadUserCompaniesAndData(): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n try {\n const companiesResponse = await firstValueFrom(\n this.permissionApi.getUserCompanies(currentUser.id)\n );\n\n const userCompanies = (companiesResponse.data || []).map((permission) => ({\n id: permission.companyId,\n name: permission.companyName,\n }));\n\n this.companies.set(userCompanies);\n this.selectedCompanyId = null;\n this.branches.set([]);\n } catch {}\n }\n\n private async loadData(): Promise<void> {\n const currentUser = this.user();\n const companyId = this.selectedCompanyId;\n\n if (!currentUser || !companyId) return;\n\n this.isLoading.set(true);\n try {\n const branchesResponse = await firstValueFrom(\n this.branchApi.getAll('', {\n pagination: { currentPage: 0, pageSize: 1000 },\n filter: { companyId },\n select: [],\n sort: {},\n })\n );\n\n const assignedResponse = await firstValueFrom(\n this.permissionApi.getUserBranches(currentUser.id)\n );\n\n this.assignedBranchIds.clear();\n if (assignedResponse.data) {\n assignedResponse.data.forEach((permission) => {\n if (permission.companyId === companyId) {\n this.assignedBranchIds.add(permission.branchId);\n }\n });\n }\n\n const branchesWithStatus: BranchWithAssignment[] =\n (branchesResponse.data || []).map((branch) => ({\n ...branch,\n isAssigned: this.assignedBranchIds.has(branch.id),\n }));\n\n this.branches.set(branchesWithStatus);\n } catch {\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCompanyChange(): void {\n if (this.selectedCompanyId) {\n this.loadData();\n }\n }\n\n async onBranchToggle(branch: BranchWithAssignment): Promise<void> {\n const currentUser = this.user();\n if (!currentUser) return;\n\n this.isSaving.set(true);\n try {\n if (branch.isAssigned) {\n const response = await firstValueFrom(\n this.permissionApi.assignUserToBranch(currentUser.id, branch.id)\n );\n\n if (response.success) {\n this.assignedBranchIds.add(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Assigned ${branch.name}`,\n });\n this.permissionsChanged.emit();\n }\n } else {\n const response = await firstValueFrom(\n this.permissionApi.revokeUserFromBranch(currentUser.id, branch.id)\n );\n\n if (response.success) {\n this.assignedBranchIds.delete(branch.id);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: `Revoked ${branch.name}`,\n });\n this.permissionsChanged.emit();\n }\n }\n } catch {\n branch.isAssigned = !branch.isAssigned;\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { AngularModule, HasPermissionDirective, PrimeModule, USER_PERMISSIONS } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { TagModule } from 'primeng/tag';\nimport { IUser } from '../../interfaces/user.interface';\nimport { UserApiService } from '../../services/user-api.service';\nimport { UserCompanyPermissionDialogComponent } from '../../components/user-company-permission-dialog.component';\nimport { UserBranchPermissionDialogComponent } from '../../components/user-branch-permission-dialog.component';\n\n/**\n * User List Component\n * Displays a list of users with CRUD operations.\n */\n@Component({\n selector: 'lib-user-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AngularModule,\n PrimeModule,\n TagModule,\n HasPermissionDirective,\n UserCompanyPermissionDialogComponent,\n UserBranchPermissionDialogComponent,\n ],\n template: `\n <p-card>\n <ng-template #header>\n <div class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 p-4\">\n <h2 class=\"text-xl font-semibold m-0\">Users</h2>\n <p-button *hasPermission=\"USER_PERMISSIONS.CREATE\" label=\"Add User\" icon=\"pi pi-plus\" (onClick)=\"onCreate()\" />\n </div>\n </ng-template>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"users()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"10\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-striped\">\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Email Verified</th>\n <th>Status</th>\n <th class=\"w-[150px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-user>\n <tr>\n <td>{{ user.name }}</td>\n <td>{{ user.email }}</td>\n <td>{{ user.phone || '-' }}</td>\n <td>\n <p-tag\n [value]=\"user.emailVerified ? 'Verified' : 'Unverified'\"\n [severity]=\"user.emailVerified ? 'success' : 'warn'\" />\n </td>\n <td>\n <p-tag\n [value]=\"user.isActive ? 'Active' : 'Inactive'\"\n [severity]=\"user.isActive ? 'success' : 'danger'\" />\n </td>\n <td>\n <div class=\"flex gap-2\">\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"info\"\n pTooltip=\"Edit\"\n (onClick)=\"onEdit(user)\" />\n @if (companyFeatureEnabled()) {\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-building\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n pTooltip=\"Company Permissions\"\n (onClick)=\"onManageCompanyPermissions(user)\" />\n <p-button\n *hasPermission=\"USER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-sitemap\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"secondary\"\n pTooltip=\"Branch Permissions\"\n (onClick)=\"onManageBranchPermissions(user)\" />\n }\n <p-button\n *hasPermission=\"USER_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n pTooltip=\"Delete\"\n (onClick)=\"onDelete(user)\" />\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 No users found. Click \"Add User\" to create one.\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </p-card>\n\n <!-- Permission Dialogs -->\n @if (companyFeatureEnabled()) {\n <lib-user-company-permission-dialog\n [visible]=\"showCompanyDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showCompanyDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n\n <lib-user-branch-permission-dialog\n [visible]=\"showBranchDialog()\"\n [user]=\"selectedUser()\"\n (closed)=\"showBranchDialog.set(false)\"\n (permissionsChanged)=\"loadUsers()\" />\n }\n `,\n})\nexport class UserListComponent {\n // Permission constants for template\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 /** Users from service */\n readonly users = this.userService.data;\n\n /** Loading state from service */\n readonly isLoading = this.userService.isLoading;\n\n /** Total count from service */\n readonly total = this.userService.total;\n\n /** Whether company feature is enabled */\n readonly companyFeatureEnabled = computed(() => isCompanyFeatureEnabled(this.appConfig));\n\n /** Dialog visibility */\n readonly showCompanyDialog = signal(false);\n readonly showBranchDialog = signal(false);\n\n /** Selected user for permission management */\n readonly selectedUser = signal<IUser | null>(null);\n\n loadUsers(): void {\n this.userService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 10 },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n const first = event.first ?? 0;\n const rows = event.rows ?? 10;\n const page = Math.floor(first / rows);\n this.userService.fetchList('', {\n pagination: { currentPage: page, pageSize: rows },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/administration/users/new']);\n }\n\n onEdit(user: IUser): void {\n this.router.navigate(['/administration/users', user.id]);\n }\n\n onManageCompanyPermissions(user: IUser): void {\n this.openPermissionDialog(user, this.showCompanyDialog);\n }\n\n onManageBranchPermissions(user: IUser): void {\n this.openPermissionDialog(user, this.showBranchDialog);\n }\n\n private openPermissionDialog(user: IUser, dialogSignal: typeof this.showCompanyDialog): void {\n this.selectedUser.set(user);\n dialogSignal.set(true);\n }\n\n onDelete(user: IUser): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${user.name}\"?`,\n header: 'Delete User',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.userService.deleteAsync({ id: user.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'User deleted successfully.',\n });\n this.userService.reload();\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\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 { finalize } from 'rxjs';\nimport {\n form,\n FormField,\n required,\n email as emailValidator,\n} from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AppFloatingConfigurator } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { AuthApiService } from '../../services/auth-api.service';\n\nconst VERIFY_EMAIL_KEY = makeStateKey<'success' | 'error'>('verify-email-result');\n\ninterface IResendFormModel {\n email: string;\n}\n\ntype PageState = 'verifying' | 'success' | 'invalid-token' | 'resend';\n\n@Component({\n selector: 'lib-verify-email-page',\n imports: [AngularModule, PrimeModule, FormField, AppFloatingConfigurator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <app-floating-configurator />\n <div class=\"bg-surface-ground flex items-center justify-center min-h-screen\">\n <div class=\"flex flex-col items-center justify-center w-full max-w-[32rem] px-4\">\n <div\n class=\"w-full\"\n style=\"border-radius: var(--p-content-border-radius); padding: 0.3rem; background: linear-gradient(180deg, var(--primary-color) 10%, rgba(33, 150, 243, 0) 30%)\">\n <div\n class=\"w-full py-8 px-4 sm:py-12 sm:px-8 md:py-16 md:px-12\"\n style=\"border-radius: var(--p-content-border-radius); background: var(--p-content-background)\">\n\n @switch (pageState()) {\n @case ('verifying') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-spin pi-spinner text-8xl text-primary\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Verifying Email\n </div>\n <p class=\"text-muted-color font-medium\">\n Please wait while we verify your email address...\n </p>\n </div>\n }\n\n @case ('success') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-check-circle text-8xl text-success\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Email Verified\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n Your email address has been verified successfully.\n You can now access all features of your account.\n </p>\n <a routerLink=\"/auth/login\">\n <p-button label=\"Sign In\" styleClass=\"w-full\" />\n </a>\n </div>\n }\n\n @case ('invalid-token') {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-times-circle text-8xl text-danger\"></i>\n </div>\n <div class=\"text-3xl font-medium mb-4 text-color\">\n Verification Failed\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n This verification link is invalid or has expired.\n </p>\n <p-button\n label=\"Resend Verification Email\"\n styleClass=\"w-full mb-4\"\n (onClick)=\"showResendForm()\" />\n <div class=\"mt-4\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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 Resend Verification\n </div>\n <span class=\"text-muted-color font-medium\">\n Enter your email to receive a new verification link.\n </span>\n </div>\n\n @if (!resendSuccess()) {\n <form (ngSubmit)=\"onResend()\">\n <label for=\"email\" class=\"block text-lg font-medium mb-2 text-color\">\n Email\n </label>\n <input\n pInputText\n id=\"email\"\n type=\"email\"\n placeholder=\"Enter your email address\"\n class=\"w-full md:w-[25rem] mb-6\"\n [formField]=\"resendForm.email\"\n autocomplete=\"email\" />\n\n <p-button\n label=\"Resend Verification\"\n styleClass=\"w-full mb-4\"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isResendFormValid() || isLoading()\" />\n\n <div class=\"flex items-center justify-center gap-2\">\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\n </a>\n </div>\n </form>\n } @else {\n <div class=\"text-center\">\n <div class=\"flex justify-center mb-6\">\n <i class=\"pi pi-envelope text-8xl text-primary\"></i>\n </div>\n <p class=\"text-muted-color font-medium mb-6\">\n We've sent a new verification link to <strong>{{ submittedEmail() }}</strong>.\n Please check your inbox.\n </p>\n <a routerLink=\"/auth/login\" class=\"font-semibold text-primary cursor-pointer\">\n Back to Sign In\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\n private readonly queryParams = toSignal(this.route.queryParams);\n private verificationTriggered = false;\n\n readonly isLoading = signal(false);\n readonly pageState = signal<PageState>('verifying');\n readonly resendSuccess = signal(false);\n readonly submittedEmail = signal('');\n readonly resendFormModel = signal<IResendFormModel>({ email: '' });\n readonly resendForm = form(this.resendFormModel, (f) => {\n required(f.email, { message: 'Email is required' });\n emailValidator(f.email, { message: 'Please enter a valid email address' });\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: 'Success',\n detail: 'Your email has been verified successfully.',\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: 'Validation Error',\n detail: 'Please enter a valid email address.',\n });\n return;\n }\n\n this.isLoading.set(true);\n const email = this.resendFormModel().email;\n\n // Always show success (security: don't reveal if email exists)\n this.authApi\n .resendVerification(email)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n finalize(() => this.handleResendComplete(email))\n )\n .subscribe();\n }\n\n private handleResendComplete(email: string): void {\n this.isLoading.set(false);\n this.messageService.add({\n severity: 'success',\n summary: 'Email Sent',\n detail: 'If the email exists, a verification link has been 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';\n\n// Constants\nexport * from './constants/auth-endpoints.const';\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","i1","i4","i5","i6","i7","i2","i3","emailValidator"],"mappings":"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"}
|