@flusys/ng-auth 1.1.1-beta → 1.2.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,19 @@
1
- import { IMessageResponse, ApiResourceService, ISingleResponse, IUserProvider, IListResponse, IUserBasicInfo, ICompanyApiProvider, ICompanyBasicInfo, IUserPermissionProvider, IProfileRoleInfo, IProfileActionInfo, UploadFileFn } from '@flusys/ng-shared';
1
+ import { ISingleResponse, IMessageResponse, ApiResourceService, ICompanyApiProvider, IListResponse, ICompanyBasicInfo, IAuthStateProvider, IUserPermissionProvider, IUserBranchPermission as IUserBranchPermission$1, IUserProvider, IUserBasicInfo, ILogicNode, RouterTabItem, BaseFormComponent, IFormField, ITableAction, ITableColumn, IProfileRoleInfo, IProfileActionInfo } from '@flusys/ng-shared';
2
2
  import * as rxjs from 'rxjs';
3
3
  import { Observable } from 'rxjs';
4
4
  import * as _angular_core from '@angular/core';
5
- import { Signal, Provider, OnInit } from '@angular/core';
6
- import { HttpClient, HttpRequest, HttpHandlerFn, HttpEvent } from '@angular/common/http';
5
+ import { Signal, Provider, InjectionToken, Type, TemplateRef, Injector } from '@angular/core';
7
6
  import { CanActivateFn, Routes } from '@angular/router';
7
+ import { HttpRequest, HttpHandlerFn, HttpEvent } from '@angular/common/http';
8
8
  import { ILayoutAuthApi, ICompanyInfo as ICompanyInfo$1, IBranchInfo as IBranchInfo$1, ILayoutAuthState, IUserInfo as IUserInfo$1 } from '@flusys/ng-layout';
9
9
  import * as _angular_forms_signals from '@angular/forms/signals';
10
10
  import * as _flusys_ng_auth from '@flusys/ng-auth';
11
11
  import * as _flusys_ng_core from '@flusys/ng-core';
12
12
 
13
- /**
14
- * Login Request Interface
15
- */
16
13
  interface ILoginRequest {
17
14
  email: string;
18
15
  password: string;
19
16
  }
20
- /**
21
- * Registration Request Interface
22
- * Supports both simple registration and company-based registration
23
- */
24
17
  interface IRegistrationRequest {
25
18
  name: string;
26
19
  email: string;
@@ -31,34 +24,21 @@ interface IRegistrationRequest {
31
24
  newCompanyName?: string;
32
25
  newCompanyPhone?: string;
33
26
  newCompanyAddress?: string;
27
+ additionalFields?: Record<string, unknown>;
34
28
  }
35
- /**
36
- * Select Company & Branch Request Interface
37
- * Used after login when user needs to select company and branch
38
- */
39
29
  interface ISelectRequest {
40
30
  sessionId: string;
41
31
  companyId: string;
42
32
  branchId: string;
43
33
  }
44
- /**
45
- * Switch Company Request Interface
46
- * Used to switch company/branch after login
47
- */
48
34
  interface ISwitchCompanyRequest {
49
35
  companyId: string;
50
36
  branchId: string;
51
37
  }
52
- /**
53
- * Change Password Request Interface
54
- */
55
38
  interface IChangePasswordRequest {
56
39
  currentPassword: string;
57
40
  newPassword: string;
58
41
  }
59
- /**
60
- * User Info Interface (used in responses)
61
- */
62
42
  interface IUserInfo {
63
43
  id: string;
64
44
  email: string;
@@ -70,126 +50,76 @@ interface IUserInfo {
70
50
  companyLogoId?: string;
71
51
  branchLogoId?: string;
72
52
  }
73
- /**
74
- * Company Info Interface (used in responses)
75
- */
76
53
  interface ICompanyInfo {
77
54
  id: string;
78
55
  name: string;
79
56
  slug?: string;
80
57
  logoId?: string | null;
81
58
  }
82
- /**
83
- * Branch Info Interface (used in responses)
84
- */
85
59
  interface IBranchInfo {
86
60
  id: string;
87
61
  name: string;
88
62
  slug?: string;
89
63
  logoId?: string | null;
90
64
  }
91
- /**
92
- * Branch Selection Info Interface (with additional fields)
93
- */
94
65
  interface IBranchSelectionInfo {
95
66
  id: string;
96
67
  name: string;
97
68
  slug: string;
98
- isActive: boolean;
99
69
  logoId?: string | null;
100
70
  }
101
- /**
102
- * Company with Branches Interface (for selection response)
103
- */
104
71
  interface ICompanyWithBranches {
105
72
  id: string;
106
73
  name: string;
107
74
  slug: string;
108
- isActive: boolean;
109
75
  logoId?: string | null;
110
76
  branches: IBranchSelectionInfo[];
111
77
  }
112
- /**
113
- * Login Response Interface
114
- * Returned on successful login with tokens
115
- */
116
- interface ILoginResponse {
78
+ interface ILoginData {
117
79
  accessToken: string;
118
- refreshToken: string;
80
+ refreshToken?: string;
119
81
  user: IUserInfo;
120
82
  company?: ICompanyInfo;
121
83
  branch?: IBranchInfo;
122
- companyFeatureEnabled?: boolean;
123
84
  }
124
- /**
125
- * Me Response Interface
126
- * Returned by GET /auth/me endpoint
127
- * Contains only user data, no tokens
128
- */
129
- interface IMeResponse {
85
+ interface IMeData {
130
86
  user: IUserInfo;
131
87
  company?: ICompanyInfo;
132
88
  branch?: IBranchInfo;
133
89
  }
134
- /**
135
- * Registration Response Interface
136
- * Returned on successful registration
137
- */
138
- interface IRegistrationResponse {
90
+ interface IRegistrationData {
139
91
  accessToken?: string;
140
92
  refreshToken?: string;
141
93
  user: IUserInfo;
142
94
  company?: ICompanyInfo;
143
95
  branch?: IBranchInfo;
144
- companyFeatureEnabled?: boolean;
145
96
  requiresEmailVerification?: boolean;
146
97
  }
147
- /**
148
- * Company Selection Response Interface
149
- * Returned when user has multiple companies/branches to choose from
150
- */
151
- interface ICompanySelectionResponse {
98
+ interface ICompanySelectionData {
152
99
  requiresSelection: true;
153
100
  sessionId: string;
154
101
  expiresAt: Date | string;
155
102
  user: IUserInfo;
156
103
  companies: ICompanyWithBranches[];
157
104
  }
158
- /**
159
- * Refresh Token Response Interface
160
- */
161
- interface IRefreshTokenResponse {
162
- accessToken: string;
163
- refreshToken?: string;
164
- }
165
- /**
166
- * Login Response when email verification required
167
- */
168
- interface ILoginRequiresEmailVerification {
105
+ interface IEmailVerificationData {
169
106
  requiresEmailVerification: true;
170
107
  email: string;
171
- message: string;
172
108
  }
173
- /**
174
- * Auth Response Type - Can be login success, company selection, or email verification required
175
- */
176
- type AuthResponse = ILoginResponse | ICompanySelectionResponse | ILoginRequiresEmailVerification;
177
- /**
178
- * Type guard to check if response requires email verification
179
- */
109
+ type ILoginResponse = ISingleResponse<ILoginData>;
110
+ type IMeResponse = ISingleResponse<IMeData>;
111
+ type IRegistrationResponse = ISingleResponse<IRegistrationData>;
112
+ type ICompanySelectionResponse = ISingleResponse<ICompanySelectionData>;
113
+ type ILoginRequiresEmailVerification = ISingleResponse<IEmailVerificationData>;
114
+ type IRefreshTokenResponse = ISingleResponse<{
115
+ accessToken: string;
116
+ refreshToken?: string;
117
+ }>;
118
+ type AuthResponse = ISingleResponse<ILoginData | ICompanySelectionData | IEmailVerificationData>;
180
119
  declare function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification;
181
- /**
182
- * Type guard to check if response requires company selection
183
- */
184
120
  declare function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse;
185
- /**
186
- * Type guard to check if response is a successful login
187
- */
188
121
  declare function isLoginResponse(response: AuthResponse): response is ILoginResponse;
189
122
 
190
- /**
191
- * Create Company Branch Request Interface
192
- */
193
123
  interface ICreateBranchRequest {
194
124
  name: string;
195
125
  slug: string;
@@ -203,15 +133,9 @@ interface ICreateBranchRequest {
203
133
  isActive?: boolean;
204
134
  additionalFields?: Record<string, unknown>;
205
135
  }
206
- /**
207
- * Update Company Branch Request Interface
208
- */
209
136
  interface IUpdateBranchRequest extends Partial<Omit<ICreateBranchRequest, 'companyId'>> {
210
137
  id: string;
211
138
  }
212
- /**
213
- * Company Branch Response Interface
214
- */
215
139
  interface IBranch {
216
140
  id: string;
217
141
  name: string;
@@ -230,9 +154,6 @@ interface IBranch {
230
154
  updatedAt: Date | string;
231
155
  }
232
156
 
233
- /**
234
- * Create Company Request Interface
235
- */
236
157
  interface ICreateCompanyRequest {
237
158
  name: string;
238
159
  slug: string;
@@ -246,15 +167,9 @@ interface ICreateCompanyRequest {
246
167
  settings?: Record<string, unknown>;
247
168
  additionalFields?: Record<string, unknown>;
248
169
  }
249
- /**
250
- * Update Company Request Interface
251
- */
252
170
  interface IUpdateCompanyRequest extends Partial<ICreateCompanyRequest> {
253
171
  id: string;
254
172
  }
255
- /**
256
- * Company Response Interface
257
- */
258
173
  interface ICompany {
259
174
  id: string;
260
175
  name: string;
@@ -273,88 +188,34 @@ interface ICompany {
273
188
  updatedAt: Date | string;
274
189
  }
275
190
 
276
- /**
277
- * Permission item for batch assignment/revocation
278
- */
279
191
  interface IPermissionItem {
280
- /** Target ID (Company ID or Branch ID) */
281
192
  targetId: string;
282
- /** Action: true to add permission, false to remove permission */
283
193
  isAdd: boolean;
284
194
  }
285
- /**
286
- * Batch assign/revoke user-company permissions request
287
- */
288
195
  interface IAssignUserCompanyRequest {
289
- /** User ID to assign/revoke permissions for */
290
196
  userId: string;
291
- /** List of company permissions to add or remove */
292
197
  items: IPermissionItem[];
293
198
  }
294
- /**
295
- * Batch assign/revoke user-branch permissions request
296
- */
297
199
  interface IAssignUserBranchRequest {
298
- /** User ID to assign/revoke permissions for */
299
200
  userId: string;
300
- /** List of branch permissions to add or remove */
301
201
  items: IPermissionItem[];
302
202
  }
303
- /**
304
- * User company permission with populated company details
305
- */
306
203
  interface IUserCompanyPermission {
307
- /** Permission ID */
308
204
  id: string;
309
- /** User ID */
310
205
  userId: string;
311
- /** Company ID */
312
206
  companyId: string;
313
- /** Company name */
314
207
  companyName: string;
315
- /** Company slug */
316
208
  companySlug: string;
317
209
  }
318
- /**
319
- * User branch permission with populated branch details
320
- */
321
210
  interface IUserBranchPermission {
322
- /** Permission ID */
323
211
  id: string;
324
- /** User ID */
325
212
  userId: string;
326
- /** Branch ID */
327
213
  branchId: string;
328
- /** Branch name */
329
214
  branchName: string;
330
- /** Branch slug */
331
215
  branchSlug: string;
332
- /** Company ID this branch belongs to */
333
216
  companyId: string;
334
217
  }
335
- /**
336
- * Response for user companies
337
- */
338
- interface IUserCompaniesResponse {
339
- data: IUserCompanyPermission[];
340
- }
341
- /**
342
- * Response for user branches
343
- */
344
- interface IUserBranchesResponse {
345
- data: IUserBranchPermission[];
346
- }
347
- /**
348
- * Batch operation result response
349
- */
350
- interface IBatchOperationResponse {
351
- success: boolean;
352
- message: string;
353
- }
354
218
 
355
- /**
356
- * Create User Request Interface
357
- */
358
219
  interface ICreateUserRequest {
359
220
  name: string;
360
221
  email: string;
@@ -366,14 +227,12 @@ interface ICreateUserRequest {
366
227
  phoneVerified?: boolean;
367
228
  additionalFields?: Record<string, unknown>;
368
229
  }
369
- /**
370
- * Update User Request Interface
371
- */
372
230
  interface IUpdateUserRequest {
373
231
  id: string;
374
232
  name?: string;
375
233
  email?: string;
376
234
  password?: string;
235
+ oldPassword?: string;
377
236
  phone?: string;
378
237
  profilePictureId?: string;
379
238
  isActive?: boolean;
@@ -381,9 +240,6 @@ interface IUpdateUserRequest {
381
240
  phoneVerified?: boolean;
382
241
  additionalFields?: Record<string, unknown>;
383
242
  }
384
- /**
385
- * User Response Interface
386
- */
387
243
  interface IUser {
388
244
  id: string;
389
245
  name: string;
@@ -400,113 +256,34 @@ interface IUser {
400
256
  deletedAt?: Date | string | null;
401
257
  }
402
258
 
403
- /**
404
- * Auth API Service
405
- * Handles all authentication-related API calls matching NestJS auth endpoints
406
- */
407
259
  declare class AuthApiService {
408
260
  private readonly appConfig;
409
261
  private readonly http;
410
262
  private readonly baseUrl;
411
263
  constructor();
412
- /**
413
- * Login with email and password
414
- * Returns either:
415
- * - ILoginResponse (direct login success)
416
- * - ICompanySelectionResponse (requires company/branch selection)
417
- */
418
264
  login(data: ILoginRequest): Observable<AuthResponse>;
419
- /**
420
- * Register new user
421
- * Supports simple registration and company-based registration
422
- * Returns RegistrationResponse directly (not wrapped in SingleResponse)
423
- */
424
265
  register(data: IRegistrationRequest): Observable<IRegistrationResponse>;
425
- /**
426
- * Select company and branch after login
427
- * Used when login returns requiresSelection: true
428
- * Returns LoginResponse directly (not wrapped)
429
- */
430
266
  select(data: ISelectRequest): Observable<ILoginResponse>;
431
- /**
432
- * Switch company/branch for logged-in user
433
- * Returns LoginResponse directly (not wrapped)
434
- */
435
267
  switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse>;
436
- /**
437
- * Refresh access token
438
- * Refresh token is sent via HTTP-only cookie
439
- * Returns RefreshTokenResponse directly (not wrapped)
440
- */
441
268
  refresh(): Observable<IRefreshTokenResponse>;
442
- /**
443
- * Get current user info
444
- * Returns only user data (no tokens) - IMeResponse
445
- */
446
269
  me(): Observable<IMeResponse>;
447
- /**
448
- * Logout current user
449
- */
450
270
  logout(): Observable<IMessageResponse>;
451
- /**
452
- * Change password for logged-in user
453
- */
454
271
  changePassword(data: IChangePasswordRequest): Observable<IMessageResponse>;
455
- /**
456
- * Send forgot password email
457
- */
458
272
  forgotPassword(email: string): Observable<IMessageResponse>;
459
- /**
460
- * Reset password with token
461
- */
462
273
  resetPassword(token: string, newPassword: string): Observable<IMessageResponse>;
463
- /**
464
- * Resend verification email (unauthenticated)
465
- */
466
274
  resendVerification(email: string): Observable<IMessageResponse>;
467
- /**
468
- * Verify email with token
469
- * Returns IMessageResponse for existing user verification
470
- * Returns IRegistrationResponse for pending registration completion
471
- */
472
275
  verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse>;
473
276
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthApiService, never>;
474
277
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthApiService>;
475
278
  }
476
279
 
477
- /**
478
- * Auth Initialization Service
479
- * Handles app startup authentication flow:
480
- * 1. Check if user has valid session (via refresh token cookie)
481
- * 2. Restore user state from /auth/me
482
- * 3. Handle company selection if needed
483
- *
484
- * IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues
485
- */
486
280
  declare class AuthInitService {
487
281
  private readonly authState;
488
282
  private readonly authApi;
489
- private readonly router;
490
283
  private readonly appConfig;
491
- /** Whether initial auth check has completed */
492
- readonly initialized: _angular_core.WritableSignal<boolean>;
493
- /** Whether auth check is in progress */
494
- readonly loading: _angular_core.WritableSignal<boolean>;
495
- /** Error from auth check */
496
- readonly error: _angular_core.WritableSignal<string | null>;
497
- /** Cached initialization observable to prevent duplicate calls */
284
+ private readonly _initialized;
285
+ readonly initialized: _angular_core.Signal<boolean>;
498
286
  private initializationCache$;
499
- /**
500
- * Initialize authentication state on app startup.
501
- *
502
- * Flow:
503
- * 1. If already authenticated with user data -> done
504
- * 2. Try refresh token (via cookie) -> get new access token
505
- * 3. Call /auth/me to get user info
506
- * 4. Update state accordingly
507
- *
508
- * Uses shareReplay to prevent duplicate initialization calls.
509
- */
510
287
  initialize(): Observable<boolean>;
511
288
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthInitService, never>;
512
289
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthInitService>;
@@ -519,29 +296,54 @@ declare class AuthInitService {
519
296
  declare class AuthStateService {
520
297
  private readonly appConfig;
521
298
  private readonly router;
522
- readonly user: _angular_core.WritableSignal<IUserInfo | null>;
523
- readonly accessToken: _angular_core.WritableSignal<string>;
524
- readonly company: _angular_core.WritableSignal<ICompanyInfo | null>;
525
- readonly branch: _angular_core.WritableSignal<IBranchInfo | null>;
526
- readonly selectionSessionId: _angular_core.WritableSignal<string | null>;
527
- readonly availableCompanies: _angular_core.WritableSignal<ICompanyWithBranches[]>;
528
- readonly selectionExpiresAt: _angular_core.WritableSignal<Date | null>;
299
+ private readonly platform;
300
+ private readonly translateAdapter;
301
+ private readonly _user;
302
+ private readonly _accessToken;
303
+ private readonly _tokenExpiresAt;
304
+ private readonly _company;
305
+ private readonly _branch;
306
+ readonly user: _angular_core.Signal<IUserInfo | null>;
307
+ readonly accessToken: _angular_core.Signal<string>;
308
+ readonly tokenExpiresAt: _angular_core.Signal<number | null>;
309
+ readonly company: _angular_core.Signal<ICompanyInfo | null>;
310
+ readonly branch: _angular_core.Signal<IBranchInfo | null>;
311
+ private readonly _selectionSessionId;
312
+ private readonly _availableCompanies;
313
+ readonly selectionSessionId: _angular_core.Signal<string | null>;
314
+ readonly availableCompanies: _angular_core.Signal<ICompanyWithBranches[]>;
529
315
  readonly isAuthenticated: _angular_core.Signal<boolean>;
530
316
  readonly requiresCompanySelection: _angular_core.Signal<boolean>;
531
317
  readonly userName: _angular_core.Signal<string>;
532
318
  readonly companyName: _angular_core.Signal<string>;
533
319
  readonly branchName: _angular_core.Signal<string>;
320
+ /**
321
+ * Check if token is expired or will expire soon (within 30 seconds).
322
+ * Used to proactively refresh token before requests fail.
323
+ */
324
+ readonly isTokenExpired: _angular_core.Signal<boolean>;
534
325
  readonly tenantId: _angular_core.Signal<string | null>;
535
326
  constructor();
536
- setLoginState(response: ILoginResponse): void;
537
- setSelectionState(response: ICompanySelectionResponse): void;
327
+ setLoginState(data: ILoginData): void;
328
+ setSelectionState(data: ICompanySelectionData): void;
538
329
  clearSelectionState(): void;
539
330
  resetState(): void;
331
+ setUser(user: IUserInfo | null): void;
332
+ setAccessToken(token: string): void;
333
+ setCompany(company: ICompanyInfo | null): void;
334
+ setBranch(branch: IBranchInfo | null): void;
540
335
  navigateToLogin(returnUrl?: string): void;
541
336
  navigateAfterLogin(returnUrl?: string): void;
337
+ /** Validates a return URL to prevent open redirect attacks */
338
+ private isValidReturnUrl;
542
339
  getStoredCompanyId(): string | null;
543
340
  getStoredBranchId(): string | null;
544
341
  private loadFromStorage;
342
+ /**
343
+ * Decode JWT expiry without verification (client-side only).
344
+ * Returns expiry timestamp in milliseconds.
345
+ */
346
+ private decodeTokenExpiry;
545
347
  private store;
546
348
  private get;
547
349
  private remove;
@@ -552,45 +354,9 @@ declare class AuthStateService {
552
354
  /**
553
355
  * Branch API Service
554
356
  * Signal-based service for branch CRUD operations
555
- * Branches default to current company context
556
- *
557
- * @example
558
- * ```typescript
559
- * branchService = inject(BranchApiService);
560
- *
561
- * // Set current company context
562
- * branchService.setCurrentCompanyId('company-uuid');
563
- *
564
- * // Access data via signals
565
- * branches = this.branchService.data;
566
- * isLoading = this.branchService.isLoading;
567
- *
568
- * // Fetch branches (will filter by current company)
569
- * this.branchService.fetchList('search');
570
- *
571
- * // Create branch (companyId will be auto-set if not provided)
572
- * await this.branchService.insertBranch({ name: 'New Branch', slug: 'new-branch' });
573
- * ```
574
357
  */
575
358
  declare class BranchApiService extends ApiResourceService<ICreateBranchRequest | IUpdateBranchRequest, IBranch> {
576
- /** Current company context for branch operations */
577
- readonly currentCompanyId: _angular_core.WritableSignal<string | null>;
578
- /** Branches filtered by current company */
579
- readonly companyBranches: _angular_core.Signal<IBranch[]>;
580
- constructor(http: HttpClient);
581
- /**
582
- * Set the current company context for branch operations
583
- */
584
- setCurrentCompanyId(companyId: string | null): void;
585
- /**
586
- * Insert a new branch, auto-setting companyId if not provided
587
- */
588
- insertBranch(data: Omit<ICreateBranchRequest, 'companyId'> & {
589
- companyId?: string;
590
- }): Promise<ReturnType<typeof this.insertAsync>>;
591
- /**
592
- * Fetch branches for a specific company
593
- */
359
+ constructor();
594
360
  fetchByCompany(companyId: string, search?: string): void;
595
361
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BranchApiService, never>;
596
362
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<BranchApiService>;
@@ -599,64 +365,25 @@ declare class BranchApiService extends ApiResourceService<ICreateBranchRequest |
599
365
  /**
600
366
  * Company API Service
601
367
  * Signal-based service for company CRUD operations
602
- *
603
- * @example
604
- * ```typescript
605
- * companyService = inject(CompanyApiService);
606
- *
607
- * // Access data via signals
608
- * companies = this.companyService.data;
609
- * isLoading = this.companyService.isLoading;
610
- *
611
- * // Fetch companies
612
- * this.companyService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });
613
- *
614
- * // Create company
615
- * await this.companyService.insertAsync({ name: 'New Company', slug: 'new-company' });
616
- * ```
617
368
  */
618
369
  declare class CompanyApiService extends ApiResourceService<ICreateCompanyRequest | IUpdateCompanyRequest, ICompany> {
619
- constructor(http: HttpClient);
370
+ constructor();
620
371
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyApiService, never>;
621
372
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<CompanyApiService>;
622
373
  }
623
374
 
624
375
  /**
625
376
  * Token Refresh State Service
626
- *
627
- * Manages token refresh state in a request-safe manner for SSR environments.
628
- * Replaces module-level state that would be shared across requests in SSR.
629
- *
630
- * @example
631
- * ```typescript
632
- * const refreshState = inject(TokenRefreshStateService);
633
- *
634
- * if (refreshState.isRefreshing()) {
635
- * // Queue request
636
- * } else {
637
- * refreshState.startRefresh();
638
- * // Perform refresh
639
- * }
640
- * ```
377
+ * Manages token refresh state for SSR-safe request queuing.
378
+ * Uses BehaviorSubject for RxJS interop (multi-subscriber async coordination).
641
379
  */
642
380
  declare class TokenRefreshStateService {
643
- /** Flag to track if token refresh is in progress */
644
381
  private readonly _isRefreshing;
645
382
  readonly isRefreshing: _angular_core.Signal<boolean>;
646
- /** Subject to queue requests while refreshing */
647
383
  private readonly _refreshTokenSubject;
648
384
  readonly refreshTokenSubject$: rxjs.Observable<string | null>;
649
- /**
650
- * Mark refresh as started
651
- */
652
385
  startRefresh(): void;
653
- /**
654
- * Mark refresh as completed and broadcast new token
655
- */
656
386
  completeRefresh(newToken: string): void;
657
- /**
658
- * Mark refresh as failed
659
- */
660
387
  failRefresh(): void;
661
388
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TokenRefreshStateService, never>;
662
389
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<TokenRefreshStateService>;
@@ -665,43 +392,9 @@ declare class TokenRefreshStateService {
665
392
  /**
666
393
  * User API Service
667
394
  * Signal-based service for user CRUD operations
668
- *
669
- * @example
670
- * ```typescript
671
- * userService = inject(UserApiService);
672
- *
673
- * // Access data via signals
674
- * users = this.userService.data;
675
- * isLoading = this.userService.isLoading;
676
- *
677
- * // Fetch users
678
- * this.userService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });
679
- *
680
- * // Create user
681
- * await this.userService.insertAsync({
682
- * name: 'John Doe',
683
- * email: 'john@example.com',
684
- * password: 'password123'
685
- * });
686
- * ```
687
395
  */
688
396
  declare class UserApiService extends ApiResourceService<ICreateUserRequest | IUpdateUserRequest, IUser> {
689
- constructor(http: HttpClient);
690
- /**
691
- * Verify user's email
692
- */
693
- verifyEmail(userId: string): Observable<IMessageResponse>;
694
- /**
695
- * Verify user's phone
696
- */
697
- verifyPhone(userId: string): Observable<IMessageResponse>;
698
- /**
699
- * Update user status (active/inactive)
700
- */
701
- updateStatus(userId: string, isActive: boolean): Observable<IMessageResponse>;
702
- /**
703
- * Update current user's profile
704
- */
397
+ constructor();
705
398
  updateProfile(data: IUpdateUserRequest): Observable<ISingleResponse<IUser>>;
706
399
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserApiService, never>;
707
400
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserApiService>;
@@ -709,194 +402,42 @@ declare class UserApiService extends ApiResourceService<ICreateUserRequest | IUp
709
402
 
710
403
  /**
711
404
  * User Permission API Service
712
- *
713
405
  * Handles user-company and user-branch permission assignments.
714
- * Uses batch operations for efficient permission management.
715
- *
716
- * Backend Endpoints:
717
- * - POST /administration/permissions/user-company/assign - Batch assign/revoke company permissions
718
- * - GET /administration/permissions/user-company?userId=xxx - Get user's companies
719
- * - POST /administration/permissions/user-branch/assign - Batch assign/revoke branch permissions
720
- * - GET /administration/permissions/user-branch?userId=xxx - Get user's branches
406
+ * Endpoint: POST /administration/permissions/*
721
407
  */
722
408
  declare class UserPermissionApiService {
723
409
  private readonly appConfig;
724
410
  private readonly http;
725
411
  private readonly baseUrl;
726
- constructor();
727
- /**
728
- * Batch assign/revoke user-company permissions
729
- *
730
- * @example
731
- * // Add company permissions
732
- * service.assignUserCompanies({
733
- * userId: 'user-id',
734
- * items: [
735
- * { targetId: 'company-1', isAdd: true },
736
- * { targetId: 'company-2', isAdd: true }
737
- * ]
738
- * });
739
- *
740
- * @example
741
- * // Remove company permissions
742
- * service.assignUserCompanies({
743
- * userId: 'user-id',
744
- * items: [
745
- * { targetId: 'company-1', isAdd: false }
746
- * ]
747
- * });
748
- */
749
- assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IBatchOperationResponse>;
750
- /**
751
- * Assign single company to user (convenience method)
752
- */
753
- assignUserToCompany(userId: string, companyId: string): Observable<IBatchOperationResponse>;
754
- /**
755
- * Revoke single company from user (convenience method)
756
- */
757
- revokeUserFromCompany(userId: string, companyId: string): Observable<IBatchOperationResponse>;
758
- /**
759
- * Get user's company permissions
760
- *
761
- * @param userId - User ID to get companies for
762
- * @returns Observable with user's company permissions
763
- */
764
- getUserCompanies(userId: string): Observable<IUserCompaniesResponse>;
765
- /**
766
- * Batch assign/revoke user-branch permissions
767
- *
768
- * @example
769
- * // Add branch permissions
770
- * service.assignUserBranches({
771
- * userId: 'user-id',
772
- * items: [
773
- * { targetId: 'branch-1', isAdd: true },
774
- * { targetId: 'branch-2', isAdd: true }
775
- * ]
776
- * });
777
- *
778
- * @example
779
- * // Remove branch permissions
780
- * service.assignUserBranches({
781
- * userId: 'user-id',
782
- * items: [
783
- * { targetId: 'branch-1', isAdd: false }
784
- * ]
785
- * });
786
- */
787
- assignUserBranches(data: IAssignUserBranchRequest): Observable<IBatchOperationResponse>;
788
- /**
789
- * Assign single branch to user (convenience method)
790
- */
791
- assignUserToBranch(userId: string, branchId: string): Observable<IBatchOperationResponse>;
792
- /**
793
- * Revoke single branch from user (convenience method)
794
- */
795
- revokeUserFromBranch(userId: string, branchId: string): Observable<IBatchOperationResponse>;
796
- /**
797
- * Get user's branch permissions
798
- *
799
- * @param userId - User ID to get branches for
800
- * @returns Observable with user's branch permissions
801
- */
802
- getUserBranches(userId: string): Observable<IUserBranchesResponse>;
412
+ assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IMessageResponse>;
413
+ assignUserToCompany(userId: string, companyId: string): Observable<IMessageResponse>;
414
+ revokeUserFromCompany(userId: string, companyId: string): Observable<IMessageResponse>;
415
+ getUserCompanies(userId: string): Observable<ISingleResponse<IUserCompanyPermission[]>>;
416
+ assignUserBranches(data: IAssignUserBranchRequest): Observable<IMessageResponse>;
417
+ assignUserToBranch(userId: string, branchId: string): Observable<IMessageResponse>;
418
+ revokeUserFromBranch(userId: string, branchId: string): Observable<IMessageResponse>;
419
+ getUserBranches(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission[]>>;
803
420
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserPermissionApiService, never>;
804
421
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserPermissionApiService>;
805
422
  }
806
423
 
807
- /**
808
- * Auth Guard
809
- * Protects routes that require authentication.
810
- *
811
- * Session restoration is handled by guestGuard. This guard assumes
812
- * the session has already been restored if user accessed login page first.
813
- *
814
- * Handles company feature:
815
- * - If company feature enabled and no company selected, redirects to login
816
- * (login page handles company selection as step 2)
817
- * - If not authenticated, redirects to login
818
- *
819
- * @example
820
- * ```typescript
821
- * // In routes configuration
822
- * {
823
- * path: 'dashboard',
824
- * loadComponent: () => import('./dashboard.component'),
825
- * canActivate: [authGuard]
826
- * }
827
- * ```
828
- */
424
+ /** Protects routes requiring authentication */
829
425
  declare const authGuard: CanActivateFn;
830
- /**
831
- * Guest Guard
832
- * Protects auth routes (login, register) from authenticated users.
833
- * Redirects authenticated users to home page.
834
- *
835
- * CRITICAL: Unlike old implementation, this guard RESTORES the session first
836
- * before checking authentication. This handles the case when users directly
837
- * navigate to /auth/login via browser URL while having valid refresh token.
838
- *
839
- * Flow:
840
- * 1. Restore session (if needed) via AuthInitService.initialize()
841
- * 2. Check if user is authenticated
842
- * 3. If authenticated -> redirect to dashboard
843
- * 4. If not authenticated -> allow access to login page
844
- *
845
- * @example
846
- * ```typescript
847
- * // In routes configuration
848
- * {
849
- * path: 'auth/login',
850
- * loadComponent: () => import('./login.component'),
851
- * canActivate: [guestGuard]
852
- * }
853
- * ```
854
- */
426
+ /** Protects auth routes from authenticated users, restores session first */
855
427
  declare const guestGuard: CanActivateFn;
856
- /**
857
- * Company Feature Guard
858
- * Protects routes that require company feature to be enabled.
859
- * Redirects to home if company feature is disabled.
860
- *
861
- * Use this guard on company/branch management routes.
862
- *
863
- * @example
864
- * ```typescript
865
- * // In routes configuration
866
- * {
867
- * path: 'administration/company',
868
- * loadComponent: () => import('./company-list.component'),
869
- * canActivate: [authGuard, companyFeatureGuard]
870
- * }
871
- * ```
872
- */
428
+ /** Protects routes requiring company feature to be enabled */
873
429
  declare const companyFeatureGuard: CanActivateFn;
430
+ /** Protects routes requiring email feature to be enabled */
431
+ declare const emailFeatureGuard: CanActivateFn;
432
+ /** Protects routes requiring sign-up feature to be enabled */
433
+ declare const signUpFeatureGuard: CanActivateFn;
874
434
 
875
435
  /**
876
436
  * Auth Interceptor - Adds auth headers and cookie credentials to requests
877
437
  */
878
438
  declare function authInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>>;
879
439
 
880
- /**
881
- * Token Refresh Interceptor
882
- * Handles 401 errors by refreshing the access token.
883
- *
884
- * - Intercepts 401 Unauthorized responses
885
- * - Calls refresh token endpoint
886
- * - Retries failed request with new token
887
- * - Queues concurrent requests during refresh
888
- * - Redirects to login on refresh failure
889
- * - SSR-safe: Uses injectable service instead of module-level state
890
- *
891
- * @example
892
- * ```typescript
893
- * // In app.config.ts
894
- * provideHttpClient(
895
- * withFetch(),
896
- * withInterceptors([authInterceptor, tokenRefreshInterceptor])
897
- * )
898
- * ```
899
- */
440
+ /** Token Refresh Interceptor - Proactive and reactive token refresh with request queuing */
900
441
  declare function tokenRefreshInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>>;
901
442
 
902
443
  /**
@@ -919,86 +460,49 @@ declare const ADMINISTRATION_ROUTES: Routes;
919
460
  declare const PROFILE_ROUTES: Routes;
920
461
 
921
462
  /**
922
- * Auth Layout State Adapter
923
- * Bridges AuthStateService signals to ILayoutAuthState interface.
924
- * Provides ready-to-use integration between ng-auth, ng-layout, and ng-shared provider tokens.
463
+ * Auth Layout Provider Adapters
464
+ *
465
+ * Implements provider interfaces from ng-layout using ng-auth services.
466
+ * Bridges auth state and API to layout components.
467
+ *
468
+ * @example
469
+ * // In app.config.ts
470
+ * import { provideAuthLayoutIntegration } from '@flusys/ng-auth';
471
+ * providers: [...provideAuthLayoutIntegration()]
925
472
  */
926
473
  declare class AuthLayoutStateAdapter implements ILayoutAuthState {
927
474
  private readonly authState;
928
- /**
929
- * Maps company info to company info for layout.
930
- * Falls back to app name from config when no company is selected.
931
- */
932
475
  readonly currentCompanyInfo: Signal<ICompanyInfo$1 | null>;
933
- /**
934
- * Maps branch info to branch info for layout.
935
- * Returns null when no branch is selected.
936
- */
937
476
  readonly currentBranchInfo: Signal<IBranchInfo$1 | null>;
938
- /**
939
- * Maps user info from auth state to layout user info.
940
- * Profile picture URL is managed separately by AuthLayoutSyncService via FileUrlService.
941
- */
942
477
  readonly loginUserData: Signal<IUserInfo$1 | null>;
943
478
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthLayoutStateAdapter, never>;
944
479
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthLayoutStateAdapter>;
945
480
  }
946
- /**
947
- * Auth Layout API Adapter
948
- * Bridges AuthApiService to ILayoutAuthApi interface.
949
- * Handles logout and navigation for layout components.
950
- */
951
481
  declare class AuthLayoutApiAdapter implements ILayoutAuthApi {
952
482
  private readonly authApi;
953
483
  private readonly authState;
954
484
  private readonly permissionApi;
955
485
  private readonly router;
956
- /**
957
- * Logout the current user.
958
- * Calls backend logout endpoint and resets local auth state.
959
- * Auth state reset handles clearing all localStorage including company/branch.
960
- */
961
486
  logOut(): Observable<any>;
962
- /**
963
- * Navigate to login page.
964
- * Optionally preserves current URL as return URL.
965
- */
966
487
  navigateLogin(withUrl?: boolean): void;
967
- /**
968
- * Switch to a different company and branch.
969
- * Calls backend switch endpoint, then triggers full page reload to
970
- * refresh permissions, reset component state, and re-filter all data.
971
- */
972
488
  switchCompany(companyId: string, branchId: string): Observable<any>;
973
- /**
974
- * Get list of companies the logged-in user has permissions for.
975
- * Uses permission API to filter by user's actual company-level permissions.
976
- */
977
489
  getUserCompanies(): Observable<ICompanyInfo$1[]>;
978
- /**
979
- * Get branches for a specific company that the logged-in user has access to.
980
- * Fetches all user branches and filters by companyId.
981
- */
982
490
  getCompanyBranches(companyId: string): Observable<IBranchInfo$1[]>;
983
491
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthLayoutApiAdapter, never>;
984
492
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthLayoutApiAdapter>;
985
493
  }
986
494
 
987
495
  /**
988
- * Auth User Provider Adapter
496
+ * Auth Shared Provider Adapters
989
497
  *
990
- * Implements IUserProvider interface from ng-shared using UserApiService from ng-auth.
991
- * This allows IAM and other packages to access user data without depending on ng-auth directly.
498
+ * Implements provider interfaces from ng-shared using ng-auth services.
499
+ * Allows IAM, Storage, and Form-Builder packages to access auth data
500
+ * without depending on ng-auth directly.
992
501
  *
993
502
  * @example
994
503
  * // In app.config.ts
995
- * providers: [
996
- * { provide: USER_PROVIDER, useClass: AuthUserProviderAdapter }
997
- * ]
998
- *
999
- * // In IAM component
1000
- * private readonly userProvider = inject(USER_PROVIDER);
1001
- * this.userProvider.getUsers({ page: 0, pageSize: 50 }).subscribe(...);
504
+ * import { provideAuthProviders } from '@flusys/ng-auth';
505
+ * providers: [...provideAuthProviders()]
1002
506
  */
1003
507
  declare class AuthUserProviderAdapter implements IUserProvider {
1004
508
  private readonly userApi;
@@ -1006,27 +510,12 @@ declare class AuthUserProviderAdapter implements IUserProvider {
1006
510
  page?: number;
1007
511
  pageSize?: number;
1008
512
  search?: string;
1009
- companyId?: string;
1010
- branchId?: string;
1011
513
  isActive?: boolean;
1012
514
  [key: string]: any;
1013
515
  }): Observable<IListResponse<IUserBasicInfo>>;
1014
516
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthUserProviderAdapter, never>;
1015
517
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthUserProviderAdapter>;
1016
518
  }
1017
-
1018
- /**
1019
- * Auth Company API Provider Adapter
1020
- *
1021
- * Implements ICompanyApiProvider interface from ng-shared using CompanyApiService.
1022
- * Allows IAM package to access company data without depending on ng-auth directly.
1023
- *
1024
- * @example
1025
- * // In app.config.ts
1026
- * providers: [
1027
- * { provide: COMPANY_API_PROVIDER, useClass: AuthCompanyApiProviderAdapter }
1028
- * ]
1029
- */
1030
519
  declare class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {
1031
520
  private readonly companyApi;
1032
521
  getCompanies(filter?: {
@@ -1037,107 +526,250 @@ declare class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {
1037
526
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthCompanyApiProviderAdapter, never>;
1038
527
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthCompanyApiProviderAdapter>;
1039
528
  }
1040
-
1041
- /**
1042
- * Auth User Permission Provider Adapter
1043
- *
1044
- * Implements IUserPermissionProvider interface from ng-shared using UserPermissionApiService.
1045
- * Allows IAM package to query user permissions without depending on ng-auth directly.
1046
- *
1047
- * @example
1048
- * // In app.config.ts
1049
- * providers: [
1050
- * { provide: USER_PERMISSION_PROVIDER, useClass: AuthUserPermissionProviderAdapter }
1051
- * ]
1052
- */
1053
529
  declare class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {
1054
530
  private readonly userPermissionApi;
1055
- getUserBranchPermissions(userId: string): Observable<ISingleResponse<any>>;
531
+ getUserBranchPermissions(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission$1[]>>;
1056
532
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthUserPermissionProviderAdapter, never>;
1057
533
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthUserPermissionProviderAdapter>;
1058
534
  }
535
+ declare class AuthStateProviderAdapter implements IAuthStateProvider {
536
+ private readonly authState;
537
+ private readonly authInit;
538
+ get isAuthenticated(): Signal<boolean>;
539
+ initialize(): Observable<void>;
540
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthStateProviderAdapter, never>;
541
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthStateProviderAdapter>;
542
+ }
1059
543
 
1060
- /**
1061
- * Provides auth layout integration for ng-layout.
1062
- * Call this in your app.config.ts to integrate ng-auth with ng-layout.
1063
- *
1064
- * Also registers LAYOUT_AUTH_STATE since AuthLayoutStateAdapter
1065
- * implements both ILayoutAuthState and ICompanyContextProvider.
1066
- *
1067
- * @example
1068
- * ```typescript
1069
- * // In app.config.ts
1070
- * export const appConfig: ApplicationConfig = {
1071
- * providers: [
1072
- * ...provideAuthLayoutIntegration(),
1073
- * ],
1074
- * };
1075
- * ```
1076
- */
544
+ /** Provides auth integration for ng-layout */
1077
545
  declare function provideAuthLayoutIntegration(): Provider[];
1078
546
 
1079
- /**
1080
- * Provide Auth Provider Adapters
1081
- *
1082
- * Registers auth implementations for provider interfaces from ng-shared.
1083
- * This allows IAM and Storage packages to use auth services without direct dependencies.
1084
- *
1085
- * @example
1086
- * // In app.config.ts
1087
- * import { provideAuthProviders } from '@flusys/ng-auth';
1088
- *
1089
- * export const appConfig: ApplicationConfig = {
1090
- * providers: [
1091
- * provideAuthProviders(),
1092
- * // ... other providers
1093
- * ]
1094
- * };
1095
- *
1096
- * @returns Array of Angular providers
1097
- */
547
+ /** Provides auth implementations for ng-shared provider interfaces */
1098
548
  declare function provideAuthProviders(): Provider[];
1099
549
 
550
+ interface IEmailValidationConfig {
551
+ pattern?: RegExp;
552
+ message?: string;
553
+ messageKey?: string;
554
+ messageParam?: Record<string, string | number>;
555
+ }
556
+ interface IPasswordValidationConfig {
557
+ minLength?: number;
558
+ maxLength?: number;
559
+ requireUppercase?: boolean;
560
+ requireLowercase?: boolean;
561
+ requireNumbers?: boolean;
562
+ requireSpecialChars?: boolean;
563
+ pattern?: RegExp;
564
+ message?: string;
565
+ messageKey?: string;
566
+ messageParam?: Record<string, string | number>;
567
+ }
568
+ interface IAuthValidationConfig {
569
+ email?: IEmailValidationConfig;
570
+ password?: IPasswordValidationConfig;
571
+ }
572
+ declare const AUTH_VALIDATION_CONFIG: InjectionToken<IAuthValidationConfig>;
573
+ interface IRegistrationFieldTemplateContext {
574
+ field: IRegistrationExtraField;
575
+ value: unknown;
576
+ updateValue: (value: unknown) => void;
577
+ }
578
+ declare const REGISTRATION_FIELD_CONTEXT: InjectionToken<IRegistrationFieldTemplateContext>;
579
+ interface IRegistrationExtraField {
580
+ key: string;
581
+ label: string;
582
+ labelKey?: string;
583
+ type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';
584
+ placeholder?: string;
585
+ placeholderKey?: string;
586
+ required?: boolean;
587
+ defaultValue?: unknown;
588
+ options?: Array<{
589
+ label: string;
590
+ labelKey?: string;
591
+ value: unknown;
592
+ }>;
593
+ pattern?: RegExp;
594
+ validationMessage?: string;
595
+ validationMessageKey?: string;
596
+ validationMessageParam?: Record<string, string | number>;
597
+ order?: number;
598
+ containerClass?: string;
599
+ template?: TemplateRef<IRegistrationFieldTemplateContext>;
600
+ component?: Type<unknown>;
601
+ injector?: Injector;
602
+ }
603
+ interface IRegistrationExtensionProvider {
604
+ getExtraFields(): IRegistrationExtraField[];
605
+ transformRegistrationData?(data: Record<string, unknown>): Record<string, unknown>;
606
+ validateExtraFields?(data: Record<string, unknown>): string | null;
607
+ }
608
+ declare const AUTH_REGISTRATION_EXTENSION: InjectionToken<IRegistrationExtensionProvider>;
609
+ interface IUserListExtraColumn {
610
+ key: string;
611
+ header: string;
612
+ headerKey?: string;
613
+ field?: string;
614
+ template?: TemplateRef<{
615
+ $implicit: IUser;
616
+ }>;
617
+ styleClass?: string;
618
+ width?: string;
619
+ sortable?: boolean;
620
+ order?: number;
621
+ }
622
+ interface IUserListExtraAction {
623
+ key: string;
624
+ label: string;
625
+ labelKey?: string;
626
+ icon: string;
627
+ severity?: 'info' | 'success' | 'warn' | 'danger' | 'secondary' | 'contrast';
628
+ permission?: string;
629
+ onClick: (user: IUser) => void;
630
+ isVisible?: (user: IUser) => boolean;
631
+ isDisabled?: (user: IUser) => boolean;
632
+ order?: number;
633
+ }
634
+ interface IUserListExtensionProvider {
635
+ getExtraColumns(): IUserListExtraColumn[];
636
+ getExtraActions(): IUserListExtraAction[];
637
+ enrichUserData?(users: IUser[]): Observable<IUser[]>;
638
+ }
639
+ declare const AUTH_USER_LIST_EXTENSION: InjectionToken<IUserListExtensionProvider>;
640
+ interface IProfileExtraSection {
641
+ key: string;
642
+ title: string;
643
+ titleKey?: string;
644
+ icon?: string;
645
+ order?: number;
646
+ component?: Type<unknown>;
647
+ template?: TemplateRef<{
648
+ user: IUser;
649
+ }>;
650
+ collapsible?: boolean;
651
+ collapsed?: boolean;
652
+ editPermission?: string | ILogicNode;
653
+ }
654
+ interface IProfileFieldTemplateContext {
655
+ field: IProfileExtraField;
656
+ value: unknown;
657
+ updateValue: (value: unknown) => void;
658
+ }
659
+ declare const PROFILE_FIELD_CONTEXT: InjectionToken<IProfileFieldTemplateContext>;
660
+ interface IProfileExtraField {
661
+ key: string;
662
+ label: string;
663
+ labelKey?: string;
664
+ type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';
665
+ placeholder?: string;
666
+ placeholderKey?: string;
667
+ editable?: boolean;
668
+ required?: boolean;
669
+ options?: Array<{
670
+ label: string;
671
+ labelKey?: string;
672
+ value: unknown;
673
+ }>;
674
+ pattern?: RegExp;
675
+ validationMessage?: string;
676
+ validationMessageKey?: string;
677
+ validationMessageParam?: Record<string, string | number>;
678
+ order?: number;
679
+ sectionKey?: string;
680
+ template?: TemplateRef<IProfileFieldTemplateContext>;
681
+ component?: Type<unknown>;
682
+ injector?: Injector;
683
+ }
684
+ interface IProfileExtensionProvider {
685
+ getExtraSections?(): IProfileExtraSection[];
686
+ getExtraFields?(): IProfileExtraField[];
687
+ getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;
688
+ saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;
689
+ validateExtraFields?(data: Record<string, unknown>): string | null;
690
+ }
691
+ declare const AUTH_PROFILE_EXTENSION: InjectionToken<IProfileExtensionProvider>;
692
+ interface IUserFormFieldTemplateContext {
693
+ field: IUserFormExtraField;
694
+ value: unknown;
695
+ updateValue: (value: unknown) => void;
696
+ }
697
+ declare const USER_FORM_FIELD_CONTEXT: InjectionToken<IUserFormFieldTemplateContext>;
698
+ interface IUserFormExtraField {
699
+ key: string;
700
+ label: string;
701
+ labelKey?: string;
702
+ type: 'text' | 'number' | 'select' | 'checkbox' | 'textarea' | 'date' | 'template';
703
+ placeholder?: string;
704
+ placeholderKey?: string;
705
+ required?: boolean;
706
+ options?: Array<{
707
+ label: string;
708
+ labelKey?: string;
709
+ value: unknown;
710
+ }>;
711
+ pattern?: RegExp;
712
+ validationMessage?: string;
713
+ validationMessageKey?: string;
714
+ validationMessageParam?: Record<string, string | number>;
715
+ order?: number;
716
+ template?: TemplateRef<IUserFormFieldTemplateContext>;
717
+ component?: Type<unknown>;
718
+ injector?: Injector;
719
+ }
720
+ interface IUserFormExtensionProvider {
721
+ getExtraFields?(): IUserFormExtraField[];
722
+ getExtraFieldValues?(userId: string): Observable<Record<string, unknown>>;
723
+ saveExtraFieldValues?(userId: string, data: Record<string, unknown>): Observable<void>;
724
+ validateExtraFields?(data: Record<string, unknown>): string | null;
725
+ }
726
+ declare const AUTH_USER_FORM_EXTENSION: InjectionToken<IUserFormExtensionProvider>;
727
+ type UserDetailViewMode = 'dialog' | 'sidebar' | 'page';
728
+ interface IUserDetailViewConfig {
729
+ viewMode: UserDetailViewMode;
730
+ allowEdit?: boolean;
731
+ width?: string;
732
+ component?: Type<unknown>;
733
+ tabs?: Array<{
734
+ key: string;
735
+ label: string;
736
+ labelKey?: string;
737
+ icon?: string;
738
+ component?: Type<unknown>;
739
+ template?: TemplateRef<{
740
+ user: IUser;
741
+ }>;
742
+ }>;
743
+ }
744
+ declare const AUTH_USER_DETAIL_CONFIG: InjectionToken<IUserDetailViewConfig>;
745
+ declare function validatePassword(password: string, config: IPasswordValidationConfig): string | null;
746
+ declare function validateEmail(email: string, config?: IEmailValidationConfig): string | null;
747
+
1100
748
  /**
1101
749
  * Authentication API Endpoints
1102
750
  *
1103
751
  * Centralized endpoint definitions to prevent inconsistencies across interceptors
1104
752
  * and services. All auth-related endpoints should be referenced from here.
1105
- *
1106
- * @example
1107
- * ```typescript
1108
- * if (isAuthEndpoint(req.url)) {
1109
- * // Skip interceptor logic
1110
- * }
1111
- * ```
1112
753
  */
1113
754
  declare const AUTH_ENDPOINTS: {
1114
755
  readonly LOGIN: "/auth/login";
1115
756
  readonly LOGOUT: "/auth/logout";
1116
757
  readonly REFRESH: "/auth/refresh";
1117
758
  readonly REGISTER: "/auth/register";
759
+ readonly ME: "/auth/me";
1118
760
  readonly SELECT: "/auth/select";
1119
761
  readonly SWITCH_COMPANY: "/auth/switch-company";
762
+ readonly CHANGE_PASSWORD: "/auth/change-password";
1120
763
  readonly VERIFY_EMAIL: "/auth/verify-email";
1121
764
  readonly FORGOT_PASSWORD: "/auth/forgot-password";
1122
765
  readonly RESET_PASSWORD: "/auth/reset-password";
1123
766
  readonly RESEND_VERIFICATION: "/auth/resend-verification";
1124
767
  };
1125
- /**
1126
- * Check if a URL is an auth-related endpoint
1127
- */
1128
- declare function isAuthEndpoint(url: string): boolean;
1129
- /**
1130
- * Check if a URL is a specific auth endpoint
1131
- */
768
+ /** Check if a URL matches a specific endpoint */
1132
769
  declare function isEndpoint(url: string, endpoint: string): boolean;
1133
770
 
1134
- interface ITab {
1135
- id: string;
1136
- label: string;
1137
- icon: string;
1138
- route: string;
1139
- requiresCompanyFeature?: boolean;
1140
- }
771
+ declare const AUTH_MESSAGES: Record<string, string>;
772
+
1141
773
  /**
1142
774
  * Administration Page Component
1143
775
  * Unified administration page with tabs for:
@@ -1147,14 +779,14 @@ interface ITab {
1147
779
  */
1148
780
  declare class AdministrationPageComponent {
1149
781
  private readonly appConfig;
782
+ private readonly permissionValidator;
783
+ private readonly translateService;
1150
784
  /** All available tabs */
1151
785
  private readonly allTabs;
1152
786
  /** Check if company feature is enabled */
1153
787
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1154
- /** Visible tabs based on config */
1155
- readonly visibleTabs: _angular_core.Signal<ITab[]>;
1156
- /** Dynamic subtitle based on visible features */
1157
- readonly subtitle: _angular_core.Signal<"Manage users, companies, and branches" | "Manage users">;
788
+ /** Visible tabs based on config and permissions */
789
+ readonly visibleTabs: _angular_core.Signal<RouterTabItem[]>;
1158
790
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdministrationPageComponent, never>;
1159
791
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdministrationPageComponent, "lib-administration-page", never, {}, {}, never, never, true, never>;
1160
792
  }
@@ -1174,13 +806,17 @@ interface IBranchFormModel {
1174
806
  * Handles creating and editing branches.
1175
807
  * Defaults to current company context.
1176
808
  */
1177
- declare class BranchFormComponent implements OnInit {
809
+ declare class BranchFormComponent {
1178
810
  private readonly router;
1179
811
  private readonly route;
1180
812
  private readonly messageService;
1181
813
  private readonly branchService;
1182
814
  private readonly companyService;
1183
815
  private readonly authState;
816
+ private readonly translateAdapter;
817
+ private translate;
818
+ private readonly routeParams;
819
+ private readonly queryParams;
1184
820
  /** Loading state */
1185
821
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1186
822
  /** Existing branch data when editing */
@@ -1192,24 +828,32 @@ declare class BranchFormComponent implements OnInit {
1192
828
  /** Form model */
1193
829
  readonly formModel: _angular_core.WritableSignal<IBranchFormModel>;
1194
830
  /** Form with validation schema */
1195
- readonly branchForm: _angular_forms_signals.FieldTree<IBranchFormModel, string | number>;
831
+ readonly branchForm: _angular_forms_signals.FieldTree<IBranchFormModel, string | number, "writable">;
1196
832
  /** Check if form is valid */
1197
833
  readonly isFormValid: _angular_core.Signal<boolean>;
1198
- ngOnInit(): void;
834
+ constructor();
1199
835
  loadBranch(id: string): Promise<void>;
836
+ private toFormModel;
1200
837
  generateSlug(): void;
1201
838
  onSubmit(): Promise<void>;
839
+ private updateBranch;
840
+ private createBranch;
841
+ private buildOptionalFields;
842
+ private onSaveSuccess;
843
+ private getTargetCompanyId;
844
+ private navigateToList;
1202
845
  onCancel(): void;
1203
846
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BranchFormComponent, never>;
1204
847
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BranchFormComponent, "lib-branch-form", never, {}, {}, never, never, true, never>;
1205
848
  }
1206
849
 
1207
- /**
1208
- * Branch List Component
1209
- * Displays a list of branches for a company with CRUD operations.
1210
- * Defaults to current company context.
1211
- */
1212
- declare class BranchListComponent implements OnInit {
850
+ declare class BranchListComponent {
851
+ readonly BRANCH_PERMISSIONS: {
852
+ readonly CREATE: "branch.create";
853
+ readonly READ: "branch.read";
854
+ readonly UPDATE: "branch.update";
855
+ readonly DELETE: "branch.delete";
856
+ };
1213
857
  private readonly router;
1214
858
  private readonly route;
1215
859
  private readonly messageService;
@@ -1217,8 +861,12 @@ declare class BranchListComponent implements OnInit {
1217
861
  private readonly branchService;
1218
862
  private readonly companyService;
1219
863
  private readonly authState;
1220
- /** Selected company ID */
1221
- selectedCompanyId: string | null;
864
+ private readonly translateAdapter;
865
+ private translate;
866
+ private readonly queryParamMap;
867
+ private initialized;
868
+ /** Selected company ID (signal for zoneless change detection) */
869
+ readonly selectedCompanyId: _angular_core.WritableSignal<string | null>;
1222
870
  /** Companies list for dropdown */
1223
871
  readonly companies: _angular_core.Signal<_flusys_ng_auth.ICompany[]>;
1224
872
  /** Branches from service */
@@ -1227,8 +875,8 @@ declare class BranchListComponent implements OnInit {
1227
875
  readonly isLoading: _angular_core.Signal<boolean>;
1228
876
  /** Total count from service */
1229
877
  readonly total: _angular_core.Signal<number>;
1230
- ngOnInit(): void;
1231
- loadBranches(): void;
878
+ constructor();
879
+ loadBranches(page?: number, pageSize?: number): void;
1232
880
  onCompanyChange(): void;
1233
881
  onLazyLoad(event: {
1234
882
  first?: number | null;
@@ -1241,72 +889,34 @@ declare class BranchListComponent implements OnInit {
1241
889
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BranchListComponent, "lib-branch-list", never, {}, {}, never, never, true, never>;
1242
890
  }
1243
891
 
1244
- /** Company form model interface */
1245
- interface ICompanyFormModel$1 {
1246
- name: string;
1247
- slug: string;
1248
- email: string;
1249
- phone: string;
1250
- website: string;
1251
- address: string;
1252
- isActive: boolean;
1253
- }
1254
- /**
1255
- * Company Form Component
1256
- * Handles creating and editing companies.
1257
- */
1258
- declare class CompanyFormComponent implements OnInit {
1259
- private readonly router;
892
+ declare class CompanyFormComponent {
1260
893
  private readonly route;
1261
- private readonly messageService;
1262
- private readonly companyService;
1263
- /** Loading state */
1264
- readonly isLoading: _angular_core.WritableSignal<boolean>;
1265
- /** Existing company data when editing */
1266
- readonly existingCompany: _angular_core.WritableSignal<ICompany | null>;
1267
- /** Whether in edit mode */
1268
- readonly isEditMode: _angular_core.Signal<boolean>;
1269
- /** Form model */
1270
- readonly formModel: _angular_core.WritableSignal<ICompanyFormModel$1>;
1271
- /** Form with validation schema */
1272
- readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel$1, string | number>;
1273
- /** Check if form is valid */
1274
- readonly isFormValid: _angular_core.Signal<boolean>;
1275
- ngOnInit(): void;
1276
- loadCompany(id: string): Promise<void>;
1277
- generateSlug(): void;
1278
- onSubmit(): Promise<void>;
1279
- onCancel(): void;
894
+ private readonly translateAdapter;
895
+ readonly companyService: CompanyApiService;
896
+ readonly formRef: _angular_core.Signal<BaseFormComponent | undefined>;
897
+ private readonly routeParams;
898
+ readonly editId: _angular_core.Signal<string | null>;
899
+ readonly fields: IFormField[];
900
+ readonly buildRequest: (data: Record<string, unknown>, editId: string | null) => unknown;
901
+ readonly toFormModel: (entity: unknown) => Record<string, unknown>;
902
+ onFormValueChange(data: Record<string, unknown>): void;
903
+ private t;
1280
904
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyFormComponent, never>;
1281
905
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyFormComponent, "lib-company-form", never, {}, {}, never, never, true, never>;
1282
906
  }
1283
907
 
1284
- /**
1285
- * Company List Component
1286
- * Displays a list of companies with CRUD operations.
1287
- * Only visible when company feature is enabled.
1288
- */
1289
- declare class CompanyListComponent implements OnInit {
908
+ declare class CompanyListComponent {
909
+ private readonly permissionValidator;
910
+ private readonly translateAdapter;
1290
911
  private readonly router;
1291
- private readonly messageService;
1292
- private readonly confirmationService;
1293
- private readonly companyService;
1294
- /** Companies from service */
1295
- readonly companies: _angular_core.Signal<ICompany[]>;
1296
- /** Loading state from service */
1297
- readonly isLoading: _angular_core.Signal<boolean>;
1298
- /** Total count from service */
1299
- readonly total: _angular_core.Signal<number>;
1300
- ngOnInit(): void;
1301
- loadCompanies(): void;
1302
- onLazyLoad(event: {
1303
- first?: number | null;
1304
- rows?: number | null;
1305
- }): void;
1306
- onCreate(): void;
1307
- onEdit(company: ICompany): void;
1308
- onViewBranches(company: ICompany): void;
1309
- onDelete(company: ICompany): void;
912
+ readonly companyService: CompanyApiService;
913
+ readonly canCreate: _angular_core.Signal<boolean>;
914
+ readonly canEditFn: (_item: unknown) => boolean;
915
+ readonly canDeleteFn: (item: unknown) => boolean;
916
+ readonly viewBranchesAction: ITableAction[];
917
+ readonly columns: ITableColumn[];
918
+ asCompany(item: unknown): ICompany;
919
+ private t;
1310
920
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyListComponent, never>;
1311
921
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyListComponent, "lib-company-list", never, {}, {}, never, never, true, never>;
1312
922
  }
@@ -1318,72 +928,66 @@ declare class ForgotPasswordPageComponent {
1318
928
  private readonly destroyRef;
1319
929
  private readonly messageService;
1320
930
  private readonly authApi;
931
+ private readonly translateAdapter;
932
+ private translate;
1321
933
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1322
934
  readonly emailSent: _angular_core.WritableSignal<boolean>;
1323
935
  readonly submittedEmail: _angular_core.WritableSignal<string>;
1324
936
  readonly formModel: _angular_core.WritableSignal<IForgotPasswordFormModel>;
1325
- readonly forgotForm: _angular_forms_signals.FieldTree<IForgotPasswordFormModel, string | number>;
937
+ readonly forgotForm: _angular_forms_signals.FieldTree<IForgotPasswordFormModel, string | number, "writable">;
1326
938
  readonly isFormValid: _angular_core.Signal<boolean>;
1327
939
  onSubmit(): void;
940
+ private showEmailSent;
1328
941
  resetForm(): void;
1329
942
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForgotPasswordPageComponent, never>;
1330
943
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ForgotPasswordPageComponent, "lib-forgot-password-page", never, {}, {}, never, never, true, never>;
1331
944
  }
1332
945
 
1333
- /** Login form model interface */
1334
946
  interface ILoginFormModel {
1335
947
  email: string;
1336
948
  password: string;
1337
949
  rememberMe: boolean;
1338
950
  }
1339
- /** Company selection form model interface */
1340
951
  interface ISelectionFormModel {
1341
952
  companyId: string;
1342
953
  branchId: string;
1343
954
  rememberSelection: boolean;
1344
955
  }
1345
956
  type LoginStep = 'credentials' | 'company-selection' | 'email-verification';
1346
- /**
1347
- * Login Page Component
1348
- * Multi-step authentication flow:
1349
- * - Step 1: Email/Password credentials
1350
- * - Step 2: Company/Branch selection (when company feature enabled and user has multiple)
1351
- */
1352
- declare class LoginPageComponent implements OnInit {
957
+ declare class LoginPageComponent {
1353
958
  private readonly destroyRef;
1354
959
  private readonly appConfig;
1355
960
  private readonly messageService;
1356
961
  private readonly authApi;
1357
962
  private readonly authState;
963
+ private readonly translateAdapter;
964
+ private readonly validationConfig;
965
+ private translate;
1358
966
  readonly returnUrl: _angular_core.InputSignal<string>;
1359
967
  readonly currentStep: _angular_core.WritableSignal<LoginStep>;
1360
968
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1361
969
  readonly unverifiedEmail: _angular_core.WritableSignal<string>;
1362
- /** Login form model */
1363
970
  readonly loginFormModel: _angular_core.WritableSignal<ILoginFormModel>;
1364
- /** Login form with validation schema */
1365
- readonly loginForm: _angular_forms_signals.FieldTree<ILoginFormModel, string | number>;
1366
- /** Check if login form is valid */
971
+ private readonly emailErrorMessage;
972
+ private readonly passwordMinLength;
973
+ private readonly passwordErrorMessage;
974
+ readonly loginForm: _angular_forms_signals.FieldTree<ILoginFormModel, string | number, "writable">;
975
+ readonly emailValidationError: _angular_core.Signal<string | null>;
976
+ readonly passwordValidationError: _angular_core.Signal<string | null>;
1367
977
  readonly isLoginFormValid: _angular_core.Signal<boolean>;
1368
- /** Selection form model */
1369
978
  readonly selectionFormModel: _angular_core.WritableSignal<ISelectionFormModel>;
1370
- /** Selection form with validation schema */
1371
- readonly selectionForm: _angular_forms_signals.FieldTree<ISelectionFormModel, string | number>;
1372
- /** Check if selection form is valid */
979
+ readonly selectionForm: _angular_forms_signals.FieldTree<ISelectionFormModel, string | number, "writable">;
1373
980
  readonly isSelectionFormValid: _angular_core.Signal<boolean>;
1374
- /** Whether company feature is enabled */
1375
981
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1376
- /** Session ID for company selection */
982
+ readonly emailFeatureEnabled: _angular_core.Signal<boolean>;
983
+ readonly signUpEnabled: _angular_core.Signal<boolean>;
1377
984
  private sessionId;
1378
- /** Available companies */
1379
985
  readonly companies: _angular_core.WritableSignal<ICompanyWithBranches[]>;
1380
- /** User's name */
1381
986
  readonly userName: _angular_core.WritableSignal<string>;
1382
- /** Branches for selected company */
1383
987
  readonly branches: _angular_core.Signal<IBranchSelectionInfo[]>;
1384
- ngOnInit(): void;
988
+ constructor();
989
+ private restorePendingSelectionState;
1385
990
  onSubmit(): void;
1386
- /** Handle company selection change */
1387
991
  onCompanyChange(): void;
1388
992
  onSelectCompany(): void;
1389
993
  goBackToCredentials(): void;
@@ -1393,32 +997,16 @@ declare class LoginPageComponent implements OnInit {
1393
997
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoginPageComponent, "lib-login-page", never, { "returnUrl": { "alias": "returnUrl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1394
998
  }
1395
999
 
1396
- /** Profile form model */
1397
1000
  interface IProfileFormModel {
1398
1001
  name: string;
1399
1002
  phone: string;
1400
1003
  }
1401
- /** Password form model */
1402
1004
  interface IPasswordFormModel {
1403
1005
  currentPassword: string;
1404
1006
  newPassword: string;
1405
1007
  confirmPassword: string;
1406
1008
  }
1407
- /**
1408
- * Profile Page Component
1409
- *
1410
- * Allows users to view and update their profile information.
1411
- * Features:
1412
- * - Update name, phone, profile picture (if storage enabled)
1413
- * - View company/branch info (read-only, if company feature enabled)
1414
- * - View roles/actions (read-only, if IAM enabled via optional injection)
1415
- *
1416
- * Package Independence:
1417
- * - Uses PROFILE_UPLOAD_PROVIDER (optional) for storage functionality
1418
- * - Uses PROFILE_PERMISSION_PROVIDER (optional) for IAM functionality
1419
- * - No direct imports from ng-storage or ng-iam
1420
- */
1421
- declare class ProfilePageComponent implements OnInit {
1009
+ declare class ProfilePageComponent {
1422
1010
  private readonly destroyRef;
1423
1011
  private readonly appConfig;
1424
1012
  private readonly messageService;
@@ -1426,16 +1014,30 @@ declare class ProfilePageComponent implements OnInit {
1426
1014
  private readonly userService;
1427
1015
  private readonly authApiService;
1428
1016
  private readonly fileUrlService;
1429
- private readonly uploadProvider;
1017
+ private readonly fileProvider;
1430
1018
  private readonly permissionProvider;
1019
+ private readonly profileExtension;
1020
+ private readonly userFormExtension;
1021
+ private readonly translateAdapter;
1022
+ private translate;
1431
1023
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1432
1024
  readonly isLoadingPermissions: _angular_core.WritableSignal<boolean>;
1025
+ readonly isLoadingExtraFields: _angular_core.WritableSignal<boolean>;
1433
1026
  private readonly _profilePictureUrl;
1434
1027
  readonly profilePictureUrl: _angular_core.Signal<string | null>;
1435
1028
  private readonly _userRoles;
1436
1029
  readonly userRoles: _angular_core.Signal<IProfileRoleInfo[]>;
1437
1030
  private readonly _userActions;
1438
1031
  readonly userActions: _angular_core.Signal<IProfileActionInfo[]>;
1032
+ readonly extraSections: _angular_core.Signal<IProfileExtraSection[]>;
1033
+ readonly editableFields: _angular_core.Signal<IProfileExtraField[]>;
1034
+ readonly viewOnlyFields: _angular_core.Signal<IUserFormExtraField[]>;
1035
+ readonly hasExtraContent: _angular_core.Signal<boolean>;
1036
+ readonly extraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
1037
+ readonly originalExtraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
1038
+ readonly adminFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
1039
+ readonly isExtraFieldsDirty: _angular_core.Signal<boolean>;
1040
+ readonly extraFieldsValidationError: _angular_core.Signal<string | null>;
1439
1041
  readonly userEmail: _angular_core.Signal<string>;
1440
1042
  readonly userName: _angular_core.Signal<string>;
1441
1043
  readonly userInitials: _angular_core.Signal<string>;
@@ -1448,19 +1050,34 @@ declare class ProfilePageComponent implements OnInit {
1448
1050
  readonly showRoles: _angular_core.Signal<boolean>;
1449
1051
  readonly showActions: _angular_core.Signal<boolean>;
1450
1052
  readonly showBottomRow: _angular_core.Signal<boolean>;
1053
+ private readonly originalFormModel;
1451
1054
  readonly formModel: _angular_core.WritableSignal<IProfileFormModel>;
1452
- readonly formTree: _angular_forms_signals.FieldTree<IProfileFormModel, string | number>;
1055
+ readonly formTree: _angular_forms_signals.FieldTree<IProfileFormModel, string | number, "writable">;
1453
1056
  readonly isFormValid: _angular_core.Signal<boolean>;
1057
+ readonly isFormDirty: _angular_core.Signal<boolean>;
1058
+ updateExtraField(key: string, value: unknown): void;
1059
+ getExtraFieldValue(key: string): unknown;
1060
+ getAdminFieldValue(key: string): unknown;
1061
+ getSelectLabel(field: IProfileExtraField | IUserFormExtraField, value: unknown): string;
1062
+ getFieldTemplateContext(field: IProfileExtraField): IProfileFieldTemplateContext;
1063
+ private readonly parentInjector;
1064
+ getFieldInjector(field: IProfileExtraField): Injector;
1454
1065
  readonly passwordModel: _angular_core.WritableSignal<IPasswordFormModel>;
1066
+ readonly visiblePasswords: _angular_core.WritableSignal<Record<keyof IPasswordFormModel, boolean>>;
1455
1067
  readonly isPasswordLoading: _angular_core.WritableSignal<boolean>;
1456
1068
  readonly isPasswordFormValid: _angular_core.Signal<boolean>;
1457
1069
  readonly passwordsMatch: _angular_core.Signal<boolean>;
1458
- readonly uploadFileFn: UploadFileFn;
1459
- /** Map upload result to IUploadedFile format */
1460
- private mapUploadResultToUploadedFile;
1461
- ngOnInit(): void;
1070
+ readonly profileUploadOptions: {
1071
+ folderPath: string;
1072
+ compress: boolean;
1073
+ maxWidth: number;
1074
+ maxHeight: number;
1075
+ isPrivate: boolean;
1076
+ };
1077
+ constructor();
1462
1078
  private loadUserData;
1463
1079
  private loadPermissions;
1080
+ private loadExtraFields;
1464
1081
  onProfilePictureUploaded(file: {
1465
1082
  id?: string;
1466
1083
  name: string;
@@ -1469,6 +1086,7 @@ declare class ProfilePageComponent implements OnInit {
1469
1086
  contentType: string;
1470
1087
  }): void;
1471
1088
  onSubmit(): void;
1089
+ togglePasswordVisibility(field: keyof IPasswordFormModel): void;
1472
1090
  updatePasswordField(field: keyof IPasswordFormModel, value: string): void;
1473
1091
  onChangePassword(): void;
1474
1092
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProfilePageComponent, never>;
@@ -1490,7 +1108,7 @@ interface ICompanyFormModel {
1490
1108
  newCompanyPhone: string;
1491
1109
  newCompanyAddress: string;
1492
1110
  }
1493
- declare class RegisterPageComponent implements OnInit {
1111
+ declare class RegisterPageComponent {
1494
1112
  private readonly destroyRef;
1495
1113
  private readonly appConfig;
1496
1114
  private readonly messageService;
@@ -1498,16 +1116,39 @@ declare class RegisterPageComponent implements OnInit {
1498
1116
  private readonly authState;
1499
1117
  private readonly route;
1500
1118
  private readonly router;
1119
+ private readonly validationConfig;
1120
+ private readonly registrationExtension;
1121
+ private readonly translateAdapter;
1122
+ private translate;
1123
+ private readonly queryParamMap;
1124
+ private companySlugInitialized;
1501
1125
  readonly returnUrl: _angular_core.InputSignal<string>;
1502
1126
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1503
1127
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1128
+ readonly defaultCompanySlug: _angular_core.Signal<string | undefined>;
1129
+ readonly defaultBranchSlug: _angular_core.Signal<string | undefined>;
1130
+ readonly hasDefaultCompany: _angular_core.Signal<boolean>;
1131
+ readonly hasDefaultBranch: _angular_core.Signal<boolean>;
1132
+ readonly extraFields: _angular_core.Signal<IRegistrationExtraField[]>;
1133
+ readonly extraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
1134
+ private readonly emailErrorMessage;
1135
+ readonly passwordMinLength: _angular_core.Signal<number>;
1136
+ private readonly passwordErrorMessage;
1504
1137
  readonly userFormModel: _angular_core.WritableSignal<IUserFormModel$1>;
1505
- readonly userForm: _angular_forms_signals.FieldTree<IUserFormModel$1, string | number>;
1138
+ readonly userForm: _angular_forms_signals.FieldTree<IUserFormModel$1, string | number, "writable">;
1506
1139
  readonly companyFormModel: _angular_core.WritableSignal<ICompanyFormModel>;
1507
- readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel, string | number>;
1140
+ readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel, string | number, "writable">;
1141
+ readonly emailValidationError: _angular_core.Signal<string | null>;
1142
+ readonly passwordValidationError: _angular_core.Signal<string | null>;
1143
+ readonly extraFieldsValidationError: _angular_core.Signal<string | null>;
1508
1144
  readonly passwordsMatch: _angular_core.Signal<boolean>;
1509
1145
  readonly isFormValid: _angular_core.Signal<boolean>;
1510
- ngOnInit(): void;
1146
+ private validateRequiredExtraFields;
1147
+ updateExtraField(key: string, value: unknown): void;
1148
+ getFieldTemplateContext(field: IRegistrationExtraField): IRegistrationFieldTemplateContext;
1149
+ private readonly parentInjector;
1150
+ getFieldInjector(field: IRegistrationExtraField): Injector;
1151
+ constructor();
1511
1152
  onCreateCompanyToggle(): void;
1512
1153
  onSubmit(): void;
1513
1154
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RegisterPageComponent, never>;
@@ -1519,25 +1160,28 @@ interface IResetPasswordFormModel {
1519
1160
  confirmPassword: string;
1520
1161
  }
1521
1162
  type PageState$1 = 'form' | 'success' | 'invalid-token';
1522
- declare class ResetPasswordPageComponent implements OnInit {
1163
+ declare class ResetPasswordPageComponent {
1523
1164
  private readonly destroyRef;
1524
1165
  private readonly route;
1525
1166
  private readonly messageService;
1526
1167
  private readonly authApi;
1168
+ private readonly translateAdapter;
1169
+ private translate;
1170
+ private readonly queryParams;
1171
+ private tokenInitialized;
1527
1172
  private token;
1528
1173
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1529
1174
  readonly pageState: _angular_core.WritableSignal<PageState$1>;
1530
1175
  readonly formModel: _angular_core.WritableSignal<IResetPasswordFormModel>;
1531
- readonly resetForm: _angular_forms_signals.FieldTree<IResetPasswordFormModel, string | number>;
1176
+ readonly resetForm: _angular_forms_signals.FieldTree<IResetPasswordFormModel, string | number, "writable">;
1532
1177
  readonly passwordMismatch: _angular_core.Signal<boolean>;
1533
1178
  readonly canSubmit: _angular_core.Signal<boolean>;
1534
- ngOnInit(): void;
1179
+ constructor();
1535
1180
  onSubmit(): void;
1536
1181
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ResetPasswordPageComponent, never>;
1537
1182
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResetPasswordPageComponent, "lib-reset-password-page", never, {}, {}, never, never, true, never>;
1538
1183
  }
1539
1184
 
1540
- /** User form model interface */
1541
1185
  interface IUserFormModel {
1542
1186
  name: string;
1543
1187
  email: string;
@@ -1546,12 +1190,7 @@ interface IUserFormModel {
1546
1190
  isActive: boolean;
1547
1191
  emailVerified: boolean;
1548
1192
  }
1549
- /**
1550
- * User Form Component
1551
- * Handles creating and editing users.
1552
- * When company feature is enabled, automatically assigns new users to current company/branch.
1553
- */
1554
- declare class UserFormComponent implements OnInit {
1193
+ declare class UserFormComponent {
1555
1194
  private readonly destroyRef;
1556
1195
  private readonly router;
1557
1196
  private readonly route;
@@ -1560,60 +1199,81 @@ declare class UserFormComponent implements OnInit {
1560
1199
  private readonly userService;
1561
1200
  private readonly permissionService;
1562
1201
  private readonly authState;
1563
- /** Loading state */
1202
+ private readonly translateAdapter;
1203
+ private readonly userFormExtension;
1204
+ private readonly parentInjector;
1205
+ private translate;
1206
+ private readonly routeParams;
1207
+ private userLoadTriggered;
1564
1208
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1565
- /** Existing user data when editing */
1566
1209
  readonly existingUser: _angular_core.WritableSignal<IUser | null>;
1567
- /** Whether in edit mode */
1568
1210
  readonly isEditMode: _angular_core.Signal<boolean>;
1569
- /** Whether company feature is enabled */
1570
1211
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1571
- /** Current company name */
1572
1212
  readonly currentCompanyName: _angular_core.Signal<string>;
1573
- /** Current branch name */
1574
1213
  readonly currentBranchName: _angular_core.Signal<string>;
1575
- /** Form model */
1576
1214
  readonly formModel: _angular_core.WritableSignal<IUserFormModel>;
1577
- /** Form with validation schema */
1578
- readonly formTree: _angular_forms_signals.FieldTree<IUserFormModel, string | number>;
1579
- /** Check if form is valid */
1215
+ readonly formTree: _angular_forms_signals.FieldTree<IUserFormModel, string | number, "writable">;
1216
+ readonly isLoadingExtraFields: _angular_core.WritableSignal<boolean>;
1217
+ readonly extraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
1218
+ readonly originalExtraFieldsModel: _angular_core.WritableSignal<Record<string, unknown>>;
1219
+ readonly extraFields: _angular_core.Signal<IUserFormExtraField[]>;
1220
+ readonly hasExtraFields: _angular_core.Signal<boolean>;
1221
+ readonly extraFieldsValidationError: _angular_core.Signal<string | null>;
1222
+ readonly isExtraFieldsDirty: _angular_core.Signal<boolean>;
1223
+ updateExtraField(key: string, value: unknown): void;
1224
+ getExtraFieldValue(key: string): unknown;
1225
+ getFieldTemplateContext(field: IUserFormExtraField): IUserFormFieldTemplateContext;
1226
+ getFieldInjector(field: IUserFormExtraField): Injector;
1580
1227
  readonly isFormValid: _angular_core.Signal<boolean>;
1581
- ngOnInit(): void;
1582
- loadUser(id: string): void;
1228
+ constructor();
1229
+ loadUser(id: string): Promise<void>;
1230
+ private loadExtraFields;
1231
+ private toFormModel;
1583
1232
  onSubmit(): void;
1584
- /**
1585
- * Assign user to current company and branch
1586
- */
1233
+ private updateUser;
1234
+ private createUser;
1235
+ private saveExtraFieldsForNewUser;
1236
+ private onSaveSuccess;
1587
1237
  private assignUserToCompanyAndBranch;
1588
1238
  onCancel(): void;
1589
1239
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserFormComponent, never>;
1590
1240
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserFormComponent, "lib-user-form", never, {}, {}, never, never, true, never>;
1591
1241
  }
1592
1242
 
1593
- /**
1594
- * User List Component
1595
- * Displays a list of users with CRUD operations.
1596
- */
1597
- declare class UserListComponent implements OnInit {
1243
+ declare class UserListComponent {
1244
+ readonly USER_PERMISSIONS: {
1245
+ readonly CREATE: "user.create";
1246
+ readonly READ: "user.read";
1247
+ readonly UPDATE: "user.update";
1248
+ readonly DELETE: "user.delete";
1249
+ };
1598
1250
  private readonly router;
1599
1251
  private readonly appConfig;
1600
1252
  private readonly messageService;
1601
1253
  private readonly confirmationService;
1602
1254
  private readonly userService;
1603
- /** Users from service */
1255
+ private readonly userListExtension;
1256
+ readonly userDetailConfig: _flusys_ng_auth.IUserDetailViewConfig | null;
1257
+ private readonly translateAdapter;
1258
+ private translate;
1604
1259
  readonly users: _angular_core.Signal<IUser[]>;
1605
- /** Loading state from service */
1606
1260
  readonly isLoading: _angular_core.Signal<boolean>;
1607
- /** Total count from service */
1608
1261
  readonly total: _angular_core.Signal<number>;
1609
- /** Whether company feature is enabled */
1610
1262
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1611
- /** Dialog visibility */
1263
+ readonly extraColumns: _angular_core.Signal<IUserListExtraColumn[]>;
1264
+ readonly extraActions: _angular_core.Signal<IUserListExtraAction[]>;
1265
+ readonly hasUserDetailView: _angular_core.Signal<boolean>;
1266
+ readonly tableColspan: _angular_core.Signal<number>;
1612
1267
  readonly showCompanyDialog: _angular_core.WritableSignal<boolean>;
1613
1268
  readonly showBranchDialog: _angular_core.WritableSignal<boolean>;
1614
- /** Selected user for permission management */
1269
+ readonly showUserDetailDialog: _angular_core.WritableSignal<boolean>;
1615
1270
  readonly selectedUser: _angular_core.WritableSignal<IUser | null>;
1616
- ngOnInit(): void;
1271
+ getFieldValue(user: IUser, field: string): unknown;
1272
+ isActionVisible(action: IUserListExtraAction, user: IUser): boolean;
1273
+ isActionDisabled(action: IUserListExtraAction, user: IUser): boolean;
1274
+ onExtraAction(action: IUserListExtraAction, user: IUser): void;
1275
+ onViewDetails(user: IUser): void;
1276
+ closeUserDetailDialog(): void;
1617
1277
  loadUsers(): void;
1618
1278
  onLazyLoad(event: {
1619
1279
  first?: number | null;
@@ -1623,6 +1283,7 @@ declare class UserListComponent implements OnInit {
1623
1283
  onEdit(user: IUser): void;
1624
1284
  onManageCompanyPermissions(user: IUser): void;
1625
1285
  onManageBranchPermissions(user: IUser): void;
1286
+ private openPermissionDialog;
1626
1287
  onDelete(user: IUser): void;
1627
1288
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserListComponent, never>;
1628
1289
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserListComponent, "lib-user-list", never, {}, {}, never, never, true, never>;
@@ -1632,21 +1293,25 @@ interface IResendFormModel {
1632
1293
  email: string;
1633
1294
  }
1634
1295
  type PageState = 'verifying' | 'success' | 'invalid-token' | 'resend';
1635
- declare class VerifyEmailPageComponent implements OnInit {
1296
+ declare class VerifyEmailPageComponent {
1636
1297
  private readonly platformId;
1637
1298
  private readonly transferState;
1638
1299
  private readonly destroyRef;
1639
1300
  private readonly route;
1640
1301
  private readonly messageService;
1641
1302
  private readonly authApi;
1303
+ private readonly translateAdapter;
1304
+ private translate;
1305
+ private readonly queryParams;
1306
+ private verificationTriggered;
1642
1307
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1643
1308
  readonly pageState: _angular_core.WritableSignal<PageState>;
1644
1309
  readonly resendSuccess: _angular_core.WritableSignal<boolean>;
1645
1310
  readonly submittedEmail: _angular_core.WritableSignal<string>;
1646
1311
  readonly resendFormModel: _angular_core.WritableSignal<IResendFormModel>;
1647
- readonly resendForm: _angular_forms_signals.FieldTree<IResendFormModel, string | number>;
1312
+ readonly resendForm: _angular_forms_signals.FieldTree<IResendFormModel, string | number, "writable">;
1648
1313
  readonly isResendFormValid: _angular_core.Signal<boolean>;
1649
- ngOnInit(): void;
1314
+ constructor();
1650
1315
  private verifyEmail;
1651
1316
  private handleVerificationResult;
1652
1317
  showResendForm(): void;
@@ -1656,89 +1321,66 @@ declare class VerifyEmailPageComponent implements OnInit {
1656
1321
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<VerifyEmailPageComponent, "lib-verify-email-page", never, {}, {}, never, never, true, never>;
1657
1322
  }
1658
1323
 
1659
- /**
1660
- * User Branch Permission Dialog
1661
- *
1662
- * Workflow:
1663
- * 1. Dialog opens → Shows company dropdown with user's permitted companies
1664
- * 2. User selects a company → Branches load for that company
1665
- * 3. Branches show with checkboxes (checked = already assigned)
1666
- * 4. Check to assign, uncheck to revoke
1667
- *
1668
- * Company dropdown only shows companies the user has company-level permissions for.
1669
- * Branch permissions can only be assigned within user's permitted companies.
1670
- */
1324
+ interface BranchWithAssignment extends IBranch {
1325
+ isAssigned: boolean;
1326
+ }
1671
1327
  declare class UserBranchPermissionDialogComponent {
1672
1328
  private readonly branchApi;
1673
1329
  private readonly permissionApi;
1674
- private readonly authState;
1675
1330
  private readonly messageService;
1676
- /** Dialog visibility */
1331
+ private readonly translateAdapter;
1332
+ private t;
1677
1333
  readonly visible: _angular_core.InputSignal<boolean>;
1678
- /** User to manage permissions for */
1679
1334
  readonly user: _angular_core.InputSignal<IUser | null>;
1680
- /** Close event */
1681
1335
  readonly closed: _angular_core.OutputEmitterRef<void>;
1682
- /** Refresh event after changes */
1683
1336
  readonly permissionsChanged: _angular_core.OutputEmitterRef<void>;
1684
- /** Loading state */
1685
- readonly isLoading: _angular_core.WritableSignal<boolean>;
1686
- /** Saving state */
1687
1337
  readonly isSaving: _angular_core.WritableSignal<boolean>;
1688
- /** Branches with assignment status */
1689
- readonly branches: _angular_core.WritableSignal<BranchWithAssignment[]>;
1690
- /** Available companies (filtered by user's company permissions) */
1691
- readonly companies: _angular_core.WritableSignal<{
1338
+ readonly selectedCompanyId: _angular_core.WritableSignal<string | null>;
1339
+ readonly companiesResource: _angular_core.ResourceRef<{
1692
1340
  id: string;
1693
1341
  name: string;
1694
- }[]>;
1695
- /** Selected company ID */
1696
- selectedCompanyId: string | null;
1697
- /** Current company from auth state */
1698
- readonly currentCompany: _angular_core.Signal<_flusys_ng_auth.ICompanyInfo | null>;
1699
- /** Currently assigned branch IDs */
1700
- private assignedBranchIds;
1701
- constructor();
1702
- /**
1703
- * Load user's assigned companies (does not auto-select or load branches)
1704
- */
1705
- private loadUserCompaniesAndData;
1706
- private loadData;
1707
- onCompanyChange(): void;
1708
- onBranchToggle(branch: BranchWithAssignment): Promise<void>;
1342
+ }[] | undefined>;
1343
+ readonly branchesResource: _angular_core.ResourceRef<{
1344
+ isAssigned: boolean;
1345
+ id: string;
1346
+ name: string;
1347
+ slug: string;
1348
+ companyId: string;
1349
+ parentId?: string | null;
1350
+ logoId?: string | null;
1351
+ address?: string | null;
1352
+ phone?: string | null;
1353
+ email?: string | null;
1354
+ serial?: number;
1355
+ isActive: boolean;
1356
+ readOnly: boolean;
1357
+ additionalFields?: Record<string, unknown> | null;
1358
+ createdAt: Date | string;
1359
+ updatedAt: Date | string;
1360
+ }[] | undefined>;
1361
+ readonly isInitialLoading: _angular_core.Signal<boolean>;
1362
+ onBranchToggle(branch: BranchWithAssignment, isAssigned: boolean): Promise<void>;
1709
1363
  onClose(): void;
1710
1364
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserBranchPermissionDialogComponent, never>;
1711
1365
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserBranchPermissionDialogComponent, "lib-user-branch-permission-dialog", never, { "visible": { "alias": "visible"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; }, { "closed": "closed"; "permissionsChanged": "permissionsChanged"; }, never, never, true, never>;
1712
1366
  }
1713
- interface BranchWithAssignment extends IBranch {
1367
+
1368
+ interface CompanyWithAssignment extends ICompany {
1714
1369
  isAssigned: boolean;
1715
1370
  }
1716
-
1717
- /**
1718
- * User Company Permission Dialog
1719
- * Shows all companies with checkboxes
1720
- * Initially assigned companies are checked
1721
- * Check to assign, uncheck to revoke
1722
- */
1723
1371
  declare class UserCompanyPermissionDialogComponent {
1724
1372
  private readonly companyApi;
1725
1373
  private readonly permissionApi;
1726
1374
  private readonly messageService;
1727
- /** Dialog visibility */
1375
+ private readonly translateAdapter;
1376
+ private t;
1728
1377
  readonly visible: _angular_core.InputSignal<boolean>;
1729
- /** User to manage permissions for */
1730
1378
  readonly user: _angular_core.InputSignal<IUser | null>;
1731
- /** Close event */
1732
1379
  readonly closed: _angular_core.OutputEmitterRef<void>;
1733
- /** Refresh event after changes */
1734
1380
  readonly permissionsChanged: _angular_core.OutputEmitterRef<void>;
1735
- /** Loading state */
1736
1381
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1737
- /** Saving state */
1738
1382
  readonly isSaving: _angular_core.WritableSignal<boolean>;
1739
- /** Companies with assignment status */
1740
1383
  readonly companies: _angular_core.WritableSignal<CompanyWithAssignment[]>;
1741
- /** Currently assigned company IDs */
1742
1384
  private assignedCompanyIds;
1743
1385
  constructor();
1744
1386
  private loadData;
@@ -1747,9 +1389,6 @@ declare class UserCompanyPermissionDialogComponent {
1747
1389
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserCompanyPermissionDialogComponent, never>;
1748
1390
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserCompanyPermissionDialogComponent, "lib-user-company-permission-dialog", never, { "visible": { "alias": "visible"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; }, { "closed": "closed"; "permissionsChanged": "permissionsChanged"; }, never, never, true, never>;
1749
1391
  }
1750
- interface CompanyWithAssignment extends ICompany {
1751
- isAssigned: boolean;
1752
- }
1753
1392
 
1754
- export { ADMINISTRATION_ROUTES, AUTH_ENDPOINTS, AUTH_ROUTES, AdministrationPageComponent, AuthApiService, AuthCompanyApiProviderAdapter, AuthInitService, AuthLayoutApiAdapter, AuthLayoutStateAdapter, AuthStateService, AuthUserPermissionProviderAdapter, AuthUserProviderAdapter, BranchApiService, BranchFormComponent, BranchListComponent, CompanyApiService, CompanyFormComponent, CompanyListComponent, ForgotPasswordPageComponent, LoginPageComponent, PROFILE_ROUTES, ProfilePageComponent, RegisterPageComponent, ResetPasswordPageComponent, TokenRefreshStateService, UserApiService, UserBranchPermissionDialogComponent, UserCompanyPermissionDialogComponent, UserFormComponent, UserListComponent, UserPermissionApiService, VerifyEmailPageComponent, authGuard, authInterceptor, companyFeatureGuard, guestGuard, isAuthEndpoint, isCompanySelectionResponse, isEmailVerificationRequired, isEndpoint, isLoginResponse, provideAuthLayoutIntegration, provideAuthProviders, tokenRefreshInterceptor };
1755
- export type { AuthResponse, IAssignUserBranchRequest, IAssignUserCompanyRequest, IBatchOperationResponse, IBranch, IBranchInfo, IBranchSelectionInfo, IChangePasswordRequest, ICompany, ICompanyInfo, ICompanySelectionResponse, ICompanyWithBranches, ICreateBranchRequest, ICreateCompanyRequest, ICreateUserRequest, ILoginRequest, ILoginRequiresEmailVerification, ILoginResponse, IMeResponse, IPermissionItem, IRefreshTokenResponse, IRegistrationRequest, IRegistrationResponse, ISelectRequest, ISwitchCompanyRequest, IUpdateBranchRequest, IUpdateCompanyRequest, IUpdateUserRequest, IUser, IUserBranchPermission, IUserBranchesResponse, IUserCompaniesResponse, IUserCompanyPermission, IUserInfo };
1393
+ export { ADMINISTRATION_ROUTES, AUTH_ENDPOINTS, AUTH_MESSAGES, AUTH_PROFILE_EXTENSION, AUTH_REGISTRATION_EXTENSION, AUTH_ROUTES, AUTH_USER_DETAIL_CONFIG, AUTH_USER_FORM_EXTENSION, AUTH_USER_LIST_EXTENSION, AUTH_VALIDATION_CONFIG, AdministrationPageComponent, AuthApiService, AuthCompanyApiProviderAdapter, AuthInitService, AuthLayoutApiAdapter, AuthLayoutStateAdapter, AuthStateProviderAdapter, AuthStateService, AuthUserPermissionProviderAdapter, AuthUserProviderAdapter, BranchApiService, BranchFormComponent, BranchListComponent, CompanyApiService, CompanyFormComponent, CompanyListComponent, ForgotPasswordPageComponent, LoginPageComponent, PROFILE_FIELD_CONTEXT, PROFILE_ROUTES, ProfilePageComponent, REGISTRATION_FIELD_CONTEXT, RegisterPageComponent, ResetPasswordPageComponent, TokenRefreshStateService, USER_FORM_FIELD_CONTEXT, UserApiService, UserBranchPermissionDialogComponent, UserCompanyPermissionDialogComponent, UserFormComponent, UserListComponent, UserPermissionApiService, VerifyEmailPageComponent, authGuard, authInterceptor, companyFeatureGuard, emailFeatureGuard, guestGuard, isCompanySelectionResponse, isEmailVerificationRequired, isEndpoint, isLoginResponse, provideAuthLayoutIntegration, provideAuthProviders, signUpFeatureGuard, tokenRefreshInterceptor, validateEmail, validatePassword };
1394
+ export type { AuthResponse, IAssignUserBranchRequest, IAssignUserCompanyRequest, IAuthValidationConfig, IBranch, IBranchInfo, IBranchSelectionInfo, IChangePasswordRequest, ICompany, ICompanyInfo, ICompanySelectionData, ICompanySelectionResponse, ICompanyWithBranches, ICreateBranchRequest, ICreateCompanyRequest, ICreateUserRequest, IEmailValidationConfig, IEmailVerificationData, ILoginData, ILoginRequest, ILoginRequiresEmailVerification, ILoginResponse, IMeData, IMeResponse, IPasswordValidationConfig, IPermissionItem, IProfileExtensionProvider, IProfileExtraField, IProfileExtraSection, IProfileFieldTemplateContext, IRefreshTokenResponse, IRegistrationData, IRegistrationExtensionProvider, IRegistrationExtraField, IRegistrationFieldTemplateContext, IRegistrationRequest, IRegistrationResponse, ISelectRequest, ISwitchCompanyRequest, IUpdateBranchRequest, IUpdateCompanyRequest, IUpdateUserRequest, IUser, IUserBranchPermission, IUserCompanyPermission, IUserDetailViewConfig, IUserFormExtensionProvider, IUserFormExtraField, IUserFormFieldTemplateContext, IUserInfo, IUserListExtensionProvider, IUserListExtraAction, IUserListExtraColumn, UserDetailViewMode };