@flusys/ng-shared 3.0.1 → 4.0.0-rc

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, OnDestroy, ElementRef, TemplateRef, 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';
@@ -50,8 +51,8 @@ import * as i40 from 'primeng/colorpicker';
50
51
  import * as _flusys_ng_shared from '@flusys/ng-shared';
51
52
  import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
52
53
  import { FormValueControl } from '@angular/forms/signals';
53
- import { MessageService, ConfirmationService } from 'primeng/api';
54
54
  import * as _flusys_ng_core from '@flusys/ng-core';
55
+ import { MessageService, ConfirmationService } from 'primeng/api';
55
56
 
56
57
  declare const USER_PERMISSIONS: {
57
58
  readonly CREATE: "user.create";
@@ -153,6 +154,24 @@ declare const NOTIFICATION_PERMISSIONS: {
153
154
  readonly UPDATE: "notification.update";
154
155
  readonly DELETE: "notification.delete";
155
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
+ };
156
175
  declare const PERMISSIONS: {
157
176
  readonly USER: {
158
177
  readonly CREATE: "user.create";
@@ -254,9 +273,29 @@ declare const PERMISSIONS: {
254
273
  readonly UPDATE: "notification.update";
255
274
  readonly DELETE: "notification.delete";
256
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
+ };
257
294
  };
258
295
  type PermissionCode = (typeof PERMISSIONS)[keyof typeof PERMISSIONS][keyof (typeof PERMISSIONS)[keyof typeof PERMISSIONS]];
259
296
 
297
+ declare const SHARED_MESSAGES: Record<string, string>;
298
+
260
299
  /**
261
300
  * Base entity interface - matches backend Identity entity
262
301
  */
@@ -355,12 +394,8 @@ interface IPagination {
355
394
  pageSize: number;
356
395
  currentPage: number;
357
396
  }
358
- interface ISort {
359
- [key: string]: 'ASC' | 'DESC';
360
- }
361
- interface IFilter {
362
- [key: string]: string | number | boolean | null | undefined | string[] | number[];
363
- }
397
+ type ISort = Record<string, 'ASC' | 'DESC'>;
398
+ type IFilter = Record<string, string | number | boolean | null | undefined | string[] | number[]>;
364
399
  interface IFilterData {
365
400
  filter?: IFilter;
366
401
  pagination?: IPagination;
@@ -411,6 +446,8 @@ interface IValidationError {
411
446
  interface ISingleResponse<T> {
412
447
  success: boolean;
413
448
  message: string;
449
+ messageKey?: string;
450
+ messageParams?: Record<string, unknown>;
414
451
  data?: T;
415
452
  _meta?: IRequestMeta;
416
453
  }
@@ -420,6 +457,8 @@ interface ISingleResponse<T> {
420
457
  interface IListResponse<T> {
421
458
  success: boolean;
422
459
  message: string;
460
+ messageKey?: string;
461
+ messageParams?: Record<string, unknown>;
423
462
  data?: T[];
424
463
  meta: IPaginationMeta;
425
464
  _meta?: IRequestMeta;
@@ -430,6 +469,8 @@ interface IListResponse<T> {
430
469
  interface IBulkResponse<T> {
431
470
  success: boolean;
432
471
  message: string;
472
+ messageKey?: string;
473
+ messageParams?: Record<string, unknown>;
433
474
  data?: T[];
434
475
  meta: IBulkMeta;
435
476
  _meta?: IRequestMeta;
@@ -440,6 +481,8 @@ interface IBulkResponse<T> {
440
481
  interface IMessageResponse {
441
482
  success: boolean;
442
483
  message: string;
484
+ messageKey?: string;
485
+ messageParams?: Record<string, unknown>;
443
486
  _meta?: IRequestMeta;
444
487
  }
445
488
  /**
@@ -448,7 +491,8 @@ interface IMessageResponse {
448
491
  interface IErrorResponse {
449
492
  success: false;
450
493
  message: string;
451
- code?: string;
494
+ messageKey?: string;
495
+ messageParams?: Record<string, unknown>;
452
496
  errors?: IValidationError[];
453
497
  _meta?: IRequestMeta;
454
498
  }
@@ -510,9 +554,6 @@ interface IFileData {
510
554
  createdAt: Date;
511
555
  }
512
556
 
513
- /**
514
- * Basic file info for selectors and displays
515
- */
516
557
  interface IFileBasicInfo {
517
558
  id: string;
518
559
  name: string;
@@ -520,9 +561,23 @@ interface IFileBasicInfo {
520
561
  size: string;
521
562
  url: string | null;
522
563
  }
523
- /**
524
- * Upload options for file uploader
525
- */
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
+ }
526
581
  interface IFileUploadOptions {
527
582
  storageConfigId?: string;
528
583
  folderPath?: string;
@@ -530,42 +585,22 @@ interface IFileUploadOptions {
530
585
  maxHeight?: number;
531
586
  quality?: number;
532
587
  compress?: boolean;
588
+ isPrivate?: boolean;
533
589
  }
534
- /**
535
- * Uploaded file response
536
- */
537
- interface IUploadedFile {
538
- id?: string;
539
- name: string;
540
- key: string;
541
- size: number;
542
- contentType: string;
543
- }
544
- /**
545
- * Filter params for file selector
546
- */
547
- interface IFileSelectFilter {
590
+ interface ISelectFilter {
548
591
  page: number;
549
592
  pageSize: number;
550
593
  search: string;
594
+ }
595
+ interface IFileSelectFilter extends ISelectFilter {
551
596
  contentTypes?: string[];
552
597
  folderId?: string;
598
+ storageConfigId?: string;
553
599
  }
554
- /**
555
- * Function type for loading files
556
- */
557
600
  type LoadFilesFn = (filter: IFileSelectFilter) => Observable<IListResponse<IFileBasicInfo>>;
558
- /**
559
- * Function type for uploading a file
560
- */
561
601
  type UploadFileFn = (file: File, options?: IFileUploadOptions) => Observable<ISingleResponse<IUploadedFile>>;
562
- /**
563
- * Function type for getting file URLs (presigned URL refresh)
564
- */
602
+ type UploadMultipleFilesFn = (files: File[], options?: IFileUploadOptions) => Observable<ISingleResponse<IUploadedFile[]>>;
565
603
  type GetFileUrlsFn = (fileIds: string[]) => Observable<ISingleResponse<IFileBasicInfo[]>>;
566
- /**
567
- * Common file type filters
568
- */
569
604
  declare const FILE_TYPE_FILTERS: {
570
605
  readonly IMAGES: readonly ["image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"];
571
606
  readonly DOCUMENTS: readonly ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"];
@@ -573,21 +608,9 @@ declare const FILE_TYPE_FILTERS: {
573
608
  readonly AUDIO: readonly ["audio/mpeg", "audio/wav", "audio/ogg", "audio/webm"];
574
609
  readonly ALL: string[];
575
610
  };
576
- /**
577
- * Get accept string for file input from content types
578
- */
579
611
  declare function getAcceptString(contentTypes: string[]): string;
580
- /**
581
- * Check if file matches allowed content types
582
- */
583
612
  declare function isFileTypeAllowed(file: File, allowedTypes: string[]): boolean;
584
- /**
585
- * Get file icon class based on content type
586
- */
587
613
  declare function getFileIconClass(contentType: string): string;
588
- /**
589
- * Format file size for display
590
- */
591
614
  declare function formatFileSize(sizeInKb: string | number): string;
592
615
 
593
616
  /**
@@ -687,31 +710,6 @@ interface IProfilePermissionProvider {
687
710
  getUserRoles(userId: string, branchId?: string): Observable<ISingleResponse<IProfileRoleInfo[]>>;
688
711
  getUserActions(userId: string, branchId?: string): Observable<ISingleResponse<IProfileActionInfo[]>>;
689
712
  }
690
- /**
691
- * Uploaded file result with file manager ID
692
- */
693
- interface IProfileUploadResult {
694
- id: string;
695
- name: string;
696
- key: string;
697
- size: number;
698
- contentType: string;
699
- }
700
- /**
701
- * Profile Upload Options
702
- */
703
- interface IProfileUploadOptions {
704
- folderPath?: string;
705
- compress?: boolean;
706
- maxWidth?: number;
707
- maxHeight?: number;
708
- }
709
- /**
710
- * Profile Upload Provider Interface - Provides file upload functionality for profile pictures.
711
- */
712
- interface IProfileUploadProvider {
713
- uploadProfilePicture(file: File, options?: IProfileUploadOptions): Observable<ISingleResponse<IProfileUploadResult>>;
714
- }
715
713
  /**
716
714
  * Base user interface for list operations
717
715
  */
@@ -771,6 +769,24 @@ interface IUserListProvider<T extends IUserListItem = IUserListItem> {
771
769
  enrichListData?(users: T[]): Observable<T[]>;
772
770
  getExtraFilters?(): IUserListFilter[];
773
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
+ }
774
790
 
775
791
  declare enum ContactTypeEnum {
776
792
  PHONE = 1,
@@ -963,6 +979,35 @@ declare class PreventDefaultDirective {
963
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>;
964
980
  }
965
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
+
966
1011
  declare class AngularModule {
967
1012
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AngularModule, never>;
968
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]>;
@@ -1156,11 +1201,13 @@ declare class IconComponent {
1156
1201
  declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null> implements OnDestroy {
1157
1202
  private readonly document;
1158
1203
  private readonly appRef;
1204
+ private readonly translateAdapter;
1159
1205
  private readonly onDocumentClickBound;
1160
1206
  readonly pSelectRef: _angular_core.Signal<ElementRef<HTMLDivElement>>;
1161
1207
  readonly overlayTemplate: _angular_core.Signal<TemplateRef<unknown>>;
1162
1208
  private overlayViewRef;
1163
1209
  readonly placeHolder: _angular_core.InputSignal<string>;
1210
+ readonly displayPlaceholder: _angular_core.Signal<string>;
1164
1211
  readonly isEditMode: _angular_core.InputSignal<boolean>;
1165
1212
  readonly isLoading: _angular_core.InputSignal<boolean>;
1166
1213
  readonly total: _angular_core.InputSignal<number | undefined>;
@@ -1185,6 +1232,7 @@ declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null>
1185
1232
  selectValue(event: CheckboxChangeEvent, option: IDropDown): void;
1186
1233
  changeSelectAll(event: CheckboxChangeEvent): void;
1187
1234
  clear(event: Event): void;
1235
+ private t;
1188
1236
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LazyMultiSelectComponent, never>;
1189
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>;
1190
1238
  }
@@ -1199,11 +1247,13 @@ declare class LazyMultiSelectComponent extends BaseFormControl<string[] | null>
1199
1247
  */
1200
1248
  declare class LazySelectComponent extends BaseFormControl<string | null> {
1201
1249
  private readonly destroyRef;
1250
+ private readonly translateAdapter;
1202
1251
  private readonly onScrollBound;
1203
1252
  private scrollTargetEl;
1204
1253
  private isDestroyed;
1205
1254
  readonly scrollContainer: _angular_core.Signal<ElementRef<HTMLDivElement>>;
1206
1255
  readonly placeHolder: _angular_core.InputSignal<string>;
1256
+ readonly displayPlaceholder: _angular_core.Signal<string>;
1207
1257
  readonly optionLabel: _angular_core.InputSignal<string>;
1208
1258
  readonly optionValue: _angular_core.InputSignal<string>;
1209
1259
  readonly isEditMode: _angular_core.InputSignal<boolean>;
@@ -1220,6 +1270,7 @@ declare class LazySelectComponent extends BaseFormControl<string | null> {
1220
1270
  onScroll(event: Event): void;
1221
1271
  showPanel(): void;
1222
1272
  onBlur(): void;
1273
+ private t;
1223
1274
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LazySelectComponent, never>;
1224
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>;
1225
1276
  }
@@ -1235,6 +1286,7 @@ declare abstract class BaseUserSelectComponent {
1235
1286
  protected readonly destroyRef: DestroyRef;
1236
1287
  protected readonly injector: Injector;
1237
1288
  protected readonly userProvider: IUserProvider;
1289
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
1238
1290
  protected abortController: AbortController | null;
1239
1291
  readonly loadUsers: _angular_core.InputSignal<LoadUsersFn | undefined>;
1240
1292
  readonly placeHolder: _angular_core.InputSignal<string>;
@@ -1249,6 +1301,7 @@ declare abstract class BaseUserSelectComponent {
1249
1301
  readonly pagination: _angular_core.WritableSignal<IPagination>;
1250
1302
  readonly searchTerm: _angular_core.WritableSignal<string>;
1251
1303
  readonly dropdownUsers: _angular_core.Signal<IDropDown[]>;
1304
+ readonly displayPlaceholder: _angular_core.Signal<string>;
1252
1305
  constructor();
1253
1306
  /** Setup effect to track value changes and emit selection events */
1254
1307
  protected abstract setupValueEffect(): void;
@@ -1259,6 +1312,7 @@ declare abstract class BaseUserSelectComponent {
1259
1312
  protected fetchUsers(append?: boolean): Promise<void>;
1260
1313
  /** Load users from USER_PROVIDER with active filter */
1261
1314
  private loadUsersFromProvider;
1315
+ protected t(key: string, variables?: Record<string, string | number>): string;
1262
1316
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseUserSelectComponent, never>;
1263
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>;
1264
1318
  }
@@ -1337,11 +1391,33 @@ declare class UserMultiSelectComponent extends BaseUserSelectComponent {
1337
1391
  /**
1338
1392
  * File Uploader Component - Drag & drop file upload with type filtering.
1339
1393
  *
1340
- * 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
+ * ```
1341
1411
  */
1342
1412
  declare class FileUploaderComponent {
1343
1413
  private readonly messageService;
1344
- 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;
1345
1421
  readonly acceptTypes: _angular_core.InputSignal<string[]>;
1346
1422
  readonly multiple: _angular_core.InputSignal<boolean>;
1347
1423
  readonly maxFiles: _angular_core.InputSignal<number>;
@@ -1368,67 +1444,55 @@ declare class FileUploaderComponent {
1368
1444
  private handleFiles;
1369
1445
  removeFile(file: File): void;
1370
1446
  uploadFiles(files?: File[]): Promise<void>;
1447
+ private uploadBatch;
1448
+ private uploadSequential;
1371
1449
  getFileIcon(file: File): string;
1372
1450
  formatSize(bytes: number): string;
1451
+ private t;
1373
1452
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileUploaderComponent, never>;
1374
- 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>;
1375
1454
  }
1376
1455
 
1377
1456
  /**
1378
- * File Selector Dialog - Browse and select existing files with filtering.
1457
+ * File Selector Dialog - Self-contained file browser with upload support.
1379
1458
  *
1380
- * 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.
1381
1461
  *
1382
1462
  * Features:
1383
1463
  * - Search with debouncing
1384
- * - File type filtering
1464
+ * - File type filtering (acceptTypes)
1465
+ * - Folder filtering
1385
1466
  * - Infinite scroll pagination
1386
1467
  * - Single or multiple selection
1468
+ * - Built-in file upload (withUploader)
1387
1469
  * - File preview with icons
1388
1470
  *
1389
1471
  * @example
1390
- * ```typescript
1391
- * // In component
1392
- * readonly fileService = inject(FileManagerApiService);
1393
- *
1394
- * readonly loadFiles: LoadFilesFn = (filter) =>
1395
- * this.fileService.getAll(filter.search, {
1396
- * pagination: { currentPage: filter.page, pageSize: filter.pageSize },
1397
- * filter: { contentTypes: filter.contentTypes },
1398
- * }).pipe(
1399
- * map(res => ({
1400
- * ...res,
1401
- * data: res.data?.map(f => ({
1402
- * id: f.id,
1403
- * name: f.name,
1404
- * contentType: f.contentType,
1405
- * size: f.size,
1406
- * url: f.url
1407
- * }))
1408
- * }))
1409
- * );
1410
- * ```
1411
- *
1412
1472
  * ```html
1413
1473
  * <lib-file-selector-dialog
1414
- * [(visible)]="showFileSelector"
1415
- * [loadFiles]="loadFiles"
1474
+ * [(visible)]="showSelector"
1416
1475
  * [acceptTypes]="['image/*']"
1417
- * [multiple]="false"
1418
- * (fileSelected)="onFileSelected($event)"
1476
+ * [multiple]="true"
1477
+ * [withUploader]="true"
1478
+ * (filesSelected)="onFilesSelected($event)"
1419
1479
  * />
1420
1480
  * ```
1421
1481
  */
1422
1482
  declare class FileSelectorDialogComponent {
1423
1483
  private readonly destroyRef;
1484
+ private readonly translateAdapter;
1485
+ readonly fileProvider: _flusys_ng_shared.IFileProvider | null;
1424
1486
  private abortController;
1425
1487
  private searchDebounceTimer;
1426
- readonly loadFiles: _angular_core.InputSignal<LoadFilesFn>;
1427
- readonly header: _angular_core.InputSignal<string>;
1488
+ readonly header: _angular_core.InputSignal<string | undefined>;
1428
1489
  readonly acceptTypes: _angular_core.InputSignal<string[]>;
1429
1490
  readonly multiple: _angular_core.InputSignal<boolean>;
1491
+ readonly dialogHeader: _angular_core.Signal<string>;
1430
1492
  readonly maxSelection: _angular_core.InputSignal<number>;
1431
1493
  readonly pageSize: _angular_core.InputSignal<number>;
1494
+ readonly folderId: _angular_core.InputSignal<string | undefined>;
1495
+ readonly withUploader: _angular_core.InputSignal<boolean>;
1432
1496
  readonly visible: _angular_core.ModelSignal<boolean>;
1433
1497
  readonly fileSelected: _angular_core.OutputEmitterRef<IFileBasicInfo>;
1434
1498
  readonly filesSelected: _angular_core.OutputEmitterRef<IFileBasicInfo[]>;
@@ -1440,7 +1504,19 @@ declare class FileSelectorDialogComponent {
1440
1504
  readonly total: _angular_core.WritableSignal<number | undefined>;
1441
1505
  readonly pagination: _angular_core.WritableSignal<IPagination>;
1442
1506
  readonly searchTerm: _angular_core.WritableSignal<string>;
1443
- 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;
1444
1520
  constructor();
1445
1521
  onSearchChange(value: string): void;
1446
1522
  onScroll(event: Event): void;
@@ -1453,10 +1529,22 @@ declare class FileSelectorDialogComponent {
1453
1529
  onCancel(): void;
1454
1530
  onConfirm(): void;
1455
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;
1456
1543
  private resetState;
1457
1544
  private fetchFiles;
1545
+ private t;
1458
1546
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileSelectorDialogComponent, never>;
1459
- 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>;
1460
1548
  }
1461
1549
 
1462
1550
  /**
@@ -1512,14 +1600,6 @@ declare const AUTH_STATE_PROVIDER: InjectionToken<IAuthStateProvider>;
1512
1600
  * Use with `inject(PROFILE_PERMISSION_PROVIDER, { optional: true })`.
1513
1601
  */
1514
1602
  declare const PROFILE_PERMISSION_PROVIDER: InjectionToken<IProfilePermissionProvider>;
1515
- /**
1516
- * Profile Upload Provider Token
1517
- *
1518
- * Provides file upload functionality for profile pictures.
1519
- * Optional - if not configured or storage not enabled, upload section is hidden.
1520
- * Use with `inject(PROFILE_UPLOAD_PROVIDER, { optional: true })`.
1521
- */
1522
- declare const PROFILE_UPLOAD_PROVIDER: InjectionToken<IProfileUploadProvider>;
1523
1603
  /**
1524
1604
  * User List Provider Token
1525
1605
  *
@@ -1534,6 +1614,20 @@ declare const PROFILE_UPLOAD_PROVIDER: InjectionToken<IProfileUploadProvider>;
1534
1614
  * ]
1535
1615
  */
1536
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>;
1537
1631
 
1538
1632
  /**
1539
1633
  * Permission Guard - Single permission or ILogicNode check.
@@ -1587,8 +1681,7 @@ declare function allPermissionsGuard(permissions: string[], redirectTo?: string)
1587
1681
  * @Component({
1588
1682
  * selector: 'app-product-form',
1589
1683
  * standalone: true,
1590
- * changeDetection: ChangeDetectionStrategy.OnPush,
1591
- * template: `...`
1684
+ * * template: `...`
1592
1685
  * })
1593
1686
  * export class ProductFormComponent extends BaseFormPage<IProduct, IProductFormModel> {
1594
1687
  * private readonly productService = inject(ProductApiService);
@@ -1655,6 +1748,7 @@ declare abstract class BaseFormPage<T, TFormModel> {
1655
1748
  protected readonly route: ActivatedRoute;
1656
1749
  protected readonly messageService: MessageService;
1657
1750
  protected readonly destroyRef: DestroyRef;
1751
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
1658
1752
  protected readonly routeParams: Signal<i3.ParamMap | undefined>;
1659
1753
  protected initialized: boolean;
1660
1754
  /** Loading state for async operations */
@@ -1727,6 +1821,10 @@ declare abstract class BaseFormPage<T, TFormModel> {
1727
1821
  * @param detail The error message to display
1728
1822
  */
1729
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;
1730
1828
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseFormPage<any, any>, never>;
1731
1829
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseFormPage<any, any>, never, never, {}, {}, never, never, true, never>;
1732
1830
  }
@@ -1760,6 +1858,7 @@ declare abstract class BaseListPage<T> {
1760
1858
  protected readonly appConfig: _flusys_ng_core.IAppConfig;
1761
1859
  protected readonly confirmationService: ConfirmationService;
1762
1860
  protected readonly destroyRef: DestroyRef;
1861
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter | null;
1763
1862
  /** Items list */
1764
1863
  readonly items: _angular_core.WritableSignal<T[]>;
1765
1864
  /** Loading state */
@@ -1830,6 +1929,10 @@ declare abstract class BaseListPage<T> {
1830
1929
  * Show warning toast message
1831
1930
  */
1832
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;
1833
1936
  /**
1834
1937
  * Delete an item with confirmation dialog
1835
1938
  * @param item The item to delete
@@ -1912,5 +2015,5 @@ interface ScrollPaginationConfig {
1912
2015
  */
1913
2016
  declare function checkScrollPagination(event: Event, config: ScrollPaginationConfig): IPagination | null;
1914
2017
 
1915
- 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_TYPE_FILTERS, FOLDER_PERMISSIONS, FORM_PERMISSIONS, FileSelectorDialogComponent, FileUploaderComponent, FileUrlService, HasPermissionDirective, IconComponent, IconTypeEnum, IsEmptyImageDirective, LazyMultiSelectComponent, LazySelectComponent, NOTIFICATION_PERMISSIONS, 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 };
1916
- 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 };