@flusys/ng-shared 3.0.0 → 4.0.0-lts

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,11 +1,12 @@
1
+ import * as rxjs from 'rxjs';
1
2
  import { Observable } from 'rxjs';
2
3
  import * as _angular_core from '@angular/core';
3
- import { Signal, Injector, ResourceRef, model, ElementRef, DestroyRef, InjectionToken } from '@angular/core';
4
+ import { Signal, PipeTransform, Provider, Injector, ResourceRef, model, OnDestroy, ElementRef, TemplateRef, DestroyRef, InjectionToken } from '@angular/core';
5
+ import * as i3 from '@angular/router';
6
+ import { ResolveFn, CanActivateFn, Router, ActivatedRoute } from '@angular/router';
4
7
  import * as i1 from '@angular/common';
5
8
  import * as i2 from '@angular/forms';
6
9
  import { ControlValueAccessor } from '@angular/forms';
7
- import * as i3 from '@angular/router';
8
- import { CanActivateFn, Router, ActivatedRoute } from '@angular/router';
9
10
  import * as i1$1 from 'primeng/autocomplete';
10
11
  import * as i2$1 from 'primeng/avatar';
11
12
  import * as i3$1 from 'primeng/button';
@@ -41,25 +42,18 @@ import * as i31 from 'primeng/tabs';
41
42
  import * as i32 from 'primeng/tag';
42
43
  import * as i33 from 'primeng/textarea';
43
44
  import * as i34 from 'primeng/toast';
44
- import * as i35 from 'primeng/toggleswitch';
45
- import * as i36 from 'primeng/tooltip';
46
- import * as i37 from 'primeng/treetable';
45
+ import * as i35 from 'primeng/togglebutton';
46
+ import * as i36 from 'primeng/toggleswitch';
47
+ import * as i37 from 'primeng/tooltip';
48
+ import * as i38 from 'primeng/treetable';
49
+ import * as i39 from 'primeng/progressspinner';
50
+ import * as i40 from 'primeng/colorpicker';
47
51
  import * as _flusys_ng_shared from '@flusys/ng-shared';
48
52
  import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
49
53
  import { FormValueControl } from '@angular/forms/signals';
50
- import { MessageService, ConfirmationService } from 'primeng/api';
51
54
  import * as _flusys_ng_core from '@flusys/ng-core';
55
+ import { MessageService, ConfirmationService } from 'primeng/api';
52
56
 
53
- /**
54
- * Centralized Permission Codes
55
- *
56
- * Single source of truth for all permission codes used across the application.
57
- * Use these constants instead of hardcoded strings to prevent typos and enable easy refactoring.
58
- *
59
- * Naming Convention: <entity>.<action>
60
- * - entity: The resource being accessed (e.g., user, role, company)
61
- * - action: The operation being performed (create, read, update, delete, assign)
62
- */
63
57
  declare const USER_PERMISSIONS: {
64
58
  readonly CREATE: "user.create";
65
59
  readonly READ: "user.read";
@@ -142,9 +136,42 @@ declare const FORM_PERMISSIONS: {
142
136
  readonly UPDATE: "form.update";
143
137
  readonly DELETE: "form.delete";
144
138
  };
145
- /**
146
- * All permission codes grouped by module
147
- */
139
+ declare const EVENT_PERMISSIONS: {
140
+ readonly CREATE: "event.create";
141
+ readonly READ: "event.read";
142
+ readonly UPDATE: "event.update";
143
+ readonly DELETE: "event.delete";
144
+ };
145
+ declare const EVENT_PARTICIPANT_PERMISSIONS: {
146
+ readonly CREATE: "event-participant.create";
147
+ readonly READ: "event-participant.read";
148
+ readonly UPDATE: "event-participant.update";
149
+ readonly DELETE: "event-participant.delete";
150
+ };
151
+ declare const NOTIFICATION_PERMISSIONS: {
152
+ readonly CREATE: "notification.create";
153
+ readonly READ: "notification.read";
154
+ readonly UPDATE: "notification.update";
155
+ readonly DELETE: "notification.delete";
156
+ };
157
+ declare const LANGUAGE_PERMISSIONS: {
158
+ readonly CREATE: "language.create";
159
+ readonly READ: "language.read";
160
+ readonly UPDATE: "language.update";
161
+ readonly DELETE: "language.delete";
162
+ };
163
+ declare const TRANSLATION_KEY_PERMISSIONS: {
164
+ readonly CREATE: "translation-key.create";
165
+ readonly READ: "translation-key.read";
166
+ readonly UPDATE: "translation-key.update";
167
+ readonly DELETE: "translation-key.delete";
168
+ };
169
+ declare const TRANSLATION_PERMISSIONS: {
170
+ readonly CREATE: "translation.create";
171
+ readonly READ: "translation.read";
172
+ readonly UPDATE: "translation.update";
173
+ readonly DELETE: "translation.delete";
174
+ };
148
175
  declare const PERMISSIONS: {
149
176
  readonly USER: {
150
177
  readonly CREATE: "user.create";
@@ -228,9 +255,47 @@ declare const PERMISSIONS: {
228
255
  readonly UPDATE: "form.update";
229
256
  readonly DELETE: "form.delete";
230
257
  };
258
+ readonly EVENT: {
259
+ readonly CREATE: "event.create";
260
+ readonly READ: "event.read";
261
+ readonly UPDATE: "event.update";
262
+ readonly DELETE: "event.delete";
263
+ };
264
+ readonly EVENT_PARTICIPANT: {
265
+ readonly CREATE: "event-participant.create";
266
+ readonly READ: "event-participant.read";
267
+ readonly UPDATE: "event-participant.update";
268
+ readonly DELETE: "event-participant.delete";
269
+ };
270
+ readonly NOTIFICATION: {
271
+ readonly CREATE: "notification.create";
272
+ readonly READ: "notification.read";
273
+ readonly UPDATE: "notification.update";
274
+ readonly DELETE: "notification.delete";
275
+ };
276
+ readonly LANGUAGE: {
277
+ readonly CREATE: "language.create";
278
+ readonly READ: "language.read";
279
+ readonly UPDATE: "language.update";
280
+ readonly DELETE: "language.delete";
281
+ };
282
+ readonly TRANSLATION_KEY: {
283
+ readonly CREATE: "translation-key.create";
284
+ readonly READ: "translation-key.read";
285
+ readonly UPDATE: "translation-key.update";
286
+ readonly DELETE: "translation-key.delete";
287
+ };
288
+ readonly TRANSLATION: {
289
+ readonly CREATE: "translation.create";
290
+ readonly READ: "translation.read";
291
+ readonly UPDATE: "translation.update";
292
+ readonly DELETE: "translation.delete";
293
+ };
231
294
  };
232
295
  type PermissionCode = (typeof PERMISSIONS)[keyof typeof PERMISSIONS][keyof (typeof PERMISSIONS)[keyof typeof PERMISSIONS]];
233
296
 
297
+ declare const SHARED_MESSAGES: Record<string, string>;
298
+
234
299
  /**
235
300
  * Base entity interface - matches backend Identity entity
236
301
  */
@@ -329,12 +394,8 @@ interface IPagination {
329
394
  pageSize: number;
330
395
  currentPage: number;
331
396
  }
332
- interface ISort {
333
- [key: string]: 'ASC' | 'DESC';
334
- }
335
- interface IFilter {
336
- [key: string]: string | number | boolean | null | undefined | string[] | number[];
337
- }
397
+ type ISort = Record<string, 'ASC' | 'DESC'>;
398
+ type IFilter = Record<string, string | number | boolean | null | undefined | string[] | number[]>;
338
399
  interface IFilterData {
339
400
  filter?: IFilter;
340
401
  pagination?: IPagination;
@@ -385,6 +446,8 @@ interface IValidationError {
385
446
  interface ISingleResponse<T> {
386
447
  success: boolean;
387
448
  message: string;
449
+ messageKey?: string;
450
+ messageParams?: Record<string, unknown>;
388
451
  data?: T;
389
452
  _meta?: IRequestMeta;
390
453
  }
@@ -394,6 +457,8 @@ interface ISingleResponse<T> {
394
457
  interface IListResponse<T> {
395
458
  success: boolean;
396
459
  message: string;
460
+ messageKey?: string;
461
+ messageParams?: Record<string, unknown>;
397
462
  data?: T[];
398
463
  meta: IPaginationMeta;
399
464
  _meta?: IRequestMeta;
@@ -404,6 +469,8 @@ interface IListResponse<T> {
404
469
  interface IBulkResponse<T> {
405
470
  success: boolean;
406
471
  message: string;
472
+ messageKey?: string;
473
+ messageParams?: Record<string, unknown>;
407
474
  data?: T[];
408
475
  meta: IBulkMeta;
409
476
  _meta?: IRequestMeta;
@@ -414,6 +481,8 @@ interface IBulkResponse<T> {
414
481
  interface IMessageResponse {
415
482
  success: boolean;
416
483
  message: string;
484
+ messageKey?: string;
485
+ messageParams?: Record<string, unknown>;
417
486
  _meta?: IRequestMeta;
418
487
  }
419
488
  /**
@@ -422,7 +491,8 @@ interface IMessageResponse {
422
491
  interface IErrorResponse {
423
492
  success: false;
424
493
  message: string;
425
- code?: string;
494
+ messageKey?: string;
495
+ messageParams?: Record<string, unknown>;
426
496
  errors?: IValidationError[];
427
497
  _meta?: IRequestMeta;
428
498
  }
@@ -484,9 +554,6 @@ interface IFileData {
484
554
  createdAt: Date;
485
555
  }
486
556
 
487
- /**
488
- * Basic file info for selectors and displays
489
- */
490
557
  interface IFileBasicInfo {
491
558
  id: string;
492
559
  name: string;
@@ -494,9 +561,23 @@ interface IFileBasicInfo {
494
561
  size: string;
495
562
  url: string | null;
496
563
  }
497
- /**
498
- * Upload options for file uploader
499
- */
564
+ interface IUploadedFile {
565
+ id?: string;
566
+ name: string;
567
+ key: string;
568
+ size: number;
569
+ contentType: string;
570
+ }
571
+ interface IFolderBasicInfo {
572
+ id: string;
573
+ name: string;
574
+ slug: string;
575
+ }
576
+ interface IStorageConfigBasicInfo {
577
+ id: string;
578
+ name: string;
579
+ isDefault: boolean;
580
+ }
500
581
  interface IFileUploadOptions {
501
582
  storageConfigId?: string;
502
583
  folderPath?: string;
@@ -504,42 +585,22 @@ interface IFileUploadOptions {
504
585
  maxHeight?: number;
505
586
  quality?: number;
506
587
  compress?: boolean;
588
+ isPrivate?: boolean;
507
589
  }
508
- /**
509
- * Uploaded file response
510
- */
511
- interface IUploadedFile {
512
- id?: string;
513
- name: string;
514
- key: string;
515
- size: number;
516
- contentType: string;
517
- }
518
- /**
519
- * Filter params for file selector
520
- */
521
- interface IFileSelectFilter {
590
+ interface ISelectFilter {
522
591
  page: number;
523
592
  pageSize: number;
524
593
  search: string;
594
+ }
595
+ interface IFileSelectFilter extends ISelectFilter {
525
596
  contentTypes?: string[];
526
597
  folderId?: string;
598
+ storageConfigId?: string;
527
599
  }
528
- /**
529
- * Function type for loading files
530
- */
531
600
  type LoadFilesFn = (filter: IFileSelectFilter) => Observable<IListResponse<IFileBasicInfo>>;
532
- /**
533
- * Function type for uploading a file
534
- */
535
601
  type UploadFileFn = (file: File, options?: IFileUploadOptions) => Observable<ISingleResponse<IUploadedFile>>;
536
- /**
537
- * Function type for getting file URLs (presigned URL refresh)
538
- */
602
+ type UploadMultipleFilesFn = (files: File[], options?: IFileUploadOptions) => Observable<ISingleResponse<IUploadedFile[]>>;
539
603
  type GetFileUrlsFn = (fileIds: string[]) => Observable<ISingleResponse<IFileBasicInfo[]>>;
540
- /**
541
- * Common file type filters
542
- */
543
604
  declare const FILE_TYPE_FILTERS: {
544
605
  readonly IMAGES: readonly ["image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"];
545
606
  readonly DOCUMENTS: readonly ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"];
@@ -547,21 +608,9 @@ declare const FILE_TYPE_FILTERS: {
547
608
  readonly AUDIO: readonly ["audio/mpeg", "audio/wav", "audio/ogg", "audio/webm"];
548
609
  readonly ALL: string[];
549
610
  };
550
- /**
551
- * Get accept string for file input from content types
552
- */
553
611
  declare function getAcceptString(contentTypes: string[]): string;
554
- /**
555
- * Check if file matches allowed content types
556
- */
557
612
  declare function isFileTypeAllowed(file: File, allowedTypes: string[]): boolean;
558
- /**
559
- * Get file icon class based on content type
560
- */
561
613
  declare function getFileIconClass(contentType: string): string;
562
- /**
563
- * Format file size for display
564
- */
565
614
  declare function formatFileSize(sizeInKb: string | number): string;
566
615
 
567
616
  /**
@@ -661,31 +710,6 @@ interface IProfilePermissionProvider {
661
710
  getUserRoles(userId: string, branchId?: string): Observable<ISingleResponse<IProfileRoleInfo[]>>;
662
711
  getUserActions(userId: string, branchId?: string): Observable<ISingleResponse<IProfileActionInfo[]>>;
663
712
  }
664
- /**
665
- * Uploaded file result with file manager ID
666
- */
667
- interface IProfileUploadResult {
668
- id: string;
669
- name: string;
670
- key: string;
671
- size: number;
672
- contentType: string;
673
- }
674
- /**
675
- * Profile Upload Options
676
- */
677
- interface IProfileUploadOptions {
678
- folderPath?: string;
679
- compress?: boolean;
680
- maxWidth?: number;
681
- maxHeight?: number;
682
- }
683
- /**
684
- * Profile Upload Provider Interface - Provides file upload functionality for profile pictures.
685
- */
686
- interface IProfileUploadProvider {
687
- uploadProfilePicture(file: File, options?: IProfileUploadOptions): Observable<ISingleResponse<IProfileUploadResult>>;
688
- }
689
713
  /**
690
714
  * Base user interface for list operations
691
715
  */
@@ -745,6 +769,24 @@ interface IUserListProvider<T extends IUserListItem = IUserListItem> {
745
769
  enrichListData?(users: T[]): Observable<T[]>;
746
770
  getExtraFilters?(): IUserListFilter[];
747
771
  }
772
+ /**
773
+ * File Provider Interface - Provides file loading and upload functionality.
774
+ * Used by FileSelectorDialogComponent to load files and handle uploads.
775
+ */
776
+ interface IFileProvider {
777
+ /** Load files with filtering and pagination */
778
+ loadFiles(filter: IFileSelectFilter): Observable<IListResponse<IFileBasicInfo>>;
779
+ /** Upload a single file and register in file manager */
780
+ uploadFile(file: File, options?: IFileUploadOptions): Observable<ISingleResponse<IUploadedFile>>;
781
+ /** Upload multiple files at once (more efficient batch upload) */
782
+ uploadMultipleFiles?(files: File[], options?: IFileUploadOptions): Observable<ISingleResponse<IUploadedFile[]>>;
783
+ /** Get file URLs by IDs (for refreshing presigned URLs) */
784
+ getFileUrls?(fileIds: string[]): Observable<ISingleResponse<IFileBasicInfo[]>>;
785
+ /** Load folders for folder selector (optional) */
786
+ loadFolders?(filter: ISelectFilter): Observable<IListResponse<IFolderBasicInfo>>;
787
+ /** Load storage configs for config selector (optional) */
788
+ loadStorageConfigs?(filter: ISelectFilter): Observable<IListResponse<IStorageConfigBasicInfo>>;
789
+ }
748
790
 
749
791
  declare enum ContactTypeEnum {
750
792
  PHONE = 1,
@@ -937,6 +979,35 @@ declare class PreventDefaultDirective {
937
979
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PreventDefaultDirective, "[appPreventDefault]", never, { "eventType": { "alias": "eventType"; "required": false; "isSignal": true; }; "preventKey": { "alias": "preventKey"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
938
980
  }
939
981
 
982
+ declare class TranslatePipe implements PipeTransform {
983
+ private readonly translateAdapter;
984
+ private readonly fallbackMessages;
985
+ transform(key: string, params?: Record<string, string | number>): string;
986
+ private getFromFallback;
987
+ private interpolate;
988
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TranslatePipe, never>;
989
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<TranslatePipe, "translate", true>;
990
+ }
991
+
992
+ interface IResolverModuleConfig {
993
+ modules: string[];
994
+ fallbackMessages?: Record<string, string>;
995
+ }
996
+ declare function resolveTranslationModule(config: IResolverModuleConfig): ResolveFn<boolean>;
997
+
998
+ /**
999
+ * Provide fallback localization when @flusys/ng-localization is not used.
1000
+ * Uses hardcoded fallback messages registered by route resolvers.
1001
+ *
1002
+ * @example
1003
+ * ```typescript
1004
+ * providers: [
1005
+ * ...provideFallbackLocalization(),
1006
+ * ]
1007
+ * ```
1008
+ */
1009
+ declare function provideFallbackLocalization(): Provider[];
1010
+
940
1011
  declare class AngularModule {
941
1012
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AngularModule, never>;
942
1013
  static ɵmod: _angular_core.ɵɵNgModuleDeclaration<AngularModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof i2.ReactiveFormsModule, typeof i3.RouterOutlet, typeof i3.RouterLink, typeof i3.RouterLinkActive, typeof IsEmptyImageDirective, typeof i1.NgOptimizedImage, typeof i1.NgComponentOutlet, typeof PreventDefaultDirective], [typeof i1.CommonModule, typeof i2.FormsModule, typeof i2.ReactiveFormsModule, typeof i3.RouterOutlet, typeof i3.RouterLink, typeof i3.RouterLinkActive, typeof IsEmptyImageDirective, typeof i1.NgOptimizedImage, typeof i1.NgComponentOutlet, typeof PreventDefaultDirective]>;
@@ -945,26 +1016,15 @@ declare class AngularModule {
945
1016
 
946
1017
  declare class PrimeModule {
947
1018
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PrimeModule, never>;
948
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<PrimeModule, never, never, [typeof i1$1.AutoCompleteModule, typeof i2$1.AvatarModule, typeof i3$1.ButtonModule, typeof i4.CardModule, typeof i5.CheckboxModule, typeof i6.ConfirmDialogModule, typeof i7.DatePickerModule, typeof i8.DialogModule, typeof i9.DividerModule, typeof i10.FileUploadModule, typeof i11.IconFieldModule, typeof i12.ImageModule, typeof i13.InputIconModule, typeof i14.InputNumberModule, typeof i15.InputTextModule, typeof i16.ListboxModule, typeof i17.MultiSelectModule, typeof i18.PaginatorModule, typeof i19.PanelModule, typeof i20.PasswordModule, typeof i21.PopoverModule, typeof i22.ProgressBarModule, typeof i23.RadioButtonModule, typeof i24.RippleModule, typeof i25.SelectButtonModule, typeof i26.SelectModule, typeof i27.SkeletonModule, typeof i28.SplitButtonModule, typeof i29.StepsModule, typeof i30.TableModule, typeof i31.TabsModule, typeof i32.TagModule, typeof i33.TextareaModule, typeof i34.ToastModule, typeof i35.ToggleSwitchModule, typeof i36.TooltipModule, typeof i37.TreeTableModule]>;
1019
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<PrimeModule, never, never, [typeof i1$1.AutoCompleteModule, typeof i2$1.AvatarModule, typeof i3$1.ButtonModule, typeof i4.CardModule, typeof i5.CheckboxModule, typeof i6.ConfirmDialogModule, typeof i7.DatePickerModule, typeof i8.DialogModule, typeof i9.DividerModule, typeof i10.FileUploadModule, typeof i11.IconFieldModule, typeof i12.ImageModule, typeof i13.InputIconModule, typeof i14.InputNumberModule, typeof i15.InputTextModule, typeof i16.ListboxModule, typeof i17.MultiSelectModule, typeof i18.PaginatorModule, typeof i19.PanelModule, typeof i20.PasswordModule, typeof i21.PopoverModule, typeof i22.ProgressBarModule, typeof i23.RadioButtonModule, typeof i24.RippleModule, typeof i25.SelectButtonModule, typeof i26.SelectModule, typeof i27.SkeletonModule, typeof i28.SplitButtonModule, typeof i29.StepsModule, typeof i30.TableModule, typeof i31.TabsModule, typeof i32.TagModule, typeof i33.TextareaModule, typeof i34.ToastModule, typeof i35.ToggleButtonModule, typeof i36.ToggleSwitchModule, typeof i37.TooltipModule, typeof i38.TreeTableModule, typeof i39.ProgressSpinnerModule, typeof i40.ColorPickerModule]>;
949
1020
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<PrimeModule>;
950
1021
  }
951
1022
 
952
- /** Service names that can be used for feature-specific base URLs */
953
- type ServiceName = 'auth' | 'administration' | 'iam' | 'storage' | 'formBuilder' | 'email';
1023
+ type ServiceName = 'auth' | 'administration' | 'iam' | 'storage' | 'formBuilder' | 'email' | 'eventManager' | 'notification';
954
1024
 
955
1025
  /**
956
1026
  * Service interface for CRUD operations.
957
- * Matches NestJS shared API controller endpoints:
958
- *
959
- * | Angular Method | HTTP | NestJS Endpoint | Response Type |
960
- * |------------------|--------|------------------------|------------------------|
961
- * | insert() | POST | /{resource}/insert | ISingleResponse<T> |
962
- * | insertMany() | POST | /{resource}/insert-many| IBulkResponse<T> |
963
- * | findById() | POST | /{resource}/get/:id | ISingleResponse<T> |
964
- * | getAll() | POST | /{resource}/get-all | IListResponse<T> |
965
- * | update() | POST | /{resource}/update | ISingleResponse<T> |
966
- * | updateMany() | POST | /{resource}/update-many| IBulkResponse<T> |
967
- * | delete() | POST | /{resource}/delete | IMessageResponse |
1027
+ * Matches NestJS shared API controller endpoints (all POST, RPC-style).
968
1028
  */
969
1029
  interface IApiService<DtoT, InterfaceT> {
970
1030
  insert(dto: DtoT): Observable<ISingleResponse<InterfaceT>>;
@@ -978,51 +1038,15 @@ interface IApiService<DtoT, InterfaceT> {
978
1038
  /**
979
1039
  * Abstract base class for API services using Angular 21 resource() API.
980
1040
  * Provides signal-based reactive data fetching with automatic loading states.
981
- * Response types match FLUSYS_NEST backend DTOs.
982
- *
983
- * ## Endpoint Mapping
984
- *
985
- * All endpoints use POST method (RPC-style API):
986
- * - `POST /{resource}/insert` - Create single item
987
- * - `POST /{resource}/insert-many` - Create multiple items
988
- * - `POST /{resource}/get/:id` - Get single item by ID
989
- * - `POST /{resource}/get-all?q=` - List with pagination/filter
990
- * - `POST /{resource}/update` - Update single item
991
- * - `POST /{resource}/update-many` - Update multiple items
992
- * - `POST /{resource}/delete` - Delete/restore/permanent delete
993
1041
  *
994
1042
  * @example
995
1043
  * ```typescript
996
- * // Define service with global apiBaseUrl
997
1044
  * @Injectable({ providedIn: 'root' })
998
1045
  * export class UserService extends ApiResourceService<UserDto, User> {
999
1046
  * constructor() {
1000
1047
  * super('auth/users', inject(HttpClient));
1001
1048
  * }
1002
1049
  * }
1003
- *
1004
- * // Define service with feature-specific baseUrl
1005
- * @Injectable({ providedIn: 'root' })
1006
- * export class FormService extends ApiResourceService<FormDto, Form> {
1007
- * constructor() {
1008
- * super('form', inject(HttpClient), 'formBuilder');
1009
- * // URL: services.formBuilder.baseUrl + '/form'
1010
- * }
1011
- * }
1012
- *
1013
- * // In component - use signals
1014
- * userService = inject(UserService);
1015
- * users = this.userService.data; // Signal<User[]>
1016
- * isLoading = this.userService.isLoading; // Signal<boolean>
1017
- * total = this.userService.total; // Signal<number>
1018
- *
1019
- * // Trigger fetch
1020
- * this.userService.fetchList('search', { pagination: { currentPage: 0, pageSize: 10 } });
1021
- *
1022
- * // CRUD operations
1023
- * await this.userService.insertAsync({ name: 'John', email: 'john@example.com' });
1024
- * await this.userService.updateAsync({ id: '123', name: 'John Updated' });
1025
- * await this.userService.deleteAsync({ id: '123', type: 'delete' });
1026
1050
  * ```
1027
1051
  */
1028
1052
  declare abstract class ApiResourceService<DtoT, InterfaceT> implements IApiService<DtoT, InterfaceT> {
@@ -1030,149 +1054,41 @@ declare abstract class ApiResourceService<DtoT, InterfaceT> implements IApiServi
1030
1054
  protected readonly injector: Injector;
1031
1055
  protected readonly http: HttpClient;
1032
1056
  protected readonly moduleApiName: string;
1033
- /** Current search term */
1034
1057
  readonly searchTerm: _angular_core.WritableSignal<string>;
1035
- /** Current filter and pagination state */
1036
1058
  readonly filterData: _angular_core.WritableSignal<IFilterData>;
1037
- /**
1038
- * Resource for list data - lazy initialized to prevent auto-fetch on service injection.
1039
- * Call initListResource() or any list method (fetchList, reload, etc.) to initialize.
1040
- */
1041
1059
  private _listResource;
1042
- /** Whether the list resource has been initialized */
1043
1060
  private _resourceInitialized;
1044
- /**
1045
- * Signal to track resource initialization for computed signals.
1046
- * This allows computed signals to re-evaluate when the resource is created.
1047
- * Without this, computed signals would not detect when _listResource changes from null.
1048
- */
1049
1061
  private readonly _resourceInitSignal;
1050
- /** Get or create the list resource (lazy initialization) */
1051
1062
  get listResource(): ResourceRef<IListResponse<InterfaceT> | undefined>;
1052
- /**
1053
- * Initialize the list resource. Called automatically when accessing listResource
1054
- * or any list-related computed signals/methods.
1055
- * Uses runInInjectionContext to support lazy initialization outside constructor.
1056
- */
1057
1063
  initListResource(): void;
1058
- /**
1059
- * Whether data is currently loading.
1060
- * Tracks _resourceInitSignal to re-evaluate when resource is created.
1061
- */
1062
1064
  readonly isLoading: _angular_core.Signal<boolean>;
1063
- /**
1064
- * List data array.
1065
- * Tracks _resourceInitSignal to re-evaluate when resource is created.
1066
- */
1067
1065
  readonly data: _angular_core.Signal<InterfaceT[]>;
1068
- /**
1069
- * Total count of items.
1070
- * Tracks _resourceInitSignal to re-evaluate when resource is created.
1071
- */
1072
1066
  readonly total: _angular_core.Signal<number>;
1073
- /**
1074
- * Pagination metadata.
1075
- * Tracks _resourceInitSignal to re-evaluate when resource is created.
1076
- */
1077
1067
  readonly pageInfo: _angular_core.Signal<_flusys_ng_shared.IPaginationMeta | undefined>;
1078
- /**
1079
- * Whether there are more pages.
1080
- * Tracks _resourceInitSignal to re-evaluate when resource is created.
1081
- */
1082
1068
  readonly hasMore: _angular_core.Signal<boolean>;
1083
- /**
1084
- * @param moduleApiName - The API resource path (e.g., 'form' for /form-builder/form)
1085
- * @param http - HttpClient instance
1086
- * @param serviceName - Optional service name for feature-specific base URL (e.g., 'formBuilder')
1087
- */
1088
1069
  constructor(moduleApiName: string, http: HttpClient, serviceName?: ServiceName);
1089
1070
  protected getHttpOptions(endpoint: string, params?: HttpParams): {
1090
1071
  params?: HttpParams | undefined;
1091
1072
  headers: HttpHeaders;
1092
1073
  };
1093
- /**
1094
- * Fetch list data (triggers resource initialization and reload)
1095
- */
1096
1074
  fetchList(search?: string, filter?: Partial<IFilterData>): void;
1097
- /**
1098
- * Update pagination
1099
- */
1100
1075
  setPagination(pagination: IPagination): void;
1101
- /**
1102
- * Go to next page
1103
- */
1104
1076
  nextPage(): void;
1105
- /**
1106
- * Reset to first page
1107
- */
1108
1077
  resetPagination(): void;
1109
- /**
1110
- * Reload current data
1111
- */
1112
1078
  reload(): void;
1113
- /**
1114
- * Insert single item (Observable)
1115
- * POST /{resource}/insert
1116
- */
1117
1079
  insert(dto: DtoT): Observable<ISingleResponse<InterfaceT>>;
1118
- /**
1119
- * Insert multiple items (Observable)
1120
- * POST /{resource}/insert-many
1121
- */
1122
1080
  insertMany(dtos: DtoT[]): Observable<IBulkResponse<InterfaceT>>;
1123
- /**
1124
- * Find single item by ID (Observable)
1125
- * POST /{resource}/get/:id
1126
- */
1127
1081
  findById(id: string, select?: string[]): Observable<ISingleResponse<InterfaceT>>;
1128
- /**
1129
- * Get all items with pagination (Observable)
1130
- * POST /{resource}/get-all?q=search
1131
- */
1132
1082
  getAll(search: string, filter: IFilterData): Observable<IListResponse<InterfaceT>>;
1133
- /**
1134
- * Update single item (Observable)
1135
- * POST /{resource}/update
1136
- */
1137
1083
  update(dto: DtoT): Observable<ISingleResponse<InterfaceT>>;
1138
- /**
1139
- * Update multiple items (Observable)
1140
- * POST /{resource}/update-many
1141
- */
1142
1084
  updateMany(dtos: DtoT[]): Observable<IBulkResponse<InterfaceT>>;
1143
- /**
1144
- * Delete items (Observable)
1145
- * POST /{resource}/delete
1146
- * @param deleteDto - { id: string | string[], type: 'delete' | 'restore' | 'permanent' }
1147
- */
1148
1085
  delete(deleteDto: IDeleteData): Observable<IMessageResponse>;
1149
- /**
1150
- * Fetch paginated list (async)
1151
- */
1152
- protected fetchAllAsync(search: string, filter: IFilterData): Promise<IListResponse<InterfaceT>>;
1153
- /**
1154
- * Find single item by ID (async)
1155
- */
1086
+ getAllAsync(filter: IFilterData, search?: string): Promise<IListResponse<InterfaceT>>;
1156
1087
  findByIdAsync(id: string, select?: string[]): Promise<ISingleResponse<InterfaceT>>;
1157
- /**
1158
- * Insert single item (async)
1159
- */
1160
1088
  insertAsync(dto: DtoT): Promise<ISingleResponse<InterfaceT>>;
1161
- /**
1162
- * Insert multiple items (async)
1163
- */
1164
1089
  insertManyAsync(dtos: DtoT[]): Promise<IBulkResponse<InterfaceT>>;
1165
- /**
1166
- * Update single item (async)
1167
- */
1168
1090
  updateAsync(dto: DtoT): Promise<ISingleResponse<InterfaceT>>;
1169
- /**
1170
- * Update multiple items (async)
1171
- */
1172
1091
  updateManyAsync(dtos: DtoT[]): Promise<IBulkResponse<InterfaceT>>;
1173
- /**
1174
- * Delete items (async)
1175
- */
1176
1092
  deleteAsync(deleteDto: IDeleteData): Promise<IMessageResponse>;
1177
1093
  }
1178
1094
 
@@ -1282,12 +1198,16 @@ declare class IconComponent {
1282
1198
  * - Reactive forms: `[formControl]="ctrl"` or `formControlName="field"`
1283
1199
  * - Signal forms: `[formField]="formTree.field"`
1284
1200
  */
1285
- declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null> {
1286
- private readonly destroyRef;
1201
+ declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null> implements OnDestroy {
1202
+ private readonly document;
1203
+ private readonly appRef;
1204
+ private readonly translateAdapter;
1287
1205
  private readonly onDocumentClickBound;
1288
- private isDestroyed;
1289
1206
  readonly pSelectRef: _angular_core.Signal<ElementRef<HTMLDivElement>>;
1207
+ readonly overlayTemplate: _angular_core.Signal<TemplateRef<unknown>>;
1208
+ private overlayViewRef;
1290
1209
  readonly placeHolder: _angular_core.InputSignal<string>;
1210
+ readonly displayPlaceholder: _angular_core.Signal<string>;
1291
1211
  readonly isEditMode: _angular_core.InputSignal<boolean>;
1292
1212
  readonly isLoading: _angular_core.InputSignal<boolean>;
1293
1213
  readonly total: _angular_core.InputSignal<number | undefined>;
@@ -1301,15 +1221,18 @@ declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null>
1301
1221
  readonly selectedValueDisplay: _angular_core.Signal<string>;
1302
1222
  readonly isSelectAll: _angular_core.Signal<boolean>;
1303
1223
  constructor();
1224
+ ngOnDestroy(): void;
1304
1225
  onScroll(event: Event): void;
1305
- onSelectClick(event: Event): void;
1226
+ onSelectClick(): void;
1227
+ private openOverlay;
1228
+ private closeOverlay;
1306
1229
  onOverlayClick(event: Event): void;
1307
1230
  private handleDocumentClick;
1308
1231
  isSelected(data: IDropDown): boolean;
1309
- key(option: IDropDown): string;
1310
1232
  selectValue(event: CheckboxChangeEvent, option: IDropDown): void;
1311
1233
  changeSelectAll(event: CheckboxChangeEvent): void;
1312
1234
  clear(event: Event): void;
1235
+ private t;
1313
1236
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LazyMultiSelectComponent, never>;
1314
1237
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LazyMultiSelectComponent, "lib-lazy-multi-select", never, { "placeHolder": { "alias": "placeHolder"; "required": false; "isSignal": true; }; "isEditMode": { "alias": "isEditMode"; "required": true; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": true; "isSignal": true; }; "total": { "alias": "total"; "required": true; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": true; "isSignal": true; }; "selectDataList": { "alias": "selectDataList"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onSearch": "onSearch"; "onPagination": "onPagination"; }, never, never, true, never>;
1315
1238
  }
@@ -1324,11 +1247,13 @@ declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null>
1324
1247
  */
1325
1248
  declare class LazySelectComponent extends BaseFormControl<string | null> {
1326
1249
  private readonly destroyRef;
1250
+ private readonly translateAdapter;
1327
1251
  private readonly onScrollBound;
1328
1252
  private scrollTargetEl;
1329
1253
  private isDestroyed;
1330
1254
  readonly scrollContainer: _angular_core.Signal<ElementRef<HTMLDivElement>>;
1331
1255
  readonly placeHolder: _angular_core.InputSignal<string>;
1256
+ readonly displayPlaceholder: _angular_core.Signal<string>;
1332
1257
  readonly optionLabel: _angular_core.InputSignal<string>;
1333
1258
  readonly optionValue: _angular_core.InputSignal<string>;
1334
1259
  readonly isEditMode: _angular_core.InputSignal<boolean>;
@@ -1345,6 +1270,7 @@ declare class LazySelectComponent extends BaseFormControl<string | null> {
1345
1270
  onScroll(event: Event): void;
1346
1271
  showPanel(): void;
1347
1272
  onBlur(): void;
1273
+ private t;
1348
1274
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LazySelectComponent, never>;
1349
1275
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LazySelectComponent, "lib-lazy-select", never, { "placeHolder": { "alias": "placeHolder"; "required": false; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": true; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": true; "isSignal": true; }; "isEditMode": { "alias": "isEditMode"; "required": true; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": true; "isSignal": true; }; "total": { "alias": "total"; "required": true; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": true; "isSignal": true; }; "selectDataList": { "alias": "selectDataList"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onSearch": "onSearch"; "onPagination": "onPagination"; }, never, never, true, never>;
1350
1276
  }
@@ -1360,6 +1286,7 @@ declare abstract class BaseUserSelectComponent {
1360
1286
  protected readonly destroyRef: DestroyRef;
1361
1287
  protected readonly injector: Injector;
1362
1288
  protected readonly userProvider: IUserProvider;
1289
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
1363
1290
  protected abortController: AbortController | null;
1364
1291
  readonly loadUsers: _angular_core.InputSignal<LoadUsersFn | undefined>;
1365
1292
  readonly placeHolder: _angular_core.InputSignal<string>;
@@ -1374,6 +1301,7 @@ declare abstract class BaseUserSelectComponent {
1374
1301
  readonly pagination: _angular_core.WritableSignal<IPagination>;
1375
1302
  readonly searchTerm: _angular_core.WritableSignal<string>;
1376
1303
  readonly dropdownUsers: _angular_core.Signal<IDropDown[]>;
1304
+ readonly displayPlaceholder: _angular_core.Signal<string>;
1377
1305
  constructor();
1378
1306
  /** Setup effect to track value changes and emit selection events */
1379
1307
  protected abstract setupValueEffect(): void;
@@ -1384,6 +1312,7 @@ declare abstract class BaseUserSelectComponent {
1384
1312
  protected fetchUsers(append?: boolean): Promise<void>;
1385
1313
  /** Load users from USER_PROVIDER with active filter */
1386
1314
  private loadUsersFromProvider;
1315
+ protected t(key: string, variables?: Record<string, string | number>): string;
1387
1316
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseUserSelectComponent, never>;
1388
1317
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseUserSelectComponent, never, never, { "loadUsers": { "alias": "loadUsers"; "required": false; "isSignal": true; }; "placeHolder": { "alias": "placeHolder"; "required": false; "isSignal": true; }; "isEditMode": { "alias": "isEditMode"; "required": true; "isSignal": true; }; "filterActive": { "alias": "filterActive"; "required": false; "isSignal": true; }; "additionalFilters": { "alias": "additionalFilters"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; }, { "onError": "onError"; }, never, never, true, never>;
1389
1318
  }
@@ -1462,11 +1391,33 @@ declare class UserMultiSelectComponent extends BaseUserSelectComponent {
1462
1391
  /**
1463
1392
  * File Uploader Component - Drag & drop file upload with type filtering.
1464
1393
  *
1465
- * Pass your own `uploadFile` function - works with any storage API.
1394
+ * Uses FILE_PROVIDER when available (no inputs needed).
1395
+ * Optionally pass `uploadFile` to override the provider.
1396
+ *
1397
+ * @example
1398
+ * ```html
1399
+ * <!-- Using FILE_PROVIDER (recommended) -->
1400
+ * <lib-file-uploader
1401
+ * [acceptTypes]="['image/*']"
1402
+ * (fileUploaded)="onFileUploaded($event)"
1403
+ * />
1404
+ *
1405
+ * <!-- Custom upload function -->
1406
+ * <lib-file-uploader
1407
+ * [uploadFile]="customUploadFn"
1408
+ * (fileUploaded)="onFileUploaded($event)"
1409
+ * />
1410
+ * ```
1466
1411
  */
1467
1412
  declare class FileUploaderComponent {
1468
1413
  private readonly messageService;
1469
- readonly uploadFile: _angular_core.InputSignal<UploadFileFn>;
1414
+ private readonly translateAdapter;
1415
+ private readonly fileProvider;
1416
+ readonly uploadFile: _angular_core.InputSignal<UploadFileFn | undefined>;
1417
+ readonly uploadMultipleFiles: _angular_core.InputSignal<UploadMultipleFilesFn | undefined>;
1418
+ readonly hasUploadCapability: _angular_core.Signal<boolean>;
1419
+ private getUploadFn;
1420
+ private getUploadMultipleFn;
1470
1421
  readonly acceptTypes: _angular_core.InputSignal<string[]>;
1471
1422
  readonly multiple: _angular_core.InputSignal<boolean>;
1472
1423
  readonly maxFiles: _angular_core.InputSignal<number>;
@@ -1493,67 +1444,55 @@ declare class FileUploaderComponent {
1493
1444
  private handleFiles;
1494
1445
  removeFile(file: File): void;
1495
1446
  uploadFiles(files?: File[]): Promise<void>;
1447
+ private uploadBatch;
1448
+ private uploadSequential;
1496
1449
  getFileIcon(file: File): string;
1497
1450
  formatSize(bytes: number): string;
1451
+ private t;
1498
1452
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileUploaderComponent, never>;
1499
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileUploaderComponent, "lib-file-uploader", never, { "uploadFile": { "alias": "uploadFile"; "required": true; "isSignal": true; }; "acceptTypes": { "alias": "acceptTypes"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "maxSizeMb": { "alias": "maxSizeMb"; "required": false; "isSignal": true; }; "uploadOptions": { "alias": "uploadOptions"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showPreview": { "alias": "showPreview"; "required": false; "isSignal": true; }; "autoUpload": { "alias": "autoUpload"; "required": false; "isSignal": true; }; }, { "fileUploaded": "fileUploaded"; "filesUploaded": "filesUploaded"; "onError": "onError"; "fileSelected": "fileSelected"; }, never, never, true, never>;
1453
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileUploaderComponent, "lib-file-uploader", never, { "uploadFile": { "alias": "uploadFile"; "required": false; "isSignal": true; }; "uploadMultipleFiles": { "alias": "uploadMultipleFiles"; "required": false; "isSignal": true; }; "acceptTypes": { "alias": "acceptTypes"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "maxSizeMb": { "alias": "maxSizeMb"; "required": false; "isSignal": true; }; "uploadOptions": { "alias": "uploadOptions"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showPreview": { "alias": "showPreview"; "required": false; "isSignal": true; }; "autoUpload": { "alias": "autoUpload"; "required": false; "isSignal": true; }; }, { "fileUploaded": "fileUploaded"; "filesUploaded": "filesUploaded"; "onError": "onError"; "fileSelected": "fileSelected"; }, never, never, true, never>;
1500
1454
  }
1501
1455
 
1502
1456
  /**
1503
- * File Selector Dialog - Browse and select existing files with filtering.
1457
+ * File Selector Dialog - Self-contained file browser with upload support.
1504
1458
  *
1505
- * Pass your own `loadFiles` function - works with any storage API.
1459
+ * Uses FILE_PROVIDER internally - no external functions needed.
1460
+ * Just configure with inputs and handle selection events.
1506
1461
  *
1507
1462
  * Features:
1508
1463
  * - Search with debouncing
1509
- * - File type filtering
1464
+ * - File type filtering (acceptTypes)
1465
+ * - Folder filtering
1510
1466
  * - Infinite scroll pagination
1511
1467
  * - Single or multiple selection
1468
+ * - Built-in file upload (withUploader)
1512
1469
  * - File preview with icons
1513
1470
  *
1514
1471
  * @example
1515
- * ```typescript
1516
- * // In component
1517
- * readonly fileService = inject(FileManagerApiService);
1518
- *
1519
- * readonly loadFiles: LoadFilesFn = (filter) =>
1520
- * this.fileService.getAll(filter.search, {
1521
- * pagination: { currentPage: filter.page, pageSize: filter.pageSize },
1522
- * filter: { contentTypes: filter.contentTypes },
1523
- * }).pipe(
1524
- * map(res => ({
1525
- * ...res,
1526
- * data: res.data?.map(f => ({
1527
- * id: f.id,
1528
- * name: f.name,
1529
- * contentType: f.contentType,
1530
- * size: f.size,
1531
- * url: f.url
1532
- * }))
1533
- * }))
1534
- * );
1535
- * ```
1536
- *
1537
1472
  * ```html
1538
1473
  * <lib-file-selector-dialog
1539
- * [(visible)]="showFileSelector"
1540
- * [loadFiles]="loadFiles"
1474
+ * [(visible)]="showSelector"
1541
1475
  * [acceptTypes]="['image/*']"
1542
- * [multiple]="false"
1543
- * (fileSelected)="onFileSelected($event)"
1476
+ * [multiple]="true"
1477
+ * [withUploader]="true"
1478
+ * (filesSelected)="onFilesSelected($event)"
1544
1479
  * />
1545
1480
  * ```
1546
1481
  */
1547
1482
  declare class FileSelectorDialogComponent {
1548
1483
  private readonly destroyRef;
1484
+ private readonly translateAdapter;
1485
+ readonly fileProvider: _flusys_ng_shared.IFileProvider | null;
1549
1486
  private abortController;
1550
1487
  private searchDebounceTimer;
1551
- readonly loadFiles: _angular_core.InputSignal<LoadFilesFn>;
1552
- readonly header: _angular_core.InputSignal<string>;
1488
+ readonly header: _angular_core.InputSignal<string | undefined>;
1553
1489
  readonly acceptTypes: _angular_core.InputSignal<string[]>;
1554
1490
  readonly multiple: _angular_core.InputSignal<boolean>;
1491
+ readonly dialogHeader: _angular_core.Signal<string>;
1555
1492
  readonly maxSelection: _angular_core.InputSignal<number>;
1556
1493
  readonly pageSize: _angular_core.InputSignal<number>;
1494
+ readonly folderId: _angular_core.InputSignal<string | undefined>;
1495
+ readonly withUploader: _angular_core.InputSignal<boolean>;
1557
1496
  readonly visible: _angular_core.ModelSignal<boolean>;
1558
1497
  readonly fileSelected: _angular_core.OutputEmitterRef<IFileBasicInfo>;
1559
1498
  readonly filesSelected: _angular_core.OutputEmitterRef<IFileBasicInfo[]>;
@@ -1565,7 +1504,19 @@ declare class FileSelectorDialogComponent {
1565
1504
  readonly total: _angular_core.WritableSignal<number | undefined>;
1566
1505
  readonly pagination: _angular_core.WritableSignal<IPagination>;
1567
1506
  readonly searchTerm: _angular_core.WritableSignal<string>;
1568
- readonly acceptString: _angular_core.Signal<string>;
1507
+ readonly folders: _angular_core.WritableSignal<IFolderBasicInfo[]>;
1508
+ readonly selectedFolderId: _angular_core.WritableSignal<string | null>;
1509
+ readonly foldersLoading: _angular_core.WritableSignal<boolean>;
1510
+ readonly foldersPagination: _angular_core.WritableSignal<IPagination>;
1511
+ readonly foldersTotal: _angular_core.WritableSignal<number | undefined>;
1512
+ readonly storageConfigs: _angular_core.WritableSignal<IStorageConfigBasicInfo[]>;
1513
+ readonly selectedStorageConfigId: _angular_core.WritableSignal<string | null>;
1514
+ readonly storageConfigsLoading: _angular_core.WritableSignal<boolean>;
1515
+ readonly storageConfigsPagination: _angular_core.WritableSignal<IPagination>;
1516
+ readonly storageConfigsTotal: _angular_core.WritableSignal<number | undefined>;
1517
+ readonly effectiveStorageConfigId: _angular_core.Signal<string | undefined>;
1518
+ readonly uploadFileFn: (file: File, options?: IFileUploadOptions) => rxjs.Observable<_flusys_ng_shared.ISingleResponse<IUploadedFile>>;
1519
+ readonly uploadMultipleFilesFn: ((files: File[], options?: IFileUploadOptions) => rxjs.Observable<_flusys_ng_shared.ISingleResponse<IUploadedFile[]>>) | undefined;
1569
1520
  constructor();
1570
1521
  onSearchChange(value: string): void;
1571
1522
  onScroll(event: Event): void;
@@ -1578,10 +1529,22 @@ declare class FileSelectorDialogComponent {
1578
1529
  onCancel(): void;
1579
1530
  onConfirm(): void;
1580
1531
  onDialogHide(): void;
1532
+ onFolderChange(folderId: string | null): void;
1533
+ onFolderSearch(event: {
1534
+ filter: string;
1535
+ }): void;
1536
+ loadFolders(search?: string): Promise<void>;
1537
+ onStorageConfigChange(configId: string | null): void;
1538
+ onStorageConfigSearch(event: {
1539
+ filter: string;
1540
+ }): void;
1541
+ loadStorageConfigs(search?: string): Promise<void>;
1542
+ onFileUploaded(uploadedFile: IUploadedFile): void;
1581
1543
  private resetState;
1582
1544
  private fetchFiles;
1545
+ private t;
1583
1546
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileSelectorDialogComponent, never>;
1584
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileSelectorDialogComponent, "lib-file-selector-dialog", never, { "loadFiles": { "alias": "loadFiles"; "required": true; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "acceptTypes": { "alias": "acceptTypes"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSelection": { "alias": "maxSelection"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; "fileSelected": "fileSelected"; "filesSelected": "filesSelected"; "closed": "closed"; "onError": "onError"; }, never, never, true, never>;
1547
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileSelectorDialogComponent, "lib-file-selector-dialog", never, { "header": { "alias": "header"; "required": false; "isSignal": true; }; "acceptTypes": { "alias": "acceptTypes"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSelection": { "alias": "maxSelection"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "folderId": { "alias": "folderId"; "required": false; "isSignal": true; }; "withUploader": { "alias": "withUploader"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; "fileSelected": "fileSelected"; "filesSelected": "filesSelected"; "closed": "closed"; "onError": "onError"; }, never, never, true, never>;
1585
1548
  }
1586
1549
 
1587
1550
  /**
@@ -1637,14 +1600,6 @@ declare const AUTH_STATE_PROVIDER: InjectionToken<IAuthStateProvider>;
1637
1600
  * Use with `inject(PROFILE_PERMISSION_PROVIDER, { optional: true })`.
1638
1601
  */
1639
1602
  declare const PROFILE_PERMISSION_PROVIDER: InjectionToken<IProfilePermissionProvider>;
1640
- /**
1641
- * Profile Upload Provider Token
1642
- *
1643
- * Provides file upload functionality for profile pictures.
1644
- * Optional - if not configured or storage not enabled, upload section is hidden.
1645
- * Use with `inject(PROFILE_UPLOAD_PROVIDER, { optional: true })`.
1646
- */
1647
- declare const PROFILE_UPLOAD_PROVIDER: InjectionToken<IProfileUploadProvider>;
1648
1603
  /**
1649
1604
  * User List Provider Token
1650
1605
  *
@@ -1659,6 +1614,20 @@ declare const PROFILE_UPLOAD_PROVIDER: InjectionToken<IProfileUploadProvider>;
1659
1614
  * ]
1660
1615
  */
1661
1616
  declare const USER_LIST_PROVIDER: InjectionToken<IUserListProvider<IUserListItem>>;
1617
+ /**
1618
+ * File Provider Token
1619
+ *
1620
+ * Provides file loading and upload functionality for file selectors.
1621
+ * Optional - if not configured, file selector requires loadFiles/uploadFile inputs.
1622
+ * Use with `inject(FILE_PROVIDER, { optional: true })`.
1623
+ *
1624
+ * @example
1625
+ * // In app.config.ts
1626
+ * providers: [
1627
+ * { provide: FILE_PROVIDER, useClass: StorageFileProvider },
1628
+ * ]
1629
+ */
1630
+ declare const FILE_PROVIDER: InjectionToken<IFileProvider>;
1662
1631
 
1663
1632
  /**
1664
1633
  * Permission Guard - Single permission or ILogicNode check.
@@ -1712,8 +1681,7 @@ declare function allPermissionsGuard(permissions: string[], redirectTo?: string)
1712
1681
  * @Component({
1713
1682
  * selector: 'app-product-form',
1714
1683
  * standalone: true,
1715
- * changeDetection: ChangeDetectionStrategy.OnPush,
1716
- * template: `...`
1684
+ * * template: `...`
1717
1685
  * })
1718
1686
  * export class ProductFormComponent extends BaseFormPage<IProduct, IProductFormModel> {
1719
1687
  * private readonly productService = inject(ProductApiService);
@@ -1780,6 +1748,7 @@ declare abstract class BaseFormPage<T, TFormModel> {
1780
1748
  protected readonly route: ActivatedRoute;
1781
1749
  protected readonly messageService: MessageService;
1782
1750
  protected readonly destroyRef: DestroyRef;
1751
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
1783
1752
  protected readonly routeParams: Signal<i3.ParamMap | undefined>;
1784
1753
  protected initialized: boolean;
1785
1754
  /** Loading state for async operations */
@@ -1852,6 +1821,10 @@ declare abstract class BaseFormPage<T, TFormModel> {
1852
1821
  * @param detail The error message to display
1853
1822
  */
1854
1823
  protected showError(detail: string): void;
1824
+ /**
1825
+ * Translate a key using the adapter, fallback to key if not available.
1826
+ */
1827
+ protected t(key: string, variables?: Record<string, string | number>): string;
1855
1828
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseFormPage<any, any>, never>;
1856
1829
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseFormPage<any, any>, never, never, {}, {}, never, never, true, never>;
1857
1830
  }
@@ -1885,6 +1858,7 @@ declare abstract class BaseListPage<T> {
1885
1858
  protected readonly appConfig: _flusys_ng_core.IAppConfig;
1886
1859
  protected readonly confirmationService: ConfirmationService;
1887
1860
  protected readonly destroyRef: DestroyRef;
1861
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
1888
1862
  /** Items list */
1889
1863
  readonly items: _angular_core.WritableSignal<T[]>;
1890
1864
  /** Loading state */
@@ -1955,6 +1929,10 @@ declare abstract class BaseListPage<T> {
1955
1929
  * Show warning toast message
1956
1930
  */
1957
1931
  protected showWarn(detail: string, summary?: string): void;
1932
+ /**
1933
+ * Translate a key using the adapter, fallback to key if not available.
1934
+ */
1935
+ protected t(key: string, variables?: Record<string, string | number>): string;
1958
1936
  /**
1959
1937
  * Delete an item with confirmation dialog
1960
1938
  * @param item The item to delete
@@ -2037,5 +2015,5 @@ interface ScrollPaginationConfig {
2037
2015
  */
2038
2016
  declare function checkScrollPagination(event: Event, config: ScrollPaginationConfig): IPagination | null;
2039
2017
 
2040
- export { ACTION_PERMISSIONS, AUTH_STATE_PROVIDER, AngularModule, ApiResourceService, ApiResourceService as ApiService, BRANCH_PERMISSIONS, BaseFormControl, BaseFormPage, BaseListPage, BaseUserSelectComponent, COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, COMPANY_PERMISSIONS, ContactTypeEnum, CookieService, EMAIL_CONFIG_PERMISSIONS, EMAIL_TEMPLATE_PERMISSIONS, EditModeElementChangerDirective, FILE_PERMISSIONS, FILE_TYPE_FILTERS, FOLDER_PERMISSIONS, FORM_PERMISSIONS, FileSelectorDialogComponent, FileUploaderComponent, FileUrlService, HasPermissionDirective, IconComponent, IconTypeEnum, IsEmptyImageDirective, LazyMultiSelectComponent, LazySelectComponent, PERMISSIONS, PROFILE_PERMISSION_PROVIDER, PROFILE_UPLOAD_PROVIDER, PermissionValidatorService, PlatformService, PreventDefaultDirective, PrimeModule, ROLE_ACTION_PERMISSIONS, ROLE_PERMISSIONS, STORAGE_CONFIG_PERMISSIONS, USER_ACTION_PERMISSIONS, USER_LIST_PROVIDER, USER_PERMISSIONS, USER_PERMISSION_PROVIDER, USER_PROVIDER, USER_ROLE_PERMISSIONS, UserMultiSelectComponent, UserSelectComponent, allPermissionsGuard, anyPermissionGuard, checkScrollPagination, evaluateLogicNode, evaluatePermission, formatFileSize, getAcceptString, getFileIconClass, hasAllPermissions, hasAnyPermission, hasPermission, isFileTypeAllowed, permissionGuard, provideValueAccessor };
2041
- export type { ApiResponse, DeleteType, FilesResponseDto, GetFileUrlsFn, IActionNode, IActivatable, IApiService, IAuthStateProvider, IBaseEntity, IBulkMeta, IBulkResponse, ICompanyApiProvider, ICompanyBasicInfo, IDeleteData, IDropDown, IErrorResponse, IFileBasicInfo, IFileData, IFileSelectFilter, IFileUploadOptions, IFilter, IFilterData, IGroupNode, IListResponse, ILoggedUserInfo, ILogicNode, ILoginResponse, ILoginUserData, IMessageResponse, IMetadata, IOrderable, IPagination, IPaginationMeta, IProfileActionInfo, IProfilePermissionProvider, IProfileRoleInfo, IProfileUploadOptions, IProfileUploadProvider, IProfileUploadResult, IRefreshTokenResponse, IRequestMeta, ISingleResponse, ISoftDeletable, ISort, ITimestampable, IUploadedFile, IUserBasicInfo, IUserBranchPayload, IUserBranchPermission, IUserCompanyPayload, IUserListAction, IUserListColumn, IUserListFilter, IUserListItem, IUserListProvider, IUserPermissionProvider, IUserProvider, IUserSelectFilter, IValidationError, LoadFilesFn, LoadUsersFn, PermissionCode, ScrollPaginationConfig, ServiceName, UploadFileFn };
2018
+ export { ACTION_PERMISSIONS, AUTH_STATE_PROVIDER, AngularModule, ApiResourceService, ApiResourceService as ApiService, BRANCH_PERMISSIONS, BaseFormControl, BaseFormPage, BaseListPage, BaseUserSelectComponent, COMPANY_ACTION_PERMISSIONS, COMPANY_API_PROVIDER, COMPANY_PERMISSIONS, ContactTypeEnum, CookieService, EMAIL_CONFIG_PERMISSIONS, EMAIL_TEMPLATE_PERMISSIONS, EVENT_PARTICIPANT_PERMISSIONS, EVENT_PERMISSIONS, EditModeElementChangerDirective, FILE_PERMISSIONS, FILE_PROVIDER, FILE_TYPE_FILTERS, FOLDER_PERMISSIONS, FORM_PERMISSIONS, FileSelectorDialogComponent, FileUploaderComponent, FileUrlService, HasPermissionDirective, IconComponent, IconTypeEnum, IsEmptyImageDirective, LANGUAGE_PERMISSIONS, LazyMultiSelectComponent, LazySelectComponent, NOTIFICATION_PERMISSIONS, PERMISSIONS, PROFILE_PERMISSION_PROVIDER, PermissionValidatorService, PlatformService, PreventDefaultDirective, PrimeModule, ROLE_ACTION_PERMISSIONS, ROLE_PERMISSIONS, SHARED_MESSAGES, STORAGE_CONFIG_PERMISSIONS, TRANSLATION_KEY_PERMISSIONS, TRANSLATION_PERMISSIONS, TranslatePipe, USER_ACTION_PERMISSIONS, USER_LIST_PROVIDER, USER_PERMISSIONS, USER_PERMISSION_PROVIDER, USER_PROVIDER, USER_ROLE_PERMISSIONS, UserMultiSelectComponent, UserSelectComponent, allPermissionsGuard, anyPermissionGuard, checkScrollPagination, evaluateLogicNode, evaluatePermission, formatFileSize, getAcceptString, getFileIconClass, hasAllPermissions, hasAnyPermission, hasPermission, isFileTypeAllowed, permissionGuard, provideFallbackLocalization, provideValueAccessor, resolveTranslationModule };
2019
+ export type { ApiResponse, DeleteType, FilesResponseDto, GetFileUrlsFn, IActionNode, IActivatable, IApiService, IAuthStateProvider, IBaseEntity, IBulkMeta, IBulkResponse, ICompanyApiProvider, ICompanyBasicInfo, IDeleteData, IDropDown, IErrorResponse, IFileBasicInfo, IFileData, IFileProvider, IFileSelectFilter, IFileUploadOptions, IFilter, IFilterData, IFolderBasicInfo, IGroupNode, IListResponse, ILoggedUserInfo, ILogicNode, ILoginResponse, ILoginUserData, IMessageResponse, IMetadata, IOrderable, IPagination, IPaginationMeta, IProfileActionInfo, IProfilePermissionProvider, IProfileRoleInfo, IRefreshTokenResponse, IRequestMeta, IResolverModuleConfig, ISelectFilter, ISingleResponse, ISoftDeletable, ISort, IStorageConfigBasicInfo, ITimestampable, IUploadedFile, IUserBasicInfo, IUserBranchPayload, IUserBranchPermission, IUserCompanyPayload, IUserListAction, IUserListColumn, IUserListFilter, IUserListItem, IUserListProvider, IUserPermissionProvider, IUserProvider, IUserSelectFilter, IValidationError, LoadFilesFn, LoadUsersFn, PermissionCode, ScrollPaginationConfig, ServiceName, UploadFileFn, UploadMultipleFilesFn };