@flusys/ng-auth 1.1.0 → 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,8 +1,8 @@
1
- import { IMessageResponse, ApiResourceService, ISingleResponse, ICompanyApiProvider, IListResponse, ICompanyBasicInfo, IAuthStateProvider, IUserPermissionProvider, IUserProvider, IUserBasicInfo, 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 } from '@angular/core';
5
+ import { Signal, Provider, InjectionToken, Type, TemplateRef, Injector } from '@angular/core';
6
6
  import { CanActivateFn, Routes } from '@angular/router';
7
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';
@@ -24,6 +24,7 @@ interface IRegistrationRequest {
24
24
  newCompanyName?: string;
25
25
  newCompanyPhone?: string;
26
26
  newCompanyAddress?: string;
27
+ additionalFields?: Record<string, unknown>;
27
28
  }
28
29
  interface ISelectRequest {
29
30
  sessionId: string;
@@ -74,19 +75,19 @@ interface ICompanyWithBranches {
74
75
  logoId?: string | null;
75
76
  branches: IBranchSelectionInfo[];
76
77
  }
77
- interface ILoginResponse {
78
+ interface ILoginData {
78
79
  accessToken: string;
79
- refreshToken: string;
80
+ refreshToken?: string;
80
81
  user: IUserInfo;
81
82
  company?: ICompanyInfo;
82
83
  branch?: IBranchInfo;
83
84
  }
84
- interface IMeResponse {
85
+ interface IMeData {
85
86
  user: IUserInfo;
86
87
  company?: ICompanyInfo;
87
88
  branch?: IBranchInfo;
88
89
  }
89
- interface IRegistrationResponse {
90
+ interface IRegistrationData {
90
91
  accessToken?: string;
91
92
  refreshToken?: string;
92
93
  user: IUserInfo;
@@ -94,23 +95,27 @@ interface IRegistrationResponse {
94
95
  branch?: IBranchInfo;
95
96
  requiresEmailVerification?: boolean;
96
97
  }
97
- interface ICompanySelectionResponse {
98
+ interface ICompanySelectionData {
98
99
  requiresSelection: true;
99
100
  sessionId: string;
100
101
  expiresAt: Date | string;
101
102
  user: IUserInfo;
102
103
  companies: ICompanyWithBranches[];
103
104
  }
104
- interface IRefreshTokenResponse {
105
- accessToken: string;
106
- refreshToken?: string;
107
- }
108
- interface ILoginRequiresEmailVerification {
105
+ interface IEmailVerificationData {
109
106
  requiresEmailVerification: true;
110
107
  email: string;
111
- message: string;
112
108
  }
113
- type AuthResponse = ILoginResponse | ICompanySelectionResponse | ILoginRequiresEmailVerification;
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>;
114
119
  declare function isEmailVerificationRequired(response: AuthResponse): response is ILoginRequiresEmailVerification;
115
120
  declare function isCompanySelectionResponse(response: AuthResponse): response is ICompanySelectionResponse;
116
121
  declare function isLoginResponse(response: AuthResponse): response is ILoginResponse;
@@ -210,20 +215,6 @@ interface IUserBranchPermission {
210
215
  branchSlug: string;
211
216
  companyId: string;
212
217
  }
213
- interface IUserCompaniesResponse {
214
- success: boolean;
215
- message: string;
216
- data: IUserCompanyPermission[];
217
- }
218
- interface IUserBranchesResponse {
219
- success: boolean;
220
- message: string;
221
- data: IUserBranchPermission[];
222
- }
223
- interface IBatchOperationResponse {
224
- success: boolean;
225
- message: string;
226
- }
227
218
 
228
219
  interface ICreateUserRequest {
229
220
  name: string;
@@ -265,113 +256,34 @@ interface IUser {
265
256
  deletedAt?: Date | string | null;
266
257
  }
267
258
 
268
- /**
269
- * Auth API Service
270
- * Handles all authentication-related API calls matching NestJS auth endpoints
271
- */
272
259
  declare class AuthApiService {
273
260
  private readonly appConfig;
274
261
  private readonly http;
275
262
  private readonly baseUrl;
276
263
  constructor();
277
- /**
278
- * Login with email and password
279
- * Returns either:
280
- * - ILoginResponse (direct login success)
281
- * - ICompanySelectionResponse (requires company/branch selection)
282
- */
283
264
  login(data: ILoginRequest): Observable<AuthResponse>;
284
- /**
285
- * Register new user
286
- * Supports simple registration and company-based registration
287
- * Returns RegistrationResponse directly (not wrapped in SingleResponse)
288
- */
289
265
  register(data: IRegistrationRequest): Observable<IRegistrationResponse>;
290
- /**
291
- * Select company and branch after login
292
- * Used when login returns requiresSelection: true
293
- * Returns LoginResponse directly (not wrapped)
294
- */
295
266
  select(data: ISelectRequest): Observable<ILoginResponse>;
296
- /**
297
- * Switch company/branch for logged-in user
298
- * Returns LoginResponse directly (not wrapped)
299
- */
300
267
  switchCompany(data: ISwitchCompanyRequest): Observable<ILoginResponse>;
301
- /**
302
- * Refresh access token
303
- * Refresh token is sent via HTTP-only cookie
304
- * Returns RefreshTokenResponse directly (not wrapped)
305
- */
306
268
  refresh(): Observable<IRefreshTokenResponse>;
307
- /**
308
- * Get current user info
309
- * Returns only user data (no tokens) - IMeResponse
310
- */
311
269
  me(): Observable<IMeResponse>;
312
- /**
313
- * Logout current user
314
- */
315
270
  logout(): Observable<IMessageResponse>;
316
- /**
317
- * Change password for logged-in user
318
- */
319
271
  changePassword(data: IChangePasswordRequest): Observable<IMessageResponse>;
320
- /**
321
- * Send forgot password email
322
- */
323
272
  forgotPassword(email: string): Observable<IMessageResponse>;
324
- /**
325
- * Reset password with token
326
- */
327
273
  resetPassword(token: string, newPassword: string): Observable<IMessageResponse>;
328
- /**
329
- * Resend verification email (unauthenticated)
330
- */
331
274
  resendVerification(email: string): Observable<IMessageResponse>;
332
- /**
333
- * Verify email with token
334
- * Returns IMessageResponse for existing user verification
335
- * Returns IRegistrationResponse for pending registration completion
336
- */
337
275
  verifyEmail(token: string): Observable<IMessageResponse | IRegistrationResponse>;
338
276
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthApiService, never>;
339
277
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthApiService>;
340
278
  }
341
279
 
342
- /**
343
- * Auth Initialization Service
344
- * Handles app startup authentication flow:
345
- * 1. Check if user has valid session (via refresh token cookie)
346
- * 2. Restore user state from /auth/me
347
- * 3. Handle company selection if needed
348
- *
349
- * IMPORTANT: Skips initialization during SSR to avoid cookie/localStorage issues
350
- */
351
280
  declare class AuthInitService {
352
281
  private readonly authState;
353
282
  private readonly authApi;
354
- private readonly router;
355
283
  private readonly appConfig;
356
- /** Whether initial auth check has completed */
357
- readonly initialized: _angular_core.WritableSignal<boolean>;
358
- /** Whether auth check is in progress */
359
- readonly loading: _angular_core.WritableSignal<boolean>;
360
- /** Error from auth check */
361
- readonly error: _angular_core.WritableSignal<string | null>;
362
- /** Cached initialization observable to prevent duplicate calls */
284
+ private readonly _initialized;
285
+ readonly initialized: _angular_core.Signal<boolean>;
363
286
  private initializationCache$;
364
- /**
365
- * Initialize authentication state on app startup.
366
- *
367
- * Flow:
368
- * 1. If already authenticated with user data -> done
369
- * 2. Try refresh token (via cookie) -> get new access token
370
- * 3. Call /auth/me to get user info
371
- * 4. Update state accordingly
372
- *
373
- * Uses shareReplay to prevent duplicate initialization calls.
374
- */
375
287
  initialize(): Observable<boolean>;
376
288
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthInitService, never>;
377
289
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthInitService>;
@@ -385,6 +297,7 @@ declare class AuthStateService {
385
297
  private readonly appConfig;
386
298
  private readonly router;
387
299
  private readonly platform;
300
+ private readonly translateAdapter;
388
301
  private readonly _user;
389
302
  private readonly _accessToken;
390
303
  private readonly _tokenExpiresAt;
@@ -397,7 +310,6 @@ declare class AuthStateService {
397
310
  readonly branch: _angular_core.Signal<IBranchInfo | null>;
398
311
  private readonly _selectionSessionId;
399
312
  private readonly _availableCompanies;
400
- private readonly _selectionExpiresAt;
401
313
  readonly selectionSessionId: _angular_core.Signal<string | null>;
402
314
  readonly availableCompanies: _angular_core.Signal<ICompanyWithBranches[]>;
403
315
  readonly isAuthenticated: _angular_core.Signal<boolean>;
@@ -412,8 +324,8 @@ declare class AuthStateService {
412
324
  readonly isTokenExpired: _angular_core.Signal<boolean>;
413
325
  readonly tenantId: _angular_core.Signal<string | null>;
414
326
  constructor();
415
- setLoginState(response: ILoginResponse): void;
416
- setSelectionState(response: ICompanySelectionResponse): void;
327
+ setLoginState(data: ILoginData): void;
328
+ setSelectionState(data: ICompanySelectionData): void;
417
329
  clearSelectionState(): void;
418
330
  resetState(): void;
419
331
  setUser(user: IUserInfo | null): void;
@@ -444,9 +356,7 @@ declare class AuthStateService {
444
356
  * Signal-based service for branch CRUD operations
445
357
  */
446
358
  declare class BranchApiService extends ApiResourceService<ICreateBranchRequest | IUpdateBranchRequest, IBranch> {
447
- private readonly _currentCompanyId;
448
359
  constructor();
449
- setCurrentCompanyId(companyId: string | null): void;
450
360
  fetchByCompany(companyId: string, search?: string): void;
451
361
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BranchApiService, never>;
452
362
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<BranchApiService>;
@@ -499,14 +409,14 @@ declare class UserPermissionApiService {
499
409
  private readonly appConfig;
500
410
  private readonly http;
501
411
  private readonly baseUrl;
502
- assignUserCompanies(data: IAssignUserCompanyRequest): Observable<IBatchOperationResponse>;
503
- assignUserToCompany(userId: string, companyId: string): Observable<IBatchOperationResponse>;
504
- revokeUserFromCompany(userId: string, companyId: string): Observable<IBatchOperationResponse>;
505
- getUserCompanies(userId: string): Observable<IUserCompaniesResponse>;
506
- assignUserBranches(data: IAssignUserBranchRequest): Observable<IBatchOperationResponse>;
507
- assignUserToBranch(userId: string, branchId: string): Observable<IBatchOperationResponse>;
508
- revokeUserFromBranch(userId: string, branchId: string): Observable<IBatchOperationResponse>;
509
- getUserBranches(userId: string, companyId?: 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[]>>;
510
420
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserPermissionApiService, never>;
511
421
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserPermissionApiService>;
512
422
  }
@@ -600,8 +510,6 @@ declare class AuthUserProviderAdapter implements IUserProvider {
600
510
  page?: number;
601
511
  pageSize?: number;
602
512
  search?: string;
603
- companyId?: string;
604
- branchId?: string;
605
513
  isActive?: boolean;
606
514
  [key: string]: any;
607
515
  }): Observable<IListResponse<IUserBasicInfo>>;
@@ -620,7 +528,7 @@ declare class AuthCompanyApiProviderAdapter implements ICompanyApiProvider {
620
528
  }
621
529
  declare class AuthUserPermissionProviderAdapter implements IUserPermissionProvider {
622
530
  private readonly userPermissionApi;
623
- getUserBranchPermissions(userId: string, companyId?: string): Observable<ISingleResponse<any>>;
531
+ getUserBranchPermissions(userId: string, companyId?: string): Observable<ISingleResponse<IUserBranchPermission$1[]>>;
624
532
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthUserPermissionProviderAdapter, never>;
625
533
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthUserPermissionProviderAdapter>;
626
534
  }
@@ -639,6 +547,204 @@ declare function provideAuthLayoutIntegration(): Provider[];
639
547
  /** Provides auth implementations for ng-shared provider interfaces */
640
548
  declare function provideAuthProviders(): Provider[];
641
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
+
642
748
  /**
643
749
  * Authentication API Endpoints
644
750
  *
@@ -662,14 +768,8 @@ declare const AUTH_ENDPOINTS: {
662
768
  /** Check if a URL matches a specific endpoint */
663
769
  declare function isEndpoint(url: string, endpoint: string): boolean;
664
770
 
665
- interface ITab {
666
- id: string;
667
- label: string;
668
- icon: string;
669
- route: string;
670
- permission: string;
671
- requiresCompanyFeature?: boolean;
672
- }
771
+ declare const AUTH_MESSAGES: Record<string, string>;
772
+
673
773
  /**
674
774
  * Administration Page Component
675
775
  * Unified administration page with tabs for:
@@ -680,14 +780,13 @@ interface ITab {
680
780
  declare class AdministrationPageComponent {
681
781
  private readonly appConfig;
682
782
  private readonly permissionValidator;
783
+ private readonly translateService;
683
784
  /** All available tabs */
684
785
  private readonly allTabs;
685
786
  /** Check if company feature is enabled */
686
787
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
687
788
  /** Visible tabs based on config and permissions */
688
- readonly visibleTabs: _angular_core.Signal<ITab[]>;
689
- /** Dynamic subtitle based on visible tabs */
690
- readonly subtitle: _angular_core.Signal<string>;
789
+ readonly visibleTabs: _angular_core.Signal<RouterTabItem[]>;
691
790
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdministrationPageComponent, never>;
692
791
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdministrationPageComponent, "lib-administration-page", never, {}, {}, never, never, true, never>;
693
792
  }
@@ -714,6 +813,8 @@ declare class BranchFormComponent {
714
813
  private readonly branchService;
715
814
  private readonly companyService;
716
815
  private readonly authState;
816
+ private readonly translateAdapter;
817
+ private translate;
717
818
  private readonly routeParams;
718
819
  private readonly queryParams;
719
820
  /** Loading state */
@@ -727,7 +828,7 @@ declare class BranchFormComponent {
727
828
  /** Form model */
728
829
  readonly formModel: _angular_core.WritableSignal<IBranchFormModel>;
729
830
  /** Form with validation schema */
730
- readonly branchForm: _angular_forms_signals.FieldTree<IBranchFormModel, string | number>;
831
+ readonly branchForm: _angular_forms_signals.FieldTree<IBranchFormModel, string | number, "writable">;
731
832
  /** Check if form is valid */
732
833
  readonly isFormValid: _angular_core.Signal<boolean>;
733
834
  constructor();
@@ -746,11 +847,6 @@ declare class BranchFormComponent {
746
847
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BranchFormComponent, "lib-branch-form", never, {}, {}, never, never, true, never>;
747
848
  }
748
849
 
749
- /**
750
- * Branch List Component
751
- * Displays a list of branches for a company with CRUD operations.
752
- * Defaults to current company context.
753
- */
754
850
  declare class BranchListComponent {
755
851
  readonly BRANCH_PERMISSIONS: {
756
852
  readonly CREATE: "branch.create";
@@ -765,6 +861,8 @@ declare class BranchListComponent {
765
861
  private readonly branchService;
766
862
  private readonly companyService;
767
863
  private readonly authState;
864
+ private readonly translateAdapter;
865
+ private translate;
768
866
  private readonly queryParamMap;
769
867
  private initialized;
770
868
  /** Selected company ID (signal for zoneless change detection) */
@@ -778,7 +876,7 @@ declare class BranchListComponent {
778
876
  /** Total count from service */
779
877
  readonly total: _angular_core.Signal<number>;
780
878
  constructor();
781
- loadBranches(): void;
879
+ loadBranches(page?: number, pageSize?: number): void;
782
880
  onCompanyChange(): void;
783
881
  onLazyLoad(event: {
784
882
  first?: number | null;
@@ -791,85 +889,34 @@ declare class BranchListComponent {
791
889
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BranchListComponent, "lib-branch-list", never, {}, {}, never, never, true, never>;
792
890
  }
793
891
 
794
- /** Company form model interface */
795
- interface ICompanyFormModel$1 {
796
- name: string;
797
- slug: string;
798
- email: string;
799
- phone: string;
800
- website: string;
801
- address: string;
802
- isActive: boolean;
803
- }
804
- /**
805
- * Company Form Component
806
- * Handles creating and editing companies.
807
- */
808
892
  declare class CompanyFormComponent {
809
- private readonly router;
810
893
  private readonly route;
811
- private readonly messageService;
812
- private readonly companyService;
894
+ private readonly translateAdapter;
895
+ readonly companyService: CompanyApiService;
896
+ readonly formRef: _angular_core.Signal<BaseFormComponent | undefined>;
813
897
  private readonly routeParams;
814
- /** Loading state */
815
- readonly isLoading: _angular_core.WritableSignal<boolean>;
816
- /** Existing company data when editing */
817
- readonly existingCompany: _angular_core.WritableSignal<ICompany | null>;
818
- /** Whether in edit mode */
819
- readonly isEditMode: _angular_core.Signal<boolean>;
820
- /** Form model */
821
- readonly formModel: _angular_core.WritableSignal<ICompanyFormModel$1>;
822
- /** Form with validation schema */
823
- readonly companyForm: _angular_forms_signals.FieldTree<ICompanyFormModel$1, string | number>;
824
- /** Check if form is valid */
825
- readonly isFormValid: _angular_core.Signal<boolean>;
826
- constructor();
827
- private loadCompany;
828
- generateSlug(): void;
829
- onSubmit(): Promise<void>;
830
- onCancel(): void;
831
- /** Build company data from form model */
832
- private buildCompanyData;
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;
833
904
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyFormComponent, never>;
834
905
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyFormComponent, "lib-company-form", never, {}, {}, never, never, true, never>;
835
906
  }
836
907
 
837
- /**
838
- * Company List Component
839
- * Displays a list of companies with CRUD operations.
840
- * Only visible when company feature is enabled.
841
- */
842
908
  declare class CompanyListComponent {
843
- readonly COMPANY_PERMISSIONS: {
844
- readonly CREATE: "company.create";
845
- readonly READ: "company.read";
846
- readonly UPDATE: "company.update";
847
- readonly DELETE: "company.delete";
848
- };
849
- readonly BRANCH_PERMISSIONS: {
850
- readonly CREATE: "branch.create";
851
- readonly READ: "branch.read";
852
- readonly UPDATE: "branch.update";
853
- readonly DELETE: "branch.delete";
854
- };
909
+ private readonly permissionValidator;
910
+ private readonly translateAdapter;
855
911
  private readonly router;
856
- private readonly messageService;
857
- private readonly confirmationService;
858
- private readonly companyService;
859
- /** Companies from service */
860
- readonly companies: _angular_core.Signal<ICompany[]>;
861
- /** Loading state from service */
862
- readonly isLoading: _angular_core.Signal<boolean>;
863
- /** Total count from service */
864
- readonly total: _angular_core.Signal<number>;
865
- onLazyLoad(event: {
866
- first?: number | null;
867
- rows?: number | null;
868
- }): void;
869
- onCreate(): void;
870
- onEdit(company: ICompany): void;
871
- onViewBranches(company: ICompany): void;
872
- 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;
873
920
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CompanyListComponent, never>;
874
921
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanyListComponent, "lib-company-list", never, {}, {}, never, never, true, never>;
875
922
  }
@@ -881,11 +928,13 @@ declare class ForgotPasswordPageComponent {
881
928
  private readonly destroyRef;
882
929
  private readonly messageService;
883
930
  private readonly authApi;
931
+ private readonly translateAdapter;
932
+ private translate;
884
933
  readonly isLoading: _angular_core.WritableSignal<boolean>;
885
934
  readonly emailSent: _angular_core.WritableSignal<boolean>;
886
935
  readonly submittedEmail: _angular_core.WritableSignal<string>;
887
936
  readonly formModel: _angular_core.WritableSignal<IForgotPasswordFormModel>;
888
- readonly forgotForm: _angular_forms_signals.FieldTree<IForgotPasswordFormModel, string | number>;
937
+ readonly forgotForm: _angular_forms_signals.FieldTree<IForgotPasswordFormModel, string | number, "writable">;
889
938
  readonly isFormValid: _angular_core.Signal<boolean>;
890
939
  onSubmit(): void;
891
940
  private showEmailSent;
@@ -911,15 +960,23 @@ declare class LoginPageComponent {
911
960
  private readonly messageService;
912
961
  private readonly authApi;
913
962
  private readonly authState;
963
+ private readonly translateAdapter;
964
+ private readonly validationConfig;
965
+ private translate;
914
966
  readonly returnUrl: _angular_core.InputSignal<string>;
915
967
  readonly currentStep: _angular_core.WritableSignal<LoginStep>;
916
968
  readonly isLoading: _angular_core.WritableSignal<boolean>;
917
969
  readonly unverifiedEmail: _angular_core.WritableSignal<string>;
918
970
  readonly loginFormModel: _angular_core.WritableSignal<ILoginFormModel>;
919
- readonly loginForm: _angular_forms_signals.FieldTree<ILoginFormModel, string | number>;
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>;
920
977
  readonly isLoginFormValid: _angular_core.Signal<boolean>;
921
978
  readonly selectionFormModel: _angular_core.WritableSignal<ISelectionFormModel>;
922
- readonly selectionForm: _angular_forms_signals.FieldTree<ISelectionFormModel, string | number>;
979
+ readonly selectionForm: _angular_forms_signals.FieldTree<ISelectionFormModel, string | number, "writable">;
923
980
  readonly isSelectionFormValid: _angular_core.Signal<boolean>;
924
981
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
925
982
  readonly emailFeatureEnabled: _angular_core.Signal<boolean>;
@@ -940,31 +997,15 @@ declare class LoginPageComponent {
940
997
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoginPageComponent, "lib-login-page", never, { "returnUrl": { "alias": "returnUrl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
941
998
  }
942
999
 
943
- /** Profile form model */
944
1000
  interface IProfileFormModel {
945
1001
  name: string;
946
1002
  phone: string;
947
1003
  }
948
- /** Password form model */
949
1004
  interface IPasswordFormModel {
950
1005
  currentPassword: string;
951
1006
  newPassword: string;
952
1007
  confirmPassword: string;
953
1008
  }
954
- /**
955
- * Profile Page Component
956
- *
957
- * Allows users to view and update their profile information.
958
- * Features:
959
- * - Update name, phone, profile picture (if storage enabled)
960
- * - View company/branch info (read-only, if company feature enabled)
961
- * - View roles/actions (read-only, if IAM enabled via optional injection)
962
- *
963
- * Package Independence:
964
- * - Uses PROFILE_UPLOAD_PROVIDER (optional) for storage functionality
965
- * - Uses PROFILE_PERMISSION_PROVIDER (optional) for IAM functionality
966
- * - No direct imports from ng-storage or ng-iam
967
- */
968
1009
  declare class ProfilePageComponent {
969
1010
  private readonly destroyRef;
970
1011
  private readonly appConfig;
@@ -973,16 +1014,30 @@ declare class ProfilePageComponent {
973
1014
  private readonly userService;
974
1015
  private readonly authApiService;
975
1016
  private readonly fileUrlService;
976
- private readonly uploadProvider;
1017
+ private readonly fileProvider;
977
1018
  private readonly permissionProvider;
1019
+ private readonly profileExtension;
1020
+ private readonly userFormExtension;
1021
+ private readonly translateAdapter;
1022
+ private translate;
978
1023
  readonly isLoading: _angular_core.WritableSignal<boolean>;
979
1024
  readonly isLoadingPermissions: _angular_core.WritableSignal<boolean>;
1025
+ readonly isLoadingExtraFields: _angular_core.WritableSignal<boolean>;
980
1026
  private readonly _profilePictureUrl;
981
1027
  readonly profilePictureUrl: _angular_core.Signal<string | null>;
982
1028
  private readonly _userRoles;
983
1029
  readonly userRoles: _angular_core.Signal<IProfileRoleInfo[]>;
984
1030
  private readonly _userActions;
985
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>;
986
1041
  readonly userEmail: _angular_core.Signal<string>;
987
1042
  readonly userName: _angular_core.Signal<string>;
988
1043
  readonly userInitials: _angular_core.Signal<string>;
@@ -997,19 +1052,32 @@ declare class ProfilePageComponent {
997
1052
  readonly showBottomRow: _angular_core.Signal<boolean>;
998
1053
  private readonly originalFormModel;
999
1054
  readonly formModel: _angular_core.WritableSignal<IProfileFormModel>;
1000
- readonly formTree: _angular_forms_signals.FieldTree<IProfileFormModel, string | number>;
1055
+ readonly formTree: _angular_forms_signals.FieldTree<IProfileFormModel, string | number, "writable">;
1001
1056
  readonly isFormValid: _angular_core.Signal<boolean>;
1002
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;
1003
1065
  readonly passwordModel: _angular_core.WritableSignal<IPasswordFormModel>;
1066
+ readonly visiblePasswords: _angular_core.WritableSignal<Record<keyof IPasswordFormModel, boolean>>;
1004
1067
  readonly isPasswordLoading: _angular_core.WritableSignal<boolean>;
1005
1068
  readonly isPasswordFormValid: _angular_core.Signal<boolean>;
1006
1069
  readonly passwordsMatch: _angular_core.Signal<boolean>;
1007
- readonly uploadFileFn: UploadFileFn;
1008
- /** Map upload result to IUploadedFile format */
1009
- private mapUploadResultToUploadedFile;
1070
+ readonly profileUploadOptions: {
1071
+ folderPath: string;
1072
+ compress: boolean;
1073
+ maxWidth: number;
1074
+ maxHeight: number;
1075
+ isPrivate: boolean;
1076
+ };
1010
1077
  constructor();
1011
1078
  private loadUserData;
1012
1079
  private loadPermissions;
1080
+ private loadExtraFields;
1013
1081
  onProfilePictureUploaded(file: {
1014
1082
  id?: string;
1015
1083
  name: string;
@@ -1018,6 +1086,7 @@ declare class ProfilePageComponent {
1018
1086
  contentType: string;
1019
1087
  }): void;
1020
1088
  onSubmit(): void;
1089
+ togglePasswordVisibility(field: keyof IPasswordFormModel): void;
1021
1090
  updatePasswordField(field: keyof IPasswordFormModel, value: string): void;
1022
1091
  onChangePassword(): void;
1023
1092
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProfilePageComponent, never>;
@@ -1047,6 +1116,10 @@ declare class RegisterPageComponent {
1047
1116
  private readonly authState;
1048
1117
  private readonly route;
1049
1118
  private readonly router;
1119
+ private readonly validationConfig;
1120
+ private readonly registrationExtension;
1121
+ private readonly translateAdapter;
1122
+ private translate;
1050
1123
  private readonly queryParamMap;
1051
1124
  private companySlugInitialized;
1052
1125
  readonly returnUrl: _angular_core.InputSignal<string>;
@@ -1056,12 +1129,25 @@ declare class RegisterPageComponent {
1056
1129
  readonly defaultBranchSlug: _angular_core.Signal<string | undefined>;
1057
1130
  readonly hasDefaultCompany: _angular_core.Signal<boolean>;
1058
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;
1059
1137
  readonly userFormModel: _angular_core.WritableSignal<IUserFormModel$1>;
1060
- readonly userForm: _angular_forms_signals.FieldTree<IUserFormModel$1, string | number>;
1138
+ readonly userForm: _angular_forms_signals.FieldTree<IUserFormModel$1, string | number, "writable">;
1061
1139
  readonly companyFormModel: _angular_core.WritableSignal<ICompanyFormModel>;
1062
- 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>;
1063
1144
  readonly passwordsMatch: _angular_core.Signal<boolean>;
1064
1145
  readonly isFormValid: _angular_core.Signal<boolean>;
1146
+ private validateRequiredExtraFields;
1147
+ updateExtraField(key: string, value: unknown): void;
1148
+ getFieldTemplateContext(field: IRegistrationExtraField): IRegistrationFieldTemplateContext;
1149
+ private readonly parentInjector;
1150
+ getFieldInjector(field: IRegistrationExtraField): Injector;
1065
1151
  constructor();
1066
1152
  onCreateCompanyToggle(): void;
1067
1153
  onSubmit(): void;
@@ -1079,13 +1165,15 @@ declare class ResetPasswordPageComponent {
1079
1165
  private readonly route;
1080
1166
  private readonly messageService;
1081
1167
  private readonly authApi;
1168
+ private readonly translateAdapter;
1169
+ private translate;
1082
1170
  private readonly queryParams;
1083
1171
  private tokenInitialized;
1084
1172
  private token;
1085
1173
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1086
1174
  readonly pageState: _angular_core.WritableSignal<PageState$1>;
1087
1175
  readonly formModel: _angular_core.WritableSignal<IResetPasswordFormModel>;
1088
- readonly resetForm: _angular_forms_signals.FieldTree<IResetPasswordFormModel, string | number>;
1176
+ readonly resetForm: _angular_forms_signals.FieldTree<IResetPasswordFormModel, string | number, "writable">;
1089
1177
  readonly passwordMismatch: _angular_core.Signal<boolean>;
1090
1178
  readonly canSubmit: _angular_core.Signal<boolean>;
1091
1179
  constructor();
@@ -1094,7 +1182,6 @@ declare class ResetPasswordPageComponent {
1094
1182
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ResetPasswordPageComponent, "lib-reset-password-page", never, {}, {}, never, never, true, never>;
1095
1183
  }
1096
1184
 
1097
- /** User form model interface */
1098
1185
  interface IUserFormModel {
1099
1186
  name: string;
1100
1187
  email: string;
@@ -1103,11 +1190,6 @@ interface IUserFormModel {
1103
1190
  isActive: boolean;
1104
1191
  emailVerified: boolean;
1105
1192
  }
1106
- /**
1107
- * User Form Component
1108
- * Handles creating and editing users.
1109
- * When company feature is enabled, automatically assigns new users to current company/branch.
1110
- */
1111
1193
  declare class UserFormComponent {
1112
1194
  private readonly destroyRef;
1113
1195
  private readonly router;
@@ -1117,46 +1199,47 @@ declare class UserFormComponent {
1117
1199
  private readonly userService;
1118
1200
  private readonly permissionService;
1119
1201
  private readonly authState;
1202
+ private readonly translateAdapter;
1203
+ private readonly userFormExtension;
1204
+ private readonly parentInjector;
1205
+ private translate;
1120
1206
  private readonly routeParams;
1121
1207
  private userLoadTriggered;
1122
- /** Loading state */
1123
1208
  readonly isLoading: _angular_core.WritableSignal<boolean>;
1124
- /** Existing user data when editing */
1125
1209
  readonly existingUser: _angular_core.WritableSignal<IUser | null>;
1126
- /** Whether in edit mode */
1127
1210
  readonly isEditMode: _angular_core.Signal<boolean>;
1128
- /** Whether company feature is enabled */
1129
1211
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1130
- /** Current company name */
1131
1212
  readonly currentCompanyName: _angular_core.Signal<string>;
1132
- /** Current branch name */
1133
1213
  readonly currentBranchName: _angular_core.Signal<string>;
1134
- /** Form model */
1135
1214
  readonly formModel: _angular_core.WritableSignal<IUserFormModel>;
1136
- /** Form with validation schema */
1137
- readonly formTree: _angular_forms_signals.FieldTree<IUserFormModel, string | number>;
1138
- /** 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;
1139
1227
  readonly isFormValid: _angular_core.Signal<boolean>;
1140
1228
  constructor();
1141
- loadUser(id: string): void;
1229
+ loadUser(id: string): Promise<void>;
1230
+ private loadExtraFields;
1142
1231
  private toFormModel;
1143
1232
  onSubmit(): void;
1144
1233
  private updateUser;
1145
1234
  private createUser;
1235
+ private saveExtraFieldsForNewUser;
1146
1236
  private onSaveSuccess;
1147
- /**
1148
- * Assign user to current company and branch
1149
- */
1150
1237
  private assignUserToCompanyAndBranch;
1151
1238
  onCancel(): void;
1152
1239
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserFormComponent, never>;
1153
1240
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserFormComponent, "lib-user-form", never, {}, {}, never, never, true, never>;
1154
1241
  }
1155
1242
 
1156
- /**
1157
- * User List Component
1158
- * Displays a list of users with CRUD operations.
1159
- */
1160
1243
  declare class UserListComponent {
1161
1244
  readonly USER_PERMISSIONS: {
1162
1245
  readonly CREATE: "user.create";
@@ -1169,19 +1252,28 @@ declare class UserListComponent {
1169
1252
  private readonly messageService;
1170
1253
  private readonly confirmationService;
1171
1254
  private readonly userService;
1172
- /** Users from service */
1255
+ private readonly userListExtension;
1256
+ readonly userDetailConfig: _flusys_ng_auth.IUserDetailViewConfig | null;
1257
+ private readonly translateAdapter;
1258
+ private translate;
1173
1259
  readonly users: _angular_core.Signal<IUser[]>;
1174
- /** Loading state from service */
1175
1260
  readonly isLoading: _angular_core.Signal<boolean>;
1176
- /** Total count from service */
1177
1261
  readonly total: _angular_core.Signal<number>;
1178
- /** Whether company feature is enabled */
1179
1262
  readonly companyFeatureEnabled: _angular_core.Signal<boolean>;
1180
- /** 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>;
1181
1267
  readonly showCompanyDialog: _angular_core.WritableSignal<boolean>;
1182
1268
  readonly showBranchDialog: _angular_core.WritableSignal<boolean>;
1183
- /** Selected user for permission management */
1269
+ readonly showUserDetailDialog: _angular_core.WritableSignal<boolean>;
1184
1270
  readonly selectedUser: _angular_core.WritableSignal<IUser | null>;
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;
1185
1277
  loadUsers(): void;
1186
1278
  onLazyLoad(event: {
1187
1279
  first?: number | null;
@@ -1208,6 +1300,8 @@ declare class VerifyEmailPageComponent {
1208
1300
  private readonly route;
1209
1301
  private readonly messageService;
1210
1302
  private readonly authApi;
1303
+ private readonly translateAdapter;
1304
+ private translate;
1211
1305
  private readonly queryParams;
1212
1306
  private verificationTriggered;
1213
1307
  readonly isLoading: _angular_core.WritableSignal<boolean>;
@@ -1215,7 +1309,7 @@ declare class VerifyEmailPageComponent {
1215
1309
  readonly resendSuccess: _angular_core.WritableSignal<boolean>;
1216
1310
  readonly submittedEmail: _angular_core.WritableSignal<string>;
1217
1311
  readonly resendFormModel: _angular_core.WritableSignal<IResendFormModel>;
1218
- readonly resendForm: _angular_forms_signals.FieldTree<IResendFormModel, string | number>;
1312
+ readonly resendForm: _angular_forms_signals.FieldTree<IResendFormModel, string | number, "writable">;
1219
1313
  readonly isResendFormValid: _angular_core.Signal<boolean>;
1220
1314
  constructor();
1221
1315
  private verifyEmail;
@@ -1234,24 +1328,38 @@ declare class UserBranchPermissionDialogComponent {
1234
1328
  private readonly branchApi;
1235
1329
  private readonly permissionApi;
1236
1330
  private readonly messageService;
1331
+ private readonly translateAdapter;
1332
+ private t;
1237
1333
  readonly visible: _angular_core.InputSignal<boolean>;
1238
1334
  readonly user: _angular_core.InputSignal<IUser | null>;
1239
1335
  readonly closed: _angular_core.OutputEmitterRef<void>;
1240
1336
  readonly permissionsChanged: _angular_core.OutputEmitterRef<void>;
1241
- readonly isLoading: _angular_core.WritableSignal<boolean>;
1242
1337
  readonly isSaving: _angular_core.WritableSignal<boolean>;
1243
- readonly branches: _angular_core.WritableSignal<BranchWithAssignment[]>;
1244
- readonly companies: _angular_core.WritableSignal<{
1338
+ readonly selectedCompanyId: _angular_core.WritableSignal<string | null>;
1339
+ readonly companiesResource: _angular_core.ResourceRef<{
1245
1340
  id: string;
1246
1341
  name: string;
1247
- }[]>;
1248
- selectedCompanyId: string | null;
1249
- private assignedBranchIds;
1250
- constructor();
1251
- private loadUserCompaniesAndData;
1252
- private loadData;
1253
- onCompanyChange(): void;
1254
- 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>;
1255
1363
  onClose(): void;
1256
1364
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserBranchPermissionDialogComponent, never>;
1257
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>;
@@ -1264,6 +1372,8 @@ declare class UserCompanyPermissionDialogComponent {
1264
1372
  private readonly companyApi;
1265
1373
  private readonly permissionApi;
1266
1374
  private readonly messageService;
1375
+ private readonly translateAdapter;
1376
+ private t;
1267
1377
  readonly visible: _angular_core.InputSignal<boolean>;
1268
1378
  readonly user: _angular_core.InputSignal<IUser | null>;
1269
1379
  readonly closed: _angular_core.OutputEmitterRef<void>;
@@ -1280,5 +1390,5 @@ declare class UserCompanyPermissionDialogComponent {
1280
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>;
1281
1391
  }
1282
1392
 
1283
- export { ADMINISTRATION_ROUTES, AUTH_ENDPOINTS, AUTH_ROUTES, AdministrationPageComponent, AuthApiService, AuthCompanyApiProviderAdapter, AuthInitService, AuthLayoutApiAdapter, AuthLayoutStateAdapter, AuthStateProviderAdapter, 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, emailFeatureGuard, guestGuard, isCompanySelectionResponse, isEmailVerificationRequired, isEndpoint, isLoginResponse, provideAuthLayoutIntegration, provideAuthProviders, signUpFeatureGuard, tokenRefreshInterceptor };
1284
- 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 };