@flusys/ng-storage 1.0.0-beta → 1.1.1-beta

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.
Files changed (23) hide show
  1. package/README.md +68 -1
  2. package/fesm2022/{flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs → flusys-ng-storage-file-manager-form.component-H3OZS0SW.mjs} +27 -27
  3. package/fesm2022/flusys-ng-storage-file-manager-form.component-H3OZS0SW.mjs.map +1 -0
  4. package/fesm2022/{flusys-ng-storage-file-manager-list.component-CwnyNoYb.mjs → flusys-ng-storage-file-manager-list.component-4pb6TafD.mjs} +8 -8
  5. package/fesm2022/flusys-ng-storage-file-manager-list.component-4pb6TafD.mjs.map +1 -0
  6. package/fesm2022/{flusys-ng-storage-folder-form.component-DH-KCz21.mjs → flusys-ng-storage-folder-form.component-DQ0QY7P0.mjs} +6 -6
  7. package/fesm2022/flusys-ng-storage-folder-form.component-DQ0QY7P0.mjs.map +1 -0
  8. package/fesm2022/{flusys-ng-storage-folder-list.component-iIys4NvL.mjs → flusys-ng-storage-folder-list.component-D-oMaEgl.mjs} +6 -6
  9. package/fesm2022/flusys-ng-storage-folder-list.component-D-oMaEgl.mjs.map +1 -0
  10. package/fesm2022/{flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs → flusys-ng-storage-storage-config-form.component-CjIAxfHC.mjs} +39 -6
  11. package/fesm2022/flusys-ng-storage-storage-config-form.component-CjIAxfHC.mjs.map +1 -0
  12. package/fesm2022/{flusys-ng-storage-storage-config-list.component-Bfomqyr3.mjs → flusys-ng-storage-storage-config-list.component-jHk8O9Mx.mjs} +7 -7
  13. package/fesm2022/flusys-ng-storage-storage-config-list.component-jHk8O9Mx.mjs.map +1 -0
  14. package/fesm2022/flusys-ng-storage.mjs +195 -74
  15. package/fesm2022/flusys-ng-storage.mjs.map +1 -1
  16. package/package.json +4 -4
  17. package/types/flusys-ng-storage.d.ts +77 -4
  18. package/fesm2022/flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-storage-file-manager-list.component-CwnyNoYb.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-storage-folder-form.component-DH-KCz21.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-storage-folder-list.component-iIys4NvL.mjs.map +0 -1
  22. package/fesm2022/flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-storage-storage-config-list.component-Bfomqyr3.mjs.map +0 -1
@@ -1,6 +1,7 @@
1
- import { IBaseEntity, ApiResourceService, ISingleResponse, IListResponse } from '@flusys/ng-shared';
1
+ import { IBaseEntity, IProfileUploadProvider, IProfileUploadOptions, ISingleResponse, IProfileUploadResult, ApiResourceService, IListResponse } from '@flusys/ng-shared';
2
2
  import { Observable } from 'rxjs';
3
3
  import * as i0 from '@angular/core';
4
+ import { Provider } from '@angular/core';
4
5
  import { BaseApiService } from '@flusys/ng-core';
5
6
  import { Routes } from '@angular/router';
6
7
 
@@ -116,6 +117,8 @@ interface IStorageConfig extends IBaseEntity {
116
117
  name: string;
117
118
  storage: FileLocationEnum;
118
119
  config: Record<string, any>;
120
+ isActive: boolean;
121
+ isDefault: boolean;
119
122
  companyId?: string | null;
120
123
  }
121
124
  /**
@@ -126,6 +129,8 @@ interface ICreateStorageConfigDto {
126
129
  name: string;
127
130
  storage: FileLocationEnum;
128
131
  config: Record<string, any>;
132
+ isActive?: boolean;
133
+ isDefault?: boolean;
129
134
  }
130
135
  /**
131
136
  * Update Storage Config DTO
@@ -136,6 +141,8 @@ interface IUpdateStorageConfigDto {
136
141
  name?: string;
137
142
  storage?: FileLocationEnum;
138
143
  config?: Record<string, any>;
144
+ isActive?: boolean;
145
+ isDefault?: boolean;
139
146
  }
140
147
  /**
141
148
  * AWS S3 Configuration
@@ -195,6 +202,47 @@ interface IUploadedFileInfo {
195
202
  contentType: string;
196
203
  }
197
204
 
205
+ /**
206
+ * Profile Upload Provider Adapter
207
+ *
208
+ * Implements IProfileUploadProvider interface for ng-auth profile page.
209
+ * Uses UploadService.uploadAndRegister() to upload files and register in file manager.
210
+ *
211
+ * @example
212
+ * // In app.config.ts
213
+ * providers: [
214
+ * ...provideStorageProviders(),
215
+ * ]
216
+ */
217
+ declare class ProfileUploadProviderAdapter implements IProfileUploadProvider {
218
+ private readonly uploadService;
219
+ /**
220
+ * Upload profile picture and register in file manager
221
+ * Returns file manager ID (UUID) for storing in user.profilePictureId
222
+ */
223
+ uploadProfilePicture(file: File, options?: IProfileUploadOptions): Observable<ISingleResponse<IProfileUploadResult>>;
224
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProfileUploadProviderAdapter, never>;
225
+ static ɵprov: i0.ɵɵInjectableDeclaration<ProfileUploadProviderAdapter>;
226
+ }
227
+
228
+ /**
229
+ * Provide Storage Providers
230
+ *
231
+ * Registers storage-related provider implementations.
232
+ * Call this in app.config.ts to enable storage features in other packages.
233
+ *
234
+ * @example
235
+ * // In app.config.ts
236
+ * export const appConfig: ApplicationConfig = {
237
+ * providers: [
238
+ * ...provideStorageProviders(),
239
+ * ],
240
+ * };
241
+ *
242
+ * @returns Array of providers for storage functionality
243
+ */
244
+ declare function provideStorageProviders(): Provider[];
245
+
198
246
  /**
199
247
  * File Manager API Service
200
248
  * Handles file metadata CRUD operations
@@ -222,6 +270,11 @@ declare class FileManagerApiService extends ApiResourceService<IUpdateFileManage
222
270
  * Filtered by isPrivate and user permission 'storage.file.viewPrivate'
223
271
  */
224
272
  getPrivateFiles(page?: number, limit?: number): Observable<IListResponse<IFileManager>>;
273
+ /**
274
+ * Create new file manager record
275
+ * POST /storage/file-manager/insert
276
+ */
277
+ create(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>>;
225
278
  static ɵfac: i0.ɵɵFactoryDeclaration<FileManagerApiService, never>;
226
279
  static ɵprov: i0.ɵɵInjectableDeclaration<FileManagerApiService>;
227
280
  }
@@ -262,9 +315,16 @@ declare class StorageConfigApiService extends ApiResourceService<IUpdateStorageC
262
315
  * - Image compression
263
316
  * - Multiple storage providers
264
317
  * - File validation (size, type)
318
+ * - Default storage config from environment (services.storage.defaultStorageConfigId)
265
319
  */
266
320
  declare class UploadService extends BaseApiService {
321
+ private readonly fileManagerApi;
267
322
  constructor();
323
+ /**
324
+ * Get default storage config ID from app config
325
+ * Used when no storageConfigId is provided in upload options
326
+ */
327
+ getDefaultConfigId(): string | undefined;
268
328
  /**
269
329
  * Upload single file
270
330
  * POST /storage/upload/single-file?storageConfigId=x&folderPath=y
@@ -283,6 +343,7 @@ declare class UploadService extends BaseApiService {
283
343
  uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>>;
284
344
  /**
285
345
  * Build query string from upload options
346
+ * Uses default storageConfigId from app config if not provided in options
286
347
  */
287
348
  private buildQueryParams;
288
349
  /**
@@ -290,7 +351,7 @@ declare class UploadService extends BaseApiService {
290
351
  * POST /storage/upload/delete-single-file
291
352
  *
292
353
  * @param key - File key/path to delete
293
- * @param storageConfigId - Optional storage config ID (uses default if not provided)
354
+ * @param storageConfigId - Optional storage config ID (uses default from config if not provided)
294
355
  */
295
356
  deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>>;
296
357
  /**
@@ -298,7 +359,7 @@ declare class UploadService extends BaseApiService {
298
359
  * POST /storage/upload/delete-multiple-file
299
360
  *
300
361
  * @param keys - Array of file keys/paths to delete
301
- * @param storageConfigId - Optional storage config ID (uses default if not provided)
362
+ * @param storageConfigId - Optional storage config ID (uses default from config if not provided)
302
363
  */
303
364
  deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>>;
304
365
  /**
@@ -309,6 +370,18 @@ declare class UploadService extends BaseApiService {
309
370
  * @returns URL for direct file access
310
371
  */
311
372
  getFileUrl(key: string): string;
373
+ /**
374
+ * Upload file and register in file manager
375
+ * Returns file manager ID (UUID) for storing in references like profilePictureId
376
+ *
377
+ * @param file - File to upload
378
+ * @param options - Upload options (storage config, compression, etc.)
379
+ * @returns Observable with file manager record (id is the UUID to store)
380
+ */
381
+ uploadAndRegister(file: File, options?: IUploadOptionsDto & {
382
+ isPrivate?: boolean;
383
+ folderId?: string;
384
+ }): Observable<ISingleResponse<IFileManager>>;
312
385
  static ɵfac: i0.ɵɵFactoryDeclaration<UploadService, never>;
313
386
  static ɵprov: i0.ɵɵInjectableDeclaration<UploadService>;
314
387
  }
@@ -340,5 +413,5 @@ declare class StorageContainerComponent {
340
413
  static ɵcmp: i0.ɵɵComponentDeclaration<StorageContainerComponent, "lib-storage-container", never, {}, {}, never, never, true, never>;
341
414
  }
342
415
 
343
- export { FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService };
416
+ export { FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, ProfileUploadProviderAdapter, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService, provideStorageProviders };
344
417
  export type { IAwsS3Config, IAzureBlobConfig, ICreateFileManagerDto, ICreateFolderDto, ICreateStorageConfigDto, IFileManager, IFilesResponseDto, IFolder, IGetFilesRequestDto, ILocalStorageConfig, ISftpConfig, IStorageConfig, IUpdateFileManagerDto, IUpdateFolderDto, IUpdateStorageConfigDto, IUploadOptionsDto, IUploadedFileInfo };
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs","sources":["../../../projects/ng-storage/pages/file-manager/file-manager-form.component.ts"],"sourcesContent":["import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { UploadService } from '../../services/upload.service';\n\n/** File manager form model interface */\ninterface IFileManagerFormModel {\n id: string;\n name: string;\n isPrivate: boolean;\n folderId: string;\n storageConfigId: string;\n}\n\n/**\n * File Manager Form Component\n * Upload and edit file metadata\n */\n@Component({\n selector: 'lib-file-manager-form',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">\n {{ isEditMode() ? 'Edit File' : 'Upload File' }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"Back\"\n icon=\"pi pi-arrow-left\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onCancel()\"\n />\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <!-- Storage Configuration & Folder Selection (only for new files) -->\n @if (!isEditMode()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <!-- Storage Configuration -->\n <div class=\"field\">\n <label for=\"storageConfig\" class=\"block font-medium mb-2\"\n >Storage Configuration *</label\n >\n <select\n id=\"storageConfig\"\n class=\"p-select-native\"\n [formField]=\"fileForm.storageConfigId\"\n >\n <option value=\"\">Select storage configuration...</option>\n @for (config of availableConfigs(); track config.id) {\n <option [value]=\"config.id\">\n {{ config.name }} ({{ getProviderLabel(config.storage) }})\n </option>\n }\n </select>\n @if (availableConfigs().length === 0 && !isLoadingConfigs()) {\n <small class=\"text-orange-600 block mt-2\">\n <i class=\"pi pi-exclamation-triangle mr-1\"></i>\n No storage configurations found. Please create one first.\n </small>\n }\n </div>\n\n <!-- Folder Selection -->\n <div class=\"field\">\n <label for=\"folder\" class=\"block font-medium mb-2\"\n >Folder (Optional)</label\n >\n <select\n id=\"folder\"\n class=\"p-select-native\"\n [formField]=\"fileForm.folderId\"\n >\n <option value=\"\">No folder (root level)</option>\n @for (folder of availableFolders(); track folder.id) {\n <option [value]=\"folder.id\">{{ folder.name }}</option>\n }\n </select>\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-gray-600 block mt-2\">\n <i class=\"pi pi-info-circle mr-1\"></i>\n No folders available. File will be uploaded to root level.\n </small>\n }\n </div>\n </div>\n } @else {\n <!-- Folder Selection for Edit Mode -->\n <div class=\"field mb-4\">\n <label for=\"folder\" class=\"block font-medium mb-2\"\n >Folder (Optional)</label\n >\n <select\n id=\"folder\"\n class=\"p-select-native\"\n [formField]=\"fileForm.folderId\"\n >\n <option value=\"\">No folder (root level)</option>\n @for (folder of availableFolders(); track folder.id) {\n <option [value]=\"folder.id\">{{ folder.name }}</option>\n }\n </select>\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-gray-600 block mt-2\">\n <i class=\"pi pi-info-circle mr-1\"></i>\n No folders available.\n </small>\n }\n </div>\n }\n\n <!-- File Upload (only for new files) -->\n @if (!isEditMode()) {\n <div class=\"field mb-4\">\n <label class=\"block font-medium mb-2\">Select File *</label>\n <p-fileupload\n #fileUpload\n [customUpload]=\"true\"\n (onSelect)=\"onFileSelect($event)\"\n [multiple]=\"false\"\n [maxFileSize]=\"50000000\"\n [showUploadButton]=\"false\"\n [showCancelButton]=\"false\"\n chooseLabel=\"Choose File\"\n chooseIcon=\"pi pi-upload\"\n accept=\"*/*\"\n class=\"w-full\"\n >\n <ng-template #content let-files>\n @if (files && files.length > 0) {\n <div class=\"flex flex-col gap-2\">\n @for (file of files; track file.name) {\n <div class=\"flex items-center gap-3 p-3 border rounded\">\n <i class=\"pi pi-file text-2xl\"></i>\n <div class=\"flex-1\">\n <div class=\"font-medium\">{{ file.name }}</div>\n <div class=\"text-sm text-gray-600\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <p-button\n icon=\"pi pi-times\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"fileUpload.clear()\"\n />\n </div>\n }\n </div>\n } @else {\n <div\n class=\"flex items-center justify-center flex-col p-8 border-2 border-dashed border-gray-300 rounded\"\n >\n <i\n class=\"pi pi-cloud-upload text-4xl text-gray-400 mb-3\"\n ></i>\n <p class=\"text-gray-600\">\n Drag and drop file here or click to browse\n </p>\n <p class=\"text-sm text-gray-500 mt-2\">\n Maximum file size: 50MB\n </p>\n </div>\n }\n </ng-template>\n </p-fileupload>\n @if (!selectedFile() && !isEditMode()) {\n <small class=\"text-gray-600\"\n >Please select a file to upload</small\n >\n }\n </div>\n }\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- File Name (read-only for uploads, editable for existing) -->\n <div class=\"field md:col-span-2\">\n <label for=\"name\" class=\"block font-medium mb-2\">File Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"fileForm.name\"\n [placeholder]=\"\n isEditMode()\n ? 'Enter file name'\n : 'Will be auto-filled from selected file'\n \"\n class=\"w-full\"\n />\n </div>\n\n <!-- Privacy Toggle -->\n <div class=\"field\">\n <label class=\"p-checkbox-native\">\n <input type=\"checkbox\" [formField]=\"fileForm.isPrivate\" />\n <span>Private File</span>\n </label>\n <small class=\"text-gray-600 block mt-2\">\n {{\n formModel().isPrivate\n ? 'Only users with permission can access'\n : 'File is publicly accessible'\n }}\n </small>\n </div>\n </div>\n\n <div class=\"flex gap-2 mt-4\">\n <p-button\n type=\"submit\"\n [label]=\"isEditMode() ? 'Update' : 'Upload'\"\n [icon]=\"isEditMode() ? 'pi pi-check' : 'pi pi-cloud-upload'\"\n [loading]=\"isLoading()\"\n [disabled]=\"\n !isFormValid() ||\n (!isEditMode() && !selectedFile()) ||\n isLoading()\n \"\n />\n <p-button\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"onCancel()\"\n />\n </div>\n </form>\n </div>\n `,\n})\nexport class FileManagerFormComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly fileService = inject(FileManagerApiService);\n private readonly uploadService = inject(UploadService);\n private readonly configService = inject(StorageConfigApiService);\n private readonly folderService = inject(FolderApiService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly isLoadingConfigs = signal(false);\n readonly isLoadingFolders = signal(false);\n readonly existingFile = signal<IFileManager | null>(null);\n readonly isEditMode = computed(() => !!this.existingFile());\n readonly selectedFile = signal<File | null>(null);\n readonly availableConfigs = signal<IStorageConfig[]>([]);\n readonly availableFolders = signal<IFolder[]>([]);\n\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IFileManagerFormModel>({\n id: '',\n name: '',\n isPrivate: false,\n folderId: '',\n storageConfigId: '',\n });\n\n /** Form with validation schema */\n readonly fileForm = form(this.formModel, (f) => {\n required(f.name, { message: 'File name is required' });\n // storageConfigId validation will be done manually in onSubmit\n // as it's only required for new uploads, not edits\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n ngOnInit(): void {\n const fileId = this.route.snapshot.paramMap.get('id');\n if (fileId) {\n this.loadFile(fileId);\n } else {\n // Load storage configurations for new upload\n this.loadStorageConfigs();\n }\n // Load folders for both create and edit modes\n this.loadFolders();\n }\n\n async loadStorageConfigs(): Promise<void> {\n this.isLoadingConfigs.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n if (response.success && response.data) {\n this.availableConfigs.set(response.data);\n // Auto-select first config if only one available\n if (response.data.length === 1) {\n this.formModel.update((m) => ({\n ...m,\n storageConfigId: response.data![0].id,\n }));\n }\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load storage configurations.',\n });\n } finally {\n this.isLoadingConfigs.set(false);\n }\n }\n\n async loadFolders(): Promise<void> {\n this.isLoadingFolders.set(true);\n try {\n const response = await firstValueFrom(\n this.folderService.getAll('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n if (response.success && response.data) {\n this.availableFolders.set(response.data);\n }\n } catch {\n // Silently fail - folders are optional\n } finally {\n this.isLoadingFolders.set(false);\n }\n }\n\n async loadFile(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.fileService.findByIdAsync(id);\n if (response.success && response.data) {\n const file = response.data;\n this.existingFile.set(file);\n this.formModel.set({\n id: file.id,\n name: file.name,\n isPrivate: file.isPrivate ?? false,\n folderId: file.folderId ?? '',\n storageConfigId: '',\n });\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load file.',\n });\n this.router.navigate(['/storage/files']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onFileSelect(event: any): void {\n const file = event.files?.[0] || event.currentFiles?.[0];\n if (file) {\n this.selectedFile.set(file);\n // Auto-fill file name\n this.formModel.update((m) => ({ ...m, name: file.name }));\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n if (this.isEditMode()) {\n // Update existing file metadata only\n await this.fileService.updateAsync({\n id: formValue.id,\n name: formValue.name,\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || null,\n } as any);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'File updated successfully.',\n });\n } else {\n // Upload new file\n const file = this.selectedFile();\n if (!file) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Please select a file to upload.',\n });\n return;\n }\n\n // Validate storage config selection\n if (!formValue.storageConfigId) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Please select a storage configuration.',\n });\n return;\n }\n\n // Upload file first\n const uploadResponse = await firstValueFrom(\n this.uploadService.uploadSingleFile(file, {\n compress: true,\n quality: 85,\n storageConfigId: formValue.storageConfigId,\n }),\n );\n\n if (uploadResponse.success && uploadResponse.data) {\n const uploadedFileInfo = uploadResponse.data;\n\n // Save file metadata\n await this.fileService.insertAsync({\n name: formValue.name,\n key: uploadedFileInfo.key,\n contentType: file.type || 'application/octet-stream',\n size: Math.round(file.size / 1024).toString(),\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || undefined,\n storageConfigId: formValue.storageConfigId, // ✅ Include storage config ID\n } as any);\n\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'File uploaded successfully.',\n });\n } else {\n throw new Error('Upload failed');\n }\n }\n\n this.router.navigate(['/storage/files']);\n } catch (error: any) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail:\n error?.message ||\n `Failed to ${this.isEditMode() ? 'update' : 'upload'} file.`,\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/storage/files']);\n }\n\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n }\n\n getProviderLabel(storage: string): string {\n const labels: Record<string, string> = {\n AWS: 'AWS S3',\n AZURE: 'Azure Blob',\n SFTP: 'SFTP',\n LOCAL: 'Local',\n };\n return labels[storage] || storage;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-list.component-CwnyNoYb.mjs","sources":["../../../projects/ng-storage/pages/file-manager/file-manager-list.component.ts"],"sourcesContent":["import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\n\n/**\n * File Manager List Component\n * Displays all files with company filter (if enabled)\n * Shows current company name in header\n */\n@Component({\n selector: 'lib-file-manager-list',\n standalone: true,\n imports: [AngularModule, PrimeModule],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">File Manager</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"Upload File\"\n icon=\"pi pi-upload\"\n (onClick)=\"onUpload()\"\n />\n </div>\n\n <p-table\n [value]=\"files()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Size</th>\n <th>Location</th>\n <th>Config</th>\n <th>Private</th>\n <th>Created</th>\n <th>Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-file>\n <tr>\n <td>\n <i [class]=\"getFileIcon(file.contentType)\" class=\"mr-2\"></i>\n {{ file.name }}\n </td>\n <td>{{ file.contentType }}</td>\n <td>{{ file.size }} KB</td>\n <td>\n <p-tag [value]=\"getLocationLabel(file.location)\" [severity]=\"getLocationSeverity(file.location)\" />\n </td>\n <td>{{ file.providerName || '-' }}</td>\n <td>\n @if (file.isPrivate) {\n <p-tag value=\"Private\" severity=\"warn\" />\n } @else {\n <p-tag value=\"Public\" severity=\"success\" />\n }\n </td>\n <td>{{ file.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-eye\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [loading]=\"isViewLoading() === file.id\"\n [disabled]=\"isViewLoading() === file.id\"\n (onClick)=\"onView(file)\"\n pTooltip=\"View file\"\n tooltipPosition=\"top\"\n />\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(file.id)\"\n pTooltip=\"Edit file metadata\"\n tooltipPosition=\"top\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"warn\"\n size=\"small\"\n (onClick)=\"onSoftDelete(file)\"\n pTooltip=\"Move to trash (recoverable)\"\n tooltipPosition=\"top\"\n />\n <p-button\n icon=\"pi pi-times-circle\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onPermanentDelete(file)\"\n pTooltip=\"Delete permanently (cannot be recovered)\"\n tooltipPosition=\"top\"\n />\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"8\" class=\"text-center py-4\">\n @if (showCompanyInfo()) {\n No files found in current company\n } @else {\n No files found\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n `,\n})\nexport class FileManagerListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly fileService = inject(FileManagerApiService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Loading state for file viewing */\n readonly isViewLoading = signal<string | null>(null);\n\n /** Files list */\n readonly files = signal<IFileManager[]>([]);\n\n /** Total records for pagination */\n readonly totalRecords = signal(0);\n\n /** Page size */\n readonly pageSize = signal(50);\n\n /** Current page */\n readonly currentPage = signal(1);\n\n /** Show company info if company feature enabled */\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n\n /** Current company name */\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n ngOnInit(): void {\n this.loadFiles();\n }\n\n async loadFiles(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.fileService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1, // ApiResourceService uses 0-based pages\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.files.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load files.',\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadFiles();\n }\n\n onUpload(): void {\n this.router.navigate(['/storage/files/new']);\n }\n\n onEdit(fileId: string): void {\n this.router.navigate(['/storage/files', fileId]);\n }\n\n async onView(file: IFileManager): Promise<void> {\n this.isViewLoading.set(file.id);\n try {\n const response = await firstValueFrom(\n this.fileService.getFiles([file.id]),\n );\n\n let files: any[] = [];\n\n if (response && typeof response === 'object') {\n if (\n 'success' in response &&\n response.success &&\n Array.isArray(response.data)\n ) {\n files = response.data;\n } else if (Array.isArray(response)) {\n files = response as any;\n }\n }\n\n if (files.length > 0) {\n const fileUrl = files[0].url;\n\n if (!fileUrl) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'File URL is not available.',\n });\n return;\n }\n\n window.open(fileUrl, '_blank');\n } else {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to retrieve file URL.',\n });\n }\n } catch {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to get file URL.',\n });\n } finally {\n this.isViewLoading.set(null);\n }\n }\n\n /**\n * Soft delete - Move file to trash (recommended)\n * File can be recovered later\n */\n onSoftDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: `Move \"${file.name}\" to trash? You can recover it later.`,\n header: 'Move to Trash',\n icon: 'pi pi-trash',\n acceptLabel: 'Move to Trash',\n acceptButtonStyleClass: 'p-button-warning',\n accept: async () => {\n try {\n await this.fileService.deleteAsync({ id: file.id, type: 'delete' });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'File moved to trash successfully.',\n });\n this.loadFiles();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to move file to trash.',\n });\n }\n },\n });\n }\n\n /**\n * Permanent delete - Cannot be recovered\n * Also deletes the actual file from storage\n */\n onPermanentDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: `Permanently delete \"${file.name}\"? This action CANNOT be undone and will delete the file from storage.`,\n header: 'Permanent Delete',\n icon: 'pi pi-exclamation-triangle',\n acceptLabel: 'Delete Permanently',\n rejectLabel: 'Cancel',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.fileService.deleteAsync({\n id: file.id,\n type: 'permanent',\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'File permanently deleted.',\n });\n this.loadFiles();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to permanently delete file.',\n });\n }\n },\n });\n }\n\n getFileIcon(contentType: string): string {\n if (contentType.startsWith('image/')) return 'pi pi-image';\n if (contentType.startsWith('video/')) return 'pi pi-video';\n if (contentType.startsWith('audio/')) return 'pi pi-volume-up';\n if (contentType.includes('pdf')) return 'pi pi-file-pdf';\n if (contentType.includes('word') || contentType.includes('document'))\n return 'pi pi-file-word';\n if (contentType.includes('excel') || contentType.includes('spreadsheet'))\n return 'pi pi-file-excel';\n return 'pi pi-file';\n }\n\n getLocationLabel(location: string): string {\n const labels: Record<string, string> = {\n local: 'Local',\n aws: 'AWS S3',\n azure: 'Azure',\n sftp: 'SFTP',\n };\n return labels[location] ?? location;\n }\n\n getLocationSeverity(location: string): 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast' {\n const severities: Record<string, 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast'> = {\n local: 'secondary',\n aws: 'warn',\n azure: 'info',\n sftp: 'contrast',\n };\n return severities[location] ?? 'secondary';\n }\n}\n"],"names":["i2","i3"],"mappings":";;;;;;;;;;;;;;;AAUA;;;;AAIG;MA0HU,wBAAwB,CAAA;AAClB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC3C,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AAC9B,IAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAGlD,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;;AAGzB,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,yDAAC;;AAG3C,IAAA,KAAK,GAAG,MAAM,CAAiB,EAAE,iDAAC;;AAGlC,IAAA,YAAY,GAAG,MAAM,CAAC,CAAC,wDAAC;;AAGxB,IAAA,QAAQ,GAAG,MAAM,CAAC,EAAE,oDAAC;;AAGrB,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,uDAAC;;AAGvB,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC1C;;AAGQ,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,EAAE,IAAI,IAAI,gBAAgB,8DACzE;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE;AAC1B,gBAAA,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;AACnC,oBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,iBAAA;AACD,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA,CAAC,CACH;AAED,YAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;gBACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AACnC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;YAClD;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,MAAM,EAAE,uBAAuB;AAChC,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC9C;AAEA,IAAA,MAAM,CAAC,MAAc,EAAA;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAClD;IAEA,MAAM,MAAM,CAAC,IAAkB,EAAA;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACrC;YAED,IAAI,KAAK,GAAU,EAAE;AAErB,YAAA,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;gBAC5C,IACE,SAAS,IAAI,QAAQ;AACrB,oBAAA,QAAQ,CAAC,OAAO;oBAChB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC5B;AACA,oBAAA,KAAK,GAAG,QAAQ,CAAC,IAAI;gBACvB;AAAO,qBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBAClC,KAAK,GAAG,QAAe;gBACzB;YACF;AAEA,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;gBAE5B,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,MAAM,EAAE,4BAA4B;AACrC,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;YAChC;iBAAO;AACL,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,OAAO,EAAE,OAAO;AAChB,oBAAA,MAAM,EAAE,8BAA8B;AACvC,iBAAA,CAAC;YACJ;QACF;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,MAAM,EAAE,yBAAyB;AAClC,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B;IACF;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAkB,EAAA;AAC7B,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,EAAE,CAAA,MAAA,EAAS,IAAI,CAAC,IAAI,CAAA,qCAAA,CAAuC;AAClE,YAAA,MAAM,EAAE,eAAe;AACvB,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,WAAW,EAAE,eAAe;AAC5B,YAAA,sBAAsB,EAAE,kBAAkB;YAC1C,MAAM,EAAE,YAAW;AACjB,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnE,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,OAAO,EAAE,SAAS;AAClB,wBAAA,MAAM,EAAE,mCAAmC;AAC5C,qBAAA,CAAC;oBACF,IAAI,CAAC,SAAS,EAAE;gBAClB;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,MAAM,EAAE,+BAA+B;AACxC,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,iBAAiB,CAAC,IAAkB,EAAA;AAClC,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,EAAE,CAAA,oBAAA,EAAuB,IAAI,CAAC,IAAI,CAAA,sEAAA,CAAwE;AACjH,YAAA,MAAM,EAAE,kBAAkB;AAC1B,YAAA,IAAI,EAAE,4BAA4B;AAClC,YAAA,WAAW,EAAE,oBAAoB;AACjC,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,sBAAsB,EAAE,iBAAiB;YACzC,MAAM,EAAE,YAAW;AACjB,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;wBACjC,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,wBAAA,IAAI,EAAE,WAAW;AAClB,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,OAAO,EAAE,SAAS;AAClB,wBAAA,MAAM,EAAE,2BAA2B;AACpC,qBAAA,CAAC;oBACF,IAAI,CAAC,SAAS,EAAE;gBAClB;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,MAAM,EAAE,oCAAoC;AAC7C,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,WAAmB,EAAA;AAC7B,QAAA,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,aAAa;AAC1D,QAAA,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,aAAa;AAC1D,QAAA,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,iBAAiB;AAC9D,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,gBAAgB;AACxD,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;AAClE,YAAA,OAAO,iBAAiB;AAC1B,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC;AACtE,YAAA,OAAO,kBAAkB;AAC3B,QAAA,OAAO,YAAY;IACrB;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,MAAM,MAAM,GAA2B;AACrC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,MAAM;SACb;AACD,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ;IACrC;AAEA,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAClC,QAAA,MAAM,UAAU,GAAsF;AACpG,YAAA,KAAK,EAAE,WAAW;AAClB,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,IAAI,EAAE,UAAU;SACjB;AACD,QAAA,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,WAAW;IAC5C;uGAxOW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArHzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmHT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApHS,aAAa,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FAsHzB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAzHpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;AACrC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmHT,EAAA,CAAA;AACF,iBAAA;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-folder-form.component-DH-KCz21.mjs","sources":["../../../projects/ng-storage/pages/folder/folder-form.component.ts"],"sourcesContent":["import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\n\n/** Folder form model interface */\ninterface IFolderFormModel {\n id: string;\n name: string;\n}\n\n/**\n * Folder Form Component\n * Create and edit folders\n */\n@Component({\n selector: 'lib-folder-form',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">\n {{ isEditMode() ? 'Edit Folder' : 'New Folder' }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"Back\"\n icon=\"pi pi-arrow-left\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onCancel()\"\n />\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <div class=\"grid grid-cols-1 gap-4\">\n <!-- Name -->\n <div class=\"field\">\n <label for=\"name\" class=\"block font-medium mb-2\"\n >Folder Name *</label\n >\n <input\n pInputText\n id=\"name\"\n [formField]=\"folderForm.name\"\n placeholder=\"Enter folder name\"\n class=\"w-full\"\n />\n </div>\n </div>\n\n <div class=\"flex gap-2 mt-4\">\n <p-button\n type=\"submit\"\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n icon=\"pi pi-check\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n <p-button\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"onCancel()\"\n />\n </div>\n </form>\n </div>\n `,\n})\nexport class FolderFormComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly folderService = inject(FolderApiService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly existingFolder = signal<IFolder | null>(null);\n readonly isEditMode = computed(() => !!this.existingFolder());\n\n /** Show company info if company feature enabled */\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n\n /** Current company name */\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IFolderFormModel>({\n id: '',\n name: '',\n });\n\n /** Form with validation schema */\n readonly folderForm = form(this.formModel, (f) => {\n required(f.name, { message: 'Folder name is required' });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n ngOnInit(): void {\n const folderId = this.route.snapshot.paramMap.get('id');\n if (folderId) {\n this.loadFolder(folderId);\n }\n }\n\n async loadFolder(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.folderService.findByIdAsync(id);\n if (response.success && response.data) {\n const folder = response.data;\n this.existingFolder.set(folder);\n this.formModel.set({\n id: folder.id,\n name: folder.name,\n });\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load folder.',\n });\n this.router.navigate(['/storage/folders']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n if (this.isEditMode()) {\n await this.folderService.updateAsync({\n id: formValue.id,\n name: formValue.name,\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Folder updated successfully.',\n });\n } else {\n await this.folderService.insertAsync({\n name: formValue.name,\n } as any);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Folder created successfully.',\n });\n }\n\n this.router.navigate(['/storage/folders']);\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: `Failed to ${this.isEditMode() ? 'update' : 'create'} folder.`,\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/storage/folders']);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-folder-list.component-iIys4NvL.mjs","sources":["../../../projects/ng-storage/pages/folder/folder-list.component.ts"],"sourcesContent":["import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\n\n/**\n * Folder List Component\n * Displays all folders with company filter (if enabled)\n * Shows current company name in header\n */\n@Component({\n selector: 'lib-folder-list',\n standalone: true,\n imports: [AngularModule, PrimeModule],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Folder Setup</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button label=\"New Folder\" icon=\"pi pi-plus\" (onClick)=\"onCreate()\" />\n </div>\n\n <p-table\n [value]=\"folders()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Slug</th>\n <th>Created</th>\n <th>Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-folder>\n <tr>\n <td>\n <i class=\"pi pi-folder mr-2\"></i>\n {{ folder.name }}\n </td>\n <td>{{ folder.slug }}</td>\n <td>{{ folder.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(folder.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(folder)\"\n />\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center py-4\">\n @if (showCompanyInfo()) {\n No folders found in current company\n } @else {\n No folders found\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n `,\n})\nexport class FolderListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly folderService = inject(FolderApiService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Folders list */\n readonly folders = signal<IFolder[]>([]);\n\n /** Total records for pagination */\n readonly totalRecords = signal(0);\n\n /** Page size */\n readonly pageSize = signal(50);\n\n /** Current page */\n readonly currentPage = signal(1);\n\n /** Show company info if company feature enabled */\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n\n /** Current company name */\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n ngOnInit(): void {\n this.loadFolders();\n }\n\n async loadFolders(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.folderService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1, // ApiResourceService uses 0-based pages\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.folders.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load folders.',\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadFolders();\n }\n\n onCreate(): void {\n this.router.navigate(['/storage/folders/new']);\n }\n\n onEdit(folderId: string): void {\n this.router.navigate(['/storage/folders', folderId]);\n }\n\n onDelete(folder: IFolder): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${folder.name}\"?`,\n header: 'Delete Folder',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.folderService.deleteAsync({\n id: folder.id,\n type: 'delete',\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Folder deleted successfully.',\n });\n this.loadFolders();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete folder.',\n });\n }\n },\n });\n }\n}\n"],"names":["i1","i2","i3"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs","sources":["../../../projects/ng-storage/pages/storage-config/storage-config-form.component.ts"],"sourcesContent":["import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { MessageService } from 'primeng/api';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { FileLocationEnum } from '../../enums/file-location.enum';\n\n/** Storage config form model interface */\ninterface IStorageConfigFormModel {\n id: string;\n name: string;\n storage: FileLocationEnum;\n // AWS S3\n awsRegion: string;\n awsBucket: string;\n awsAccessKeyId: string;\n awsSecretAccessKey: string;\n awsEndpoint: string;\n // Azure Blob\n azureAccountName: string;\n azureAccountKey: string;\n azureContainerName: string;\n // SFTP\n sftpHost: string;\n sftpPort: string;\n sftpUsername: string;\n sftpPassword: string;\n sftpBasePath: string;\n // Local\n localBasePath: string;\n}\n\n/**\n * Storage Config Form Component\n * Create and edit storage configurations\n */\n@Component({\n selector: 'lib-storage-config-form',\n standalone: true,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">\n {{ isEditMode() ? 'Edit Storage Configuration' : 'New Storage Configuration' }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"Back\"\n icon=\"pi pi-arrow-left\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onCancel()\" />\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- Name -->\n <div class=\"field md:col-span-2\">\n <label for=\"name\" class=\"block font-medium mb-2\">Configuration Name *</label>\n <input\n pInputText\n id=\"name\"\n [formField]=\"configForm.name\"\n placeholder=\"e.g., Production AWS S3\"\n class=\"w-full\" />\n </div>\n\n <!-- Storage Provider -->\n <div class=\"field md:col-span-2\">\n <label for=\"storage\" class=\"block font-medium mb-2\">Storage Provider *</label>\n <select\n id=\"storage\"\n class=\"p-select-native\"\n [formField]=\"configForm.storage\">\n @for (provider of storageProviders; track provider.value) {\n <option [value]=\"provider.value\">{{ provider.label }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- AWS S3 Fields -->\n @if (selectedProvider() === fileLocationEnum.AWS) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4\">\n <div class=\"field\">\n <label for=\"awsRegion\" class=\"block font-medium mb-2\">AWS Region *</label>\n <input pInputText id=\"awsRegion\" [formField]=\"configForm.awsRegion\" placeholder=\"us-east-1\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"awsBucket\" class=\"block font-medium mb-2\">Bucket Name *</label>\n <input pInputText id=\"awsBucket\" [formField]=\"configForm.awsBucket\" placeholder=\"my-bucket\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"awsAccessKeyId\" class=\"block font-medium mb-2\">Access Key ID *</label>\n <input pInputText id=\"awsAccessKeyId\" [formField]=\"configForm.awsAccessKeyId\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"awsSecretAccessKey\" class=\"block font-medium mb-2\">Secret Access Key *</label>\n <input type=\"password\" pInputText id=\"awsSecretAccessKey\" [formField]=\"configForm.awsSecretAccessKey\" class=\"w-full\" />\n </div>\n <div class=\"field md:col-span-2\">\n <label for=\"awsEndpoint\" class=\"block font-medium mb-2\">Custom Endpoint (Optional)</label>\n <input pInputText id=\"awsEndpoint\" [formField]=\"configForm.awsEndpoint\" placeholder=\"https://s3.custom-endpoint.com\" class=\"w-full\" />\n </div>\n </div>\n }\n\n <!-- Azure Blob Fields -->\n @if (selectedProvider() === fileLocationEnum.AZURE) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4\">\n <div class=\"field\">\n <label for=\"azureAccountName\" class=\"block font-medium mb-2\">Account Name *</label>\n <input pInputText id=\"azureAccountName\" [formField]=\"configForm.azureAccountName\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"azureContainerName\" class=\"block font-medium mb-2\">Container Name *</label>\n <input pInputText id=\"azureContainerName\" [formField]=\"configForm.azureContainerName\" class=\"w-full\" />\n </div>\n <div class=\"field md:col-span-2\">\n <label for=\"azureAccountKey\" class=\"block font-medium mb-2\">Account Key *</label>\n <input type=\"password\" pInputText id=\"azureAccountKey\" [formField]=\"configForm.azureAccountKey\" class=\"w-full\" />\n </div>\n </div>\n }\n\n <!-- SFTP Fields -->\n @if (selectedProvider() === fileLocationEnum.SFTP) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4\">\n <div class=\"field\">\n <label for=\"sftpHost\" class=\"block font-medium mb-2\">Host *</label>\n <input pInputText id=\"sftpHost\" [formField]=\"configForm.sftpHost\" placeholder=\"sftp.example.com\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"sftpPort\" class=\"block font-medium mb-2\">Port *</label>\n <input type=\"number\" pInputText id=\"sftpPort\" [formField]=\"configForm.sftpPort\" placeholder=\"22\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"sftpUsername\" class=\"block font-medium mb-2\">Username *</label>\n <input pInputText id=\"sftpUsername\" [formField]=\"configForm.sftpUsername\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"sftpPassword\" class=\"block font-medium mb-2\">Password *</label>\n <input type=\"password\" pInputText id=\"sftpPassword\" [formField]=\"configForm.sftpPassword\" class=\"w-full\" />\n </div>\n <div class=\"field md:col-span-2\">\n <label for=\"sftpBasePath\" class=\"block font-medium mb-2\">Base Path *</label>\n <input pInputText id=\"sftpBasePath\" [formField]=\"configForm.sftpBasePath\" placeholder=\"/uploads\" class=\"w-full\" />\n </div>\n </div>\n }\n\n <!-- Local Fields -->\n @if (selectedProvider() === fileLocationEnum.LOCAL) {\n <div class=\"grid grid-cols-1 gap-4 mt-4\">\n <div class=\"field\">\n <label for=\"localBasePath\" class=\"block font-medium mb-2\">Base Path *</label>\n <input pInputText id=\"localBasePath\" [formField]=\"configForm.localBasePath\" placeholder=\"/var/www/uploads\" class=\"w-full\" />\n </div>\n </div>\n }\n\n <div class=\"flex gap-2 mt-4\">\n <p-button\n type=\"submit\"\n [label]=\"isEditMode() ? 'Update' : 'Create'\"\n icon=\"pi pi-check\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\" />\n <p-button\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"onCancel()\" />\n </div>\n </form>\n </div>\n `,\n})\nexport class StorageConfigFormComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly messageService = inject(MessageService);\n private readonly configService = inject(StorageConfigApiService);\n private readonly appConfig = inject(APP_CONFIG);\n\n readonly fileLocationEnum = FileLocationEnum;\n readonly isLoading = signal(false);\n readonly existingConfig = signal<IStorageConfig | null>(null);\n readonly isEditMode = computed(() => !!this.existingConfig());\n\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(() => 'Current Company');\n\n readonly storageProviders = [\n { label: 'AWS S3', value: FileLocationEnum.AWS },\n { label: 'Azure Blob Storage', value: FileLocationEnum.AZURE },\n { label: 'SFTP', value: FileLocationEnum.SFTP },\n { label: 'Local Storage', value: FileLocationEnum.LOCAL },\n ];\n\n // ============================================\n // Form (Signal Forms)\n // ============================================\n\n /** Form model */\n readonly formModel = signal<IStorageConfigFormModel>({\n id: '',\n name: '',\n storage: FileLocationEnum.AWS,\n // AWS S3\n awsRegion: '',\n awsBucket: '',\n awsAccessKeyId: '',\n awsSecretAccessKey: '',\n awsEndpoint: '',\n // Azure\n azureAccountName: '',\n azureAccountKey: '',\n azureContainerName: '',\n // SFTP\n sftpHost: '',\n sftpPort: '22',\n sftpUsername: '',\n sftpPassword: '',\n sftpBasePath: '',\n // Local\n localBasePath: '',\n });\n\n /** Form with validation schema */\n readonly configForm = form(this.formModel, (f) => {\n required(f.name, { message: 'Configuration name is required' });\n });\n\n /** Selected provider */\n readonly selectedProvider = computed(() => this.formModel().storage);\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n ngOnInit(): void {\n const configId = this.route.snapshot.paramMap.get('id');\n if (configId) {\n this.loadConfig(configId);\n }\n }\n\n async loadConfig(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.configService.findByIdAsync(id);\n if (response.success && response.data) {\n const config = response.data;\n this.existingConfig.set(config);\n\n // Base form values\n const formData: Partial<IStorageConfigFormModel> = {\n id: config.id,\n name: config.name,\n storage: config.storage,\n };\n\n // Load provider-specific config\n if (config.storage === FileLocationEnum.AWS && config.config) {\n formData.awsRegion = config.config['region'] || '';\n formData.awsBucket = config.config['bucket'] || '';\n formData.awsAccessKeyId = config.config['accessKeyId'] || '';\n formData.awsSecretAccessKey = config.config['secretAccessKey'] || '';\n formData.awsEndpoint = config.config['endpoint'] || '';\n } else if (config.storage === FileLocationEnum.AZURE && config.config) {\n formData.azureAccountName = config.config['accountName'] || '';\n formData.azureAccountKey = config.config['accountKey'] || '';\n formData.azureContainerName = config.config['containerName'] || '';\n } else if (config.storage === FileLocationEnum.SFTP && config.config) {\n formData.sftpHost = config.config['host'] || '';\n formData.sftpPort = (config.config['port'] || 22).toString();\n formData.sftpUsername = config.config['username'] || '';\n formData.sftpPassword = config.config['password'] || '';\n formData.sftpBasePath = config.config['basePath'] || '';\n } else if (config.storage === FileLocationEnum.LOCAL && config.config) {\n formData.localBasePath = config.config['basePath'] || '';\n }\n\n this.formModel.update((m) => ({ ...m, ...formData }));\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load storage configuration.',\n });\n this.router.navigate(['/storage/configs']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n let config: Record<string, any> = {};\n\n // Build provider-specific config\n if (formValue.storage === FileLocationEnum.AWS) {\n config = {\n region: formValue.awsRegion,\n bucket: formValue.awsBucket,\n accessKeyId: formValue.awsAccessKeyId,\n secretAccessKey: formValue.awsSecretAccessKey,\n ...(formValue.awsEndpoint && { endpoint: formValue.awsEndpoint }),\n };\n } else if (formValue.storage === FileLocationEnum.AZURE) {\n config = {\n accountName: formValue.azureAccountName,\n accountKey: formValue.azureAccountKey,\n containerName: formValue.azureContainerName,\n };\n } else if (formValue.storage === FileLocationEnum.SFTP) {\n config = {\n host: formValue.sftpHost,\n port: formValue.sftpPort ? parseInt(formValue.sftpPort, 10) : 22,\n username: formValue.sftpUsername,\n password: formValue.sftpPassword,\n basePath: formValue.sftpBasePath,\n };\n } else if (formValue.storage === FileLocationEnum.LOCAL) {\n config = {\n basePath: formValue.localBasePath,\n };\n }\n\n if (this.isEditMode()) {\n await this.configService.updateAsync({\n id: formValue.id,\n name: formValue.name,\n storage: formValue.storage,\n config,\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Storage configuration updated successfully.',\n });\n } else {\n await this.configService.insertAsync({\n name: formValue.name,\n storage: formValue.storage,\n config,\n } as any);\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Storage configuration created successfully.',\n });\n }\n\n this.router.navigate(['/storage/configs']);\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: `Failed to ${this.isEditMode() ? 'update' : 'create'} storage configuration.`,\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.router.navigate(['/storage/configs']);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-storage-config-list.component-Bfomqyr3.mjs","sources":["../../../projects/ng-storage/pages/storage-config/storage-config-list.component.ts"],"sourcesContent":["import { Component, computed, inject, OnInit, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { firstValueFrom } from 'rxjs';\nimport { FileLocationEnum } from '../../enums/file-location.enum';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\n\n/**\n * Storage Config List Component\n * Displays all storage configurations with company filter (if enabled)\n * Shows current company name in header\n */\n@Component({\n selector: 'lib-storage-config-list',\n standalone: true,\n imports: [AngularModule, PrimeModule],\n template: `\n <div class=\"card\">\n <div class=\"flex justify-between items-center mb-4\">\n <div>\n <h3 class=\"text-xl font-semibold\">Storage Configurations</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-gray-600 mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button\n label=\"New Configuration\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n />\n </div>\n\n <p-table\n [value]=\"configs()\"\n [loading]=\"isLoading()\"\n [paginator]=\"true\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th>Provider</th>\n <th>Created</th>\n <th>Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-config>\n <tr>\n <td>\n <i [class]=\"getProviderIcon(config.storage)\" class=\"mr-2\"></i>\n {{ config.name }}\n </td>\n <td>\n <p-tag\n [value]=\"getProviderLabel(config.storage)\"\n [severity]=\"getProviderSeverity(config.storage)\"\n />\n </td>\n <td>{{ config.createdAt | date: 'short' }}</td>\n <td>\n <p-button\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(config.id)\"\n />\n <p-button\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDelete(config)\"\n />\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center py-4\">\n @if (showCompanyInfo()) {\n No storage configurations found in current company\n } @else {\n No storage configurations found\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n `,\n})\nexport class StorageConfigListComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly configService = inject(StorageConfigApiService);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n /** Loading state */\n readonly isLoading = signal(false);\n\n /** Configs list */\n readonly configs = signal<IStorageConfig[]>([]);\n\n /** Total records for pagination */\n readonly totalRecords = signal(0);\n\n /** Page size */\n readonly pageSize = signal(50);\n\n /** Current page */\n readonly currentPage = signal(1);\n\n /** Show company info if company feature enabled */\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n\n /** Current company name */\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n ngOnInit(): void {\n this.loadConfigs();\n }\n\n async loadConfigs(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', {\n pagination: {\n currentPage: this.currentPage() - 1,\n pageSize: this.pageSize(),\n },\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.configs.set(response.data ?? []);\n this.totalRecords.set(response.meta?.total ?? 0);\n }\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to load storage configurations.',\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onPageChange(event: any): void {\n this.currentPage.set(event.first / event.rows + 1);\n this.pageSize.set(event.rows);\n this.loadConfigs();\n }\n\n onCreate(): void {\n this.router.navigate(['/storage/configs/new']);\n }\n\n onEdit(configId: string): void {\n this.router.navigate(['/storage/configs', configId]);\n }\n\n onDelete(config: IStorageConfig): void {\n this.confirmationService.confirm({\n message: `Are you sure you want to delete \"${config.name}\"?`,\n header: 'Delete Configuration',\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.configService.deleteAsync({\n id: config.id,\n type: 'delete',\n });\n this.messageService.add({\n severity: 'success',\n summary: 'Success',\n detail: 'Storage configuration deleted successfully.',\n });\n this.loadConfigs();\n } catch (error) {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to delete storage configuration.',\n });\n }\n },\n });\n }\n\n getProviderIcon(storage: FileLocationEnum): string {\n switch (storage) {\n case FileLocationEnum.AWS:\n return 'pi pi-cloud';\n case FileLocationEnum.AZURE:\n return 'pi pi-cloud';\n case FileLocationEnum.SFTP:\n return 'pi pi-server';\n case FileLocationEnum.LOCAL:\n return 'pi pi-folder';\n default:\n return 'pi pi-database';\n }\n }\n\n getProviderLabel(storage: FileLocationEnum): string {\n switch (storage) {\n case FileLocationEnum.AWS:\n return 'AWS S3';\n case FileLocationEnum.AZURE:\n return 'Azure Blob';\n case FileLocationEnum.SFTP:\n return 'SFTP';\n case FileLocationEnum.LOCAL:\n return 'Local';\n default:\n return storage;\n }\n }\n\n getProviderSeverity(\n storage: FileLocationEnum,\n ): 'success' | 'secondary' | 'info' | 'warn' | 'danger' | 'contrast' {\n switch (storage) {\n case FileLocationEnum.AWS:\n return 'warn';\n case FileLocationEnum.AZURE:\n return 'info';\n case FileLocationEnum.SFTP:\n return 'secondary';\n case FileLocationEnum.LOCAL:\n return 'success';\n default:\n return 'secondary';\n }\n }\n}\n"],"names":["i2","i3","i4"],"mappings":";;;;;;;;;;;;;;AAWA;;;;AAIG;MAuFU,0BAA0B,CAAA;AACpB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,aAAa,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC/C,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AAC9B,IAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAGlD,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;;AAGzB,IAAA,OAAO,GAAG,MAAM,CAAmB,EAAE,mDAAC;;AAGtC,IAAA,YAAY,GAAG,MAAM,CAAC,CAAC,wDAAC;;AAGxB,IAAA,QAAQ,GAAG,MAAM,CAAC,EAAE,oDAAC;;AAGrB,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,uDAAC;;AAGvB,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC1C;;AAGQ,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,EAAE,IAAI,IAAI,gBAAgB,8DACzE;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE;AAC5B,gBAAA,UAAU,EAAE;AACV,oBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;AACnC,oBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,iBAAA;AACD,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA,CAAC,CACH;AAED,YAAA,IAAI,QAAQ,CAAC,OAAO,EAAE;gBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;YAClD;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,MAAM,EAAE,wCAAwC;AACjD,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAChD;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACtD;AAEA,IAAA,QAAQ,CAAC,MAAsB,EAAA;AAC7B,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,EAAE,CAAA,iCAAA,EAAoC,MAAM,CAAC,IAAI,CAAA,EAAA,CAAI;AAC5D,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,IAAI,EAAE,4BAA4B;AAClC,YAAA,sBAAsB,EAAE,iBAAiB;YACzC,MAAM,EAAE,YAAW;AACjB,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;wBACnC,EAAE,EAAE,MAAM,CAAC,EAAE;AACb,wBAAA,IAAI,EAAE,QAAQ;AACf,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,OAAO,EAAE,SAAS;AAClB,wBAAA,MAAM,EAAE,6CAA6C;AACtD,qBAAA,CAAC;oBACF,IAAI,CAAC,WAAW,EAAE;gBACpB;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,OAAO;AACjB,wBAAA,OAAO,EAAE,OAAO;AAChB,wBAAA,MAAM,EAAE,yCAAyC;AAClD,qBAAA,CAAC;gBACJ;YACF,CAAC;AACF,SAAA,CAAC;IACJ;AAEA,IAAA,eAAe,CAAC,OAAyB,EAAA;QACvC,QAAQ,OAAO;YACb,KAAK,gBAAgB,CAAC,GAAG;AACvB,gBAAA,OAAO,aAAa;YACtB,KAAK,gBAAgB,CAAC,KAAK;AACzB,gBAAA,OAAO,aAAa;YACtB,KAAK,gBAAgB,CAAC,IAAI;AACxB,gBAAA,OAAO,cAAc;YACvB,KAAK,gBAAgB,CAAC,KAAK;AACzB,gBAAA,OAAO,cAAc;AACvB,YAAA;AACE,gBAAA,OAAO,gBAAgB;;IAE7B;AAEA,IAAA,gBAAgB,CAAC,OAAyB,EAAA;QACxC,QAAQ,OAAO;YACb,KAAK,gBAAgB,CAAC,GAAG;AACvB,gBAAA,OAAO,QAAQ;YACjB,KAAK,gBAAgB,CAAC,KAAK;AACzB,gBAAA,OAAO,YAAY;YACrB,KAAK,gBAAgB,CAAC,IAAI;AACxB,gBAAA,OAAO,MAAM;YACf,KAAK,gBAAgB,CAAC,KAAK;AACzB,gBAAA,OAAO,OAAO;AAChB,YAAA;AACE,gBAAA,OAAO,OAAO;;IAEpB;AAEA,IAAA,mBAAmB,CACjB,OAAyB,EAAA;QAEzB,QAAQ,OAAO;YACb,KAAK,gBAAgB,CAAC,GAAG;AACvB,gBAAA,OAAO,MAAM;YACf,KAAK,gBAAgB,CAAC,KAAK;AACzB,gBAAA,OAAO,MAAM;YACf,KAAK,gBAAgB,CAAC,IAAI;AACxB,gBAAA,OAAO,WAAW;YACpB,KAAK,gBAAgB,CAAC,KAAK;AACzB,gBAAA,OAAO,SAAS;AAClB,YAAA;AACE,gBAAA,OAAO,WAAW;;IAExB;uGA3JW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlF3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjFS,aAAa,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FAmFzB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAtFtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;AACrC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFT,EAAA,CAAA;AACF,iBAAA;;;;;"}